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类,更加简单。
推荐阅读
-
mybatis 的 dao 接口跟 xml 文件里面的 sql 是如何建立关系的?一步步解析
-
一个用于MyBatis的辅助页面,自动生成实体,mapper,impl,dao,注册spring,mybatis的小玩意
-
JAVA WEB快速入门之从编写一个基于SpringBoot+Mybatis快速创建的REST API项目了解SpringBoot、SpringMVC REST API、Mybatis等相关知识
-
MyBatis开发Dao的原始Dao开发和Mapper动态代理开发
-
MyBatis在DAO层定义接口返回类型泛型无效的解决
-
Mybatis学习总结(二)---dao层开发
-
MyBatis与Spring的整合(传统的DAO方式和Mapper接口方式)
-
关于Mybatis扫描所有mapper包并生成dao实例不需要显示注入SqlSessionFactory的原因探查
-
Mybatis 在dao中获取分页的总记录数
-
Mybatis框架三:DAO层开发、Mapper动态代理开发