当前位置: 移动技术网 > IT编程>开发语言>Java > MyBatis学习教程之开发Dao的方法教程

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

2019年07月22日  | 移动技术网IT编程  | 我要评论

gsp上岗证,台湾军事实力,机智城堡

简介

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

总结

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

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网