MyBatis学习教程之开发Dao的方法教程
简介
使用mybatis开发dao,通常有两个方法,即原始dao开发方法和mapper接口开发方法。下面话不多说,来一起看看详细的介绍:
主要概念介绍:
mybatis中进行dao开发时候有几个重要的类,它们是sqlsessionfactorybuilder、sqlsessionfactory、sqlsession。
sqlsession中封装了对数据库的操作,如:查询、插入、更新、删除等。通过sqlsessionfactory创建sqlsession,而sqlsessionfactory是通过sqlsessionfactorybuilder进行创建。
1、sqlsessionfactorybuilder
sqlsessionfactorybuilder用于创建sqlsessionfacoty,sqlsessionfacoty一旦创建完成就不需要sqlsessionfactorybuilder了,因为sqlsession是通过sqlsessionfactory生产,所以可以将sqlsessionfactorybuilder当成一个工具类使用,最佳使用范围是方法范围即方法体内局部变量。
2、sqlsessionfactory
sqlsessionfactory是一个接口,接口中定义了opensession的不同重载方法,sqlsessionfactory的最佳使用范围是整个应用运行期间,一旦创建后可以重复使用,通常以单例模式管理sqlsessionfactory。
3、sqlsession
sqlsession是一个面向用户的接口, sqlsession中定义了数据库操作,默认使用defaultsqlsession实现类。
sqlsession中提供了很多操作数据库的方法:如:selectone(返回单个对象)、selectlist(返回单个或多个对象),sqlsession是线程不安全的,在sqlsesion实现类中除了有接口中的方法(操作数据库的方法)还有数据域属性,sqlsession最佳应用场合在方法体内,定义成局部变量使用,绝对不能将sqlsession实例的引用放在一个类的静态字段或实例字段中。
打开一个 sqlsession;使用完毕就要关闭它。通常把这个关闭操作放到 finally 块中以确保每次都能执行关闭。
如下:
sqlsession session = sqlsessionfactory.opensession(); try { // do work } finally { session.close(); }
原始dao开发方式
原始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"> <mapper namespace="user"> <!-- 根据id获取用户信息 --> <select id="finduserbyid" parametertype="int" resulttype="user"> select * from user where id = #{id} </select> <!-- 根据username模糊查询用户信息 --> <select id="finduserbyname" parametertype="java.lang.string" resulttype="com.luchao.mybatis.first.po.user"> select * from user where username like '%${value}%' </select> <!-- 添加用户信息 --> <insert id="insertuser" parametertype="com.luchao.mybatis.first.po.user"> <selectkey keyproperty="id" order="after" resulttype="java.lang.integer"> select last_insert_id() </selectkey> insert into user(username,birthday,sex,address) value (#{username},#{birthday},#{sex},#{address}); </insert> <!-- 根据id删除用户信息 --> <delete id="deleteuser" parametertype="int"> delete from user where id=#{id} </delete> <!-- 修改用户信息 --> <update id="updateuser" parametertype="com.luchao.mybatis.first.po.user"> update user set username=#{username},birthday=#{birthday},sex=#{sex},address=#{address} where id=#{id} </update> </mapper>
2、dao接口
public interface userdao { //根据id查询用户信息 public user finduserbyid(int id) throws exception; //添加用户信息 public void insertuser(user user) throws exception; //删除用户信息 public void deleteuser(int id) throws exception; }
3、dao接口实现类
public class userdaoimpl implements userdao{ // 需要向dao实现类中注入sqlsessionfactory // 这里通过构造方法注入 private sqlsessionfactory sqlsessionfactory; public userdaoimpl(sqlsessionfactory sqlsessionfactory) { super(); this.sqlsessionfactory = sqlsessionfactory; } @override public void deleteuser(int id) throws exception { sqlsession sqlsession = sqlsessionfactory.opensession(); //执行删除操作 sqlsession.insert("user.deleteuser", id); // 提交事务 sqlsession.commit(); // 释放资源 sqlsession.close(); } @override public user finduserbyid(int id) throws exception { sqlsession sqlsession = sqlsessionfactory.opensession();//获取sqlsession user user = sqlsession.selectone("user.finduserbyid", id); sqlsession.close();//关闭资源 return user; } @override public void insertuser(user user) throws exception { sqlsession sqlsession = sqlsessionfactory.opensession(); //执行插入操作 sqlsession.insert("user.insertuser", user); // 提交事务 sqlsession.commit(); // 释放资源 sqlsession.close(); } }
4、测试代码:
public class mybatis_dao_test { private sqlsessionfactory sqlsessionfactory; @before public void init() throws ioexception{ //创建sqlsessionfactory //mybatis配置文件 string resource = "sqlmapconfig.xml"; //得到配置文件流 inputstream inputstream = resources.getresourceasstream(resource); //创建会话工厂,传入mybatis的配置信息 sqlsessionfactory = new sqlsessionfactorybuilder().build(inputstream); } @test public void testfinduserbyid() throws exception{ //创建userdao对象 userdao userdao = new userdaoimpl(sqlsessionfactory); //调用userdao的方法,根据id查找user user user = userdao.finduserbyid(10); //打印客户信息 system.out.println(user); } }
5、原始dao方法总结:
(1)、dao接口实现类方法中存在大量模板方法,如:通过sqlsessionfactory创建sqlsession,调用sqlsession的数据库操作方法。
(2)、调用sqlsession的数据库操作方法需要指定statement的id,这里存在硬编码。
(3)、调用sqlsession方法时传入的变量,由于sqlsession方法使用泛型,即使变量类型传入错误,在编译阶段也不报错,不利于程序员开发。
mapper动态代理方式
1、实现原理
mapper接口开发方法只需要程序员编写mapper接口(相当于dao接口),由mybatis框架根据接口定义创建接口的动态代理对象,代理对象的方法体同上边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的类型相同。
2、mapper.xml(映射文件)
映射文件与原始dao开发的映射文件相似,只需要将namespace定于为mapper接口全路径。
<?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.luchao.mybatis.first.mapper.usermapper"> <!-- 根据id获取用户信息 --> <select id="finduserbyid" parametertype="int" resulttype="user"> select * from user where id = #{id} </select> <!-- 根据username模糊查询用户信息 --> <select id="finduserbyname" parametertype="java.lang.string" resulttype="com.luchao.mybatis.first.po.user"> select * from user where username like '%${value}%' </select> <!-- 添加用户信息 --> <insert id="insertuser" parametertype="com.luchao.mybatis.first.po.user"> <selectkey keyproperty="id" order="after" resulttype="java.lang.integer"> select last_insert_id() </selectkey> insert into user(username,birthday,sex,address) value (#{username},#{birthday},#{sex},#{address}); </insert> <!-- 根据id删除用户信息 --> <delete id="deleteuser" parametertype="int"> delete from user where id=#{id} </delete> <!-- 修改用户信息 --> <update id="updateuser" parametertype="com.luchao.mybatis.first.po.user"> update user set username=#{username},birthday=#{birthday},sex=#{sex},address=#{address} where id=#{id} </update> </mapper>
3、mapper.java(接口文件)
public interface usermapper { //根据id查询用户信息 public user finduserbyid(int id) throws exception; //添加用户信息 public void insertuser(user user) throws exception; //删除用户信息 public void deleteuser(int id) throws exception; //更新用户信息 public void updateuser(user user) throws exception; //根据用户名模糊查找 public list<user> finduserbyname(string user) throws exception; }
接口定义有如下特点:
(1)、 mapper接口方法名和mapper.xml中定义的statement的id相同。
(2)、 mapper接口方法的输入参数类型和mapper.xml中定义的statement的parametertype的类型相同。
(3)、 mapper接口方法的输出参数类型和mapper.xml中定义的statement的resulttype的类型相同。
4、加载usermapper.xml文件
在sqlmapconfig.xml文件中加载usermapper.xml,如下:
<mappers> <mapper resource="mapper/usermapper.xml"/> </mappers>
5、测试代码:
public class mybatis_mapper_test { private sqlsessionfactory sqlsessionfactory; @before public void init() throws ioexception{ //创建sqlsessionfactory //mybatis配置文件 string resource = "sqlmapconfig.xml"; //得到配置文件流 inputstream inputstream = resources.getresourceasstream(resource); //创建会话工厂,传入mybatis的配置信息 sqlsessionfactory = new sqlsessionfactorybuilder().build(inputstream); } @test public void testfinduserbyid() throws exception{ //获取sqlsession对象 sqlsession sqlsession = sqlsessionfactory.opensession(); //创建usermapper对象,mybatis自动生成mapper代理 usermapper usermapper = sqlsession.getmapper(usermapper.class); //调用usermapper的方法 user user = usermapper.finduserbyid(10); //关闭资源 sqlsession.close(); //打印客户信息 system.out.println(user); } }
5、mapper动态代理总结:
(1)、动态代理对象调用sqlsession.selectone()
和sqlsession.selectlist()
是根据mapper接口方法的返回值决定,如果返回list则调用selectlist方法,如果返回单个对象则调用selectone方法。
(2)、使用mapper代理方法时,输入参数可以使用pojo包装对象或map对象,保证dao的通用性。在系统中,dao层的代码是被业务层公用的。即使mapper接口只有一个参数,可以使用包装类型的pojo满足不同的业务方法的需求。
注意:持久层方法的参数可以包装类型、map等,service方法中建议不要使用包装类型(不利于业务层的可扩展)。
mybatis开发dao的方法有两种:原始dao开发和mapper动态代理开发,这两种各有优点。原始dao开发:程序员要写dao和dao实现,需要些较多的代码,但是比较好理解。mapper动态代理:程序员只需要写mapper接口,然后按照规范进行配置,mybatis就会自动实现类似dao实现,减少模板方法。mybatis官方推荐使用mapper代理方法开发mapper接口,程序员不用编写mapper接口实现类,使用mapper代理方法时,输入参数可以使用pojo包装对象或map对象,保证dao的通用性。
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对的支持。
推荐阅读
-
MyBatis学习教程之开发Dao的方法教程
-
android开发教程之ubuntu使用adb连接小米2的步骤和adb调试方法
-
android开发教程之android的handler使用方法
-
android开发教程之获取power_profile.xml文件的方法(android运行时能耗值)
-
android开发教程之系统资源的使用方法 android资源文件
-
es7学习教程之fetch解决异步嵌套问题的方法示例
-
android开发教程之判断是手机还是平板的方法
-
ES6学习教程之Map的常用方法总结
-
从零开始学习Node.js系列教程之设置HTTP头的方法示例
-
iOS开发教程之APP内部切换语言的实现方法