MyBatis开发Dao的原始Dao开发和Mapper动态代理开发
目录
@
使用mybatis开发dao,通常有两个方法,即原始dao开发方法和mapper动态代理开发方法。原始dao开发中存在以下问题:
dao方法体存在重复代码:通过sqlsessionfactory创建sqlsession,调用sqlsession的数据库操作方法
调用sqlsession的数据库操作方法需要指定statement的id,这里存在硬编码,不得于开发维护。
而动态代理开发中mapper接口开发方法只需要程序员编写mapper接口(相当于dao接口),由
mybatis框架根据接口定义创建接口的动态代理对象,代理对象的方法体同上边dao接口实现类方法。
使用mapper代理的方法来开发dao时,程序员只需要干两件事即可:
1、编写mapper.xml映射文件
2、编写mapper接口(相当于dao接口)
mapper接口开发需要遵循以下四个规范(建议初学者结合下图理解):
1、mapper.xml文件中的namespace与mapper接口的类路径相同。
2、mapper接口方法名和mapper.xml中定义的每个statement的id相同
3、mapper接口方法的输入参数类型和mapper.xml中定义的每个sql 的parametertype的类型相同
4、mapper接口方法的输出参数类型和mapper.xml中定义的每个sql的resulttype的类型相同
咳咳...初学者看文字(mapper接口开发四个规范)属实有点费劲,博主我就废了点劲做了如下图,方便理解:
原始dao开发方式
原始dao开发方法需要程序员编写dao接口和dao实现类。
1. 编写映射文件
编写映射文件如下:(也可以使用入门程序完成的映射文件)
<?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"> <!-- namespace:命名空间,用于隔离sql,还有一个很重要的作用,后面会讲 --> <mapper namespace="test"> <!-- 根据id查询用户 --> <select id="queryuserbyid" parametertype="int" resulttype="com.gx.mybatis.pojo.user"> select * from user where id = #{id} </select> <!-- 根据username模糊查询用户 --> <select id="queryuserbyusername" parametertype="string" resulttype="com.gx.mybatis.pojo.user"> select * from user where username like '%${value}%' </select> <!-- 保存用户 --> <insert id="saveuser" parametertype="com.gx.mybatis.pojo.user"> <selectkey keyproperty="id" keycolumn="id" order="after" resulttype="int"> select last_insert_id() </selectkey> insert into user(username,birthday,sex,address) values(#{username},#{birthday},#{sex},#{address}) </insert> </mapper>
### 2. 编写dao接口
先进行dao的接口开发,编码如下:
public interface userdao { /** * 根据id查询用户 * * @param id * @return */ user queryuserbyid(int id); /** * 根据用户名模糊查询用户 * * @param username * @return */ list<user> queryuserbyusername(string username); /** * 保存用户 * * @param user */ void saveuser(user user); }
3.编写dao实现类
编写的dao实现类如下
public class userdaoimpl implements userdao { private sqlsessionfactory sqlsessionfactory; public userdaoimpl(sqlsessionfactory sqlsessionfactory) { super(); this.sqlsessionfactory = sqlsessionfactory; } @override public user queryuserbyid(int id) { // 创建sqlsession sqlsession sqlsession = this.sqlsessionfactory.opensession(); // 执行查询逻辑 user user = sqlsession.selectone("queryuserbyid", id); // 释放资源 sqlsession.close(); return user; } @override public list<user> queryuserbyusername(string username) { // 创建sqlsession sqlsession sqlsession = this.sqlsessionfactory.opensession(); // 执行查询逻辑 list<user> list = sqlsession.selectlist("queryuserbyusername", username); // 释放资源 sqlsession.close(); return list; } @override public void saveuser(user user) { // 创建sqlsession sqlsession sqlsession = this.sqlsessionfactory.opensession(); // 执行保存逻辑 sqlsession.insert("saveuser", user); // 提交事务 sqlsession.commit(); // 释放资源 sqlsession.close(); } }
4.编写dao测试
创建一个junit的测试类,对userdao进行测试(充当main方法),测试代码如下:
public class userdaotest { private sqlsessionfactory sqlsessionfactory; @before public void init() throws exception { // 创建sqlsessionfactorybuilder sqlsessionfactorybuilder sqlsessionfactorybuilder = new sqlsessionfactorybuilder(); // 加载sqlmapconfig.xml配置文件 inputstream inputstream = resources.getresourceasstream("sqlmapconfig.xml"); // 创建sqlsessionfactory this.sqlsessionfactory = sqlsessionfactorybuilder.build(inputstream); } @test public void testqueryuserbyid() { // 创建dao userdao userdao = new userdaoimpl(this.sqlsessionfactory); // 执行查询 user user = userdao.queryuserbyid(1); system.out.println(user); } @test public void testqueryuserbyusername() { // 创建dao userdao userdao = new userdaoimpl(this.sqlsessionfactory); // 执行查询 list<user> list = userdao.queryuserbyusername("五"); for (user user : list) { system.out.println(user); } } @test public void testsaveuser() { // 创建dao userdao userdao = new userdaoimpl(this.sqlsessionfactory); // 创建保存对象 user user = new user(); user.setusername("孙尚香肠"); user.setbirthday(new date()); user.setsex("1"); user.setaddress("蜀国"); // 执行保存 userdao.saveuser(user); system.out.println(user); } }
mapper动态代理方式
1.定义mapper.xml(映射文件)
定义mapper映射文件usermapper.xml
将usermapper.xml放在config下mapper目录下,效果如下:
2、编写usermapper.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"> <!-- namespace:命名空间,用于隔离sql --> <!-- 还有一个很重要的作用,使用动态代理开发dao,1. namespace必须和mapper接口类路径一致 --> <mapper namespace="com.gx.mybatis.mapper.usermapper"> <!-- 根据用户id查询用户 --> <!-- 2. id必须和mapper接口方法名一致 --> <!-- 3. parametertype必须和接口方法参数类型一致 --> <!-- 4. resulttype必须和接口方法返回值类型一致 --> <select id="queryuserbyid" parametertype="int" resulttype="com.gx.mybatis.pojo.user"> select * from user where id = #{id} </select> <!-- 根据用户名查询用户 --> <select id="queryuserbyusername" parametertype="string" resulttype="com.gx.mybatis.pojo.user"> select * from user where username like '%${value}%' </select> <!-- 保存用户 --> <insert id="saveuser" parametertype="com.gx.mybatis.pojo.user"> <selectkey keyproperty="id" keycolumn="id" order="after" resulttype="int"> select last_insert_id() </selectkey> insert into user(username,birthday,sex,address) values (#{username},#{birthday},#{sex},#{address}); </insert> </mapper>
3.编写usermapper(接口文件)
创建usermapper接口代码如下:
public interface usermapper { /** * 根据id查询 * * @param id * @return */ user queryuserbyid(int id); /** * 根据用户名查询用户 * * @param username * @return */ list<user> queryuserbyusername(string username); /** * 保存用户 * * @param user */ void saveuser(user user); }
4.加载usermapper.xml文件
修改sqlmapconfig.xml文件,添加以下所示的内容:
<!-- 加载映射文件 --> <mappers> <mapper resource="sqlmap/user.xml" /> <mapper resource="mapper/usermapper.xml" /> </mappers>
5.编写测试
编写的测试方法如下:
public class usermappertest { private sqlsessionfactory sqlsessionfactory; @before public void init() throws exception { // 创建sqlsessionfactorybuilder sqlsessionfactorybuilder sqlsessionfactorybuilder = new sqlsessionfactorybuilder(); // 加载sqlmapconfig.xml配置文件 inputstream inputstream = resources.getresourceasstream("sqlmapconfig.xml"); // 创建sqlsessionfactory this.sqlsessionfactory = sqlsessionfactorybuilder.build(inputstream); } @test public void testqueryuserbyid() { // 获取sqlsession,和spring整合后由spring管理 sqlsession sqlsession = this.sqlsessionfactory.opensession(); // 从sqlsession中获取mapper接口的代理对象 usermapper usermapper = sqlsession.getmapper(usermapper.class); // 执行查询方法 user user = usermapper.queryuserbyid(1); system.out.println(user); // 和spring整合后由spring管理 sqlsession.close(); } @test public void testqueryuserbyusername() { // 获取sqlsession,和spring整合后由spring管理 sqlsession sqlsession = this.sqlsessionfactory.opensession(); // 从sqlsession中获取mapper接口的代理对象 usermapper usermapper = sqlsession.getmapper(usermapper.class); // 执行查询方法 list<user> list = usermapper.queryuserbyusername("五"); for (user user : list) { system.out.println(user); } // 和spring整合后由spring管理 sqlsession.close(); } @test public void testsaveuser() { // 获取sqlsession,和spring整合后由spring管理 sqlsession sqlsession = this.sqlsessionfactory.opensession(); // 从sqlsession中获取mapper接口的代理对象 usermapper usermapper = sqlsession.getmapper(usermapper.class); // 创建保存对象 user user = new user(); user.setusername("刘备胎"); user.setbirthday(new date()); user.setsex("2"); user.setaddress("鼠国"); // 执行查询方法 usermapper.saveuser(user); system.out.println(user); // 和spring整合后由spring管理 sqlsession.commit(); sqlsession.close(); } }
如果本文对你有一点点帮助,那么请点个赞呗,谢谢~
最后,若有不足或者不正之处,欢迎指正批评,感激不尽!如果有疑问欢迎留言,绝对第一时间回复!
欢迎各位关注我的公众号,一起探讨技术,向往技术,追求技术,说好了来了就是盆友喔...
推荐阅读
-
MyBatis开发Dao的原始Dao开发和Mapper动态代理开发
-
Mybatis框架三:DAO层开发、Mapper动态代理开发
-
JAVAEE——Mybatis第一天:入门、jdbc存在的问题、架构介绍、入门程序、Dao的开发方法、接口的动态代理方式、SqlMapConfig.xml文件说
-
使用mybatis开发原始Dao层
-
mybatis(四)开发dao方法 开发原始dao方法 mapper代理开发方法
-
Mybatis传统DAO层开发和SqlMapConfig.xml配制文件
-
mybatis开发原始dao
-
MyBatis【三】Mapper动态代理开发
-
MyBatis开发Dao的原始Dao开发和Mapper动态代理开发
-
JAVAEE——Mybatis第一天:入门、jdbc存在的问题、架构介绍、入门程序、Dao的开发方法、接口的动态代理方式、SqlMapConfig.xml文件说