欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

MyBatis学习教程之开发Dao的方法教程

程序员文章站 2023-11-21 08:50:34
简介 使用mybatis开发dao,通常有两个方法,即原始dao开发方法和mapper接口开发方法。下面话不多说,来一起看看详细的介绍: 主要概念介绍: myba...

简介

使用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的通用性。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对的支持。