MyBatis Dao层的编写
2020-01-05 16:02:29来源:博客园 阅读 ()
MyBatis Dao层的编写
传统的dao层编写
以前编写dao层,先新建一个包com.chy.dao,再写接口StudentDao:
public interface StudentDao { public void insertStudent(Student student); public void updateStudent(Student student, Integer id); public Student selectStudent(Integer id); }
接着写实现类StudentDaoImpl:
public class StudentDaoImpl implements StudentDao { @Override public void insertStudent(Student student) { } @Override public void updateStudent(Student student, Integer id) { } @Override public Student selectStudent(Integer id) { return null; } }
MyBatis的dao层编写
MyBatis不这样编写dao。MyBatis的dao由2部分组成:映射文件、映射文件对应的接口。
新建一个包com.chy.mapper,包下新建接口StudentMapper:
public interface StudentMapper { public void insertStudent(Student student); public Student selectStudent(Integer id); }
包下新建此接口对应的映射文件StudentMapper.xml:
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.chy.mapper.StudentMapper"> <insert id="insertStudent" parameterType="com.chy.pojo.Student"> INSERT INTO student_tb(name,age,score)VALUES (#{name},#{age},#{score}) </insert> <select id="queryById" parameterType="Integer" resultType="Student"> SELECT * FROM student_tb WHERE id=#{id} </select> </mapper>
- 映射文件的文件名、namespace要与接口名相同,面向接口编程。
- id要与接口中的方法名相同
- 参数类型、返回值类型要与接口中的一致
- 接口中的方法最多只能有一个参数,因为映射文件的参数类型最多只能有一个
mapper包相当于传统方式的dao包,映射文件相当于接口的实现类。
MyBatis dao层的使用
在mybatis全局配置文件中引入映射文件。
InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml"); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); SqlSession sqlSession=sqlSessionFactory.openSession(); //通过mapper来调用接口中的方法,操作数据库 //参数是mapper接口类的class对象 StudentMapper mapper = sqlSession.getMapper(StudentMapper.class); //插入 Student student1 = new Student(); student1.setName("chy"); mapper.insertStudent(student1); //查询 Student student2 = mapper.queryById(1); System.out.println(student2); sqlSession.commit(); sqlSession.close();
传入包装类型的参数
有时候我们需要传入多个参数,比如
- 查询age>20、score>90的学生,需要传入2个Integer型的参数
- 查询某本书在这一周的销量,需要传入一个pojo类:Book,还需要传入一个参数表示这一周以内。
- 要查询某用户购买某辆汽车的订单信息,需要传入2个pojo类:User、Car
这种传入多个参数的情况在复杂的条件查询中比较常见,尤其是多表查询。
mybatis最多只能传入一个参数,怎么办?
可以把要传入的参数包装一下,放在一个包装类中,传入包装类即可。
新建包com.chy.vo,包下新建包装类UserQueryVO,将要传入的参数写为成员变量,并提供getter、setter方法:
public class UserQueryVO { private User user; private Car car; public User getUser() { return user; } public void setUser(User user) { this.user = user; } public Car getCar() { return car; } public void setCar(Car car) { this.car = car; } }
vo:value object 值对象
po:persist object 持久化对象,与数据表对应。
pojo:plain ordinary java object 简单的Java对象
在com.chy.mapper包下新建UserMapper接口,编写对应的映射文件实现数据库操作。
public interface UserMapper { public Order queryOrder(UserQueryVO vo); }
<mapper namespace="com.chy.mapper.UserMapper"> <select id="queryOrder" parameterType="com.chy.vo.UserQueryVO" resultType="com.chy.pojo.Order"> SELECT * FROM order_tb WHERE order_tb.user_id=#{user.id} AND order_tb.car_name=#{car.name} </select> </mapper>
#{}中的user、car是vo的属性,这2个属性本身也是对象,可通过.来访问user、car的属性。
使用:
InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml"); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); SqlSession sqlSession=sqlSessionFactory.openSession(); Car car = new Car(); car.setName("宝马X6"); User user = new User(); user.setId(1); //要传入的包装类 UserQueryVO vo = new UserQueryVO(); vo.setCar(car); vo.setUser(user); UserMapper mapper = sqlSession.getMapper(UserMapper.class); //传入包装类进行查询 Order order = mapper.queryOrder(vo); System.out.println(order);
使用Map传入多个参数
除了可以使用包装类传入多个参数,也可以使用Map传入多个参数。
Mapper接口:
public interface UserMapper { public Order queryOrder(Map<String,Object> map); }
这个是Mapper接口,所以参数通常写接口,不写具体的实现类,让耦合是接口层次的。
要传入的参数的数据类型不同,写成Object。
映射文件:
<mapper namespace="com.chy.mapper.UserMapper"> <select id="queryOrder" parameterType="HashMap" resultType="com.chy.pojo.Order"> SELECT * FROM order_tb WHERE order_tb.user_id=#{user.id} AND order_tb.car_name=#{car.name} </select> </mapper>
#{}中的user、car是map的key,得到对应的value(对象),再通过.获取属性值。
使用:
InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml"); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); SqlSession sqlSession=sqlSessionFactory.openSession(); Car car = new Car(); car.setName("宝马X6"); User user = new User(); user.setId(1); //要传入的包装类 HashMap<String,Object> map = new HashMap<>(); map.put("car", car); map.put("user", user); UserMapper mapper = sqlSession.getMapper(UserMapper.class); //传入map进行查询 Order order = mapper.queryOrder(map); System.out.println(order);
与使用包装类传入多个参数相比,使用map不需要创建vo类,更加简单。
原文链接:https://www.cnblogs.com/chy18883701161/p/12152695.html
如有疑问请与原作者联系
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
- MyBatis中的$和#,用不好,准备走人! 2020-06-11
- SpringBoot 2.3 整合最新版 ShardingJdbc + Druid + MyBatis 2020-06-11
- 天哪!手动编写mybatis雏形竟然这么简单 2020-06-06
- MyBatis整合双数据源 2020-06-04
- MyBatis缓存特性详解 2020-06-03
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash