Mybatis Mapper代理的开发方式

今日长缨在手,何时缚住苍龙。这篇文章主要讲述Mybatis Mapper代理的开发方式相关的知识,希望能为你提供帮助。
1.Mapper代理的开发方式       
使用Mybatis开发Dao,通常有两个方法,即原始Dao开发方法和Mapper接口开发方法。mybatis在进行dao开发的时候,涉及到三姐妹,分别是SqlSessionFactoryBuilder、SqlSessionFactroy、SqlSession。
小伙伴们都知道,SqlSession中封装了对数据库的操作,如:增删改查,通过SqlSessionFactory创建SqlSession,而SqlSessionFactory是通过SqlSessionFactoryBuilder进行创建的
 
a、SqlSessionFactoryBuilder
SqlSessionFactoryBuilder用于创建SqlSessionFacoty,SqlSessionFacoty一旦创建完成就不需要SqlSessionFactoryBuilder了,因为SqlSession是通过SqlSessionFactory生产,所以可以将SqlSessionFactoryBuilder当成一个工具类使用,最佳使用范围是方法范围即方法体内局部变量。
b、SqlSessionFactory
SqlSessionFactory是一个接口,接口中定义了openSession的不同重载方法,SqlSessionFactory的最佳使用范围是整个应用运行期间,一旦创建后可以重复使用,通常以单例模式管理SqlSessionFactory。
c、SqlSession
SqlSession是一个面向用户的接口, sqlSession中定义了数据库操作,默认使用DefaultSqlSession实现类。
 
SqlSession中提供了很多操作数据库的方法:如:selectOne(返回单个对象)、selectList(返回单个或多个对象),SqlSession是线程不安全的,在SqlSesion实现类中除了有接口中的方法(操作数据库的方法)还有数据域属性,SqlSession最佳应用场合在方法体内,定义成局部变量使用,绝对不能将SqlSession实例的引用放在一个类的静态字段或实例字段中。今天的博文中,小编将着重介绍小伙伴们介绍mybatis中开发dao的两种方法,原始dao的开发方式和mapper代理开发。
    mybatis  中  dao  的开发方法,分别是原始  dao  的开发和  mapper  代理开发,原始Dao开发和Mapper动态代理开发,这两种各有优点。原始Dao开发:程序员要写Dao和Dao实现,需要些较多的代码,但是比较好理解。Mapper动态代理:程序员只需要写Mapper接口,然后按照规范进行配置,MyBatis就会自动实现类似Dao实现,减少模板方法。mybatis官方推荐使用mapper代理方法开发mapper接口,程序员不用编写mapper接口实现类,使用mapper代理方法时,输入参数可以使用pojo包装对象或map对象,保证dao的通用性。
      这里主要介绍mapping代理开发模式
 
  2.Mybatis开发过程 
1、编写mybatis的配置文件SqlMapConfig.xml
2、编写mybatis的映射文件mapper.xml
                这里主要是定义了statement和sql语句
3、编程通过配置文件创建SqlSessionFactory
4、通过SqlSessionFactory获取SqlSession
5、通过SqlSession操作数据库
                如果执行添加、更新、删除需要调用SqlSession.commit()
6、SqlSesion使用完成要关闭
 
 
 
3.Mapper代理的开发规范
 
1、  mapper接口的全限定名要和mapper映射文件的namespace值一致。
UserMapper.xml
 
 
[java]  view plain  copy 

Mybatis Mapper代理的开发方式

文章图片
Mybatis Mapper代理的开发方式

文章图片
  1. < ?xmlversion="1.0"encoding="UTF-8"?>    
  2. < !DOCTYPEmapper   
  3. PUBLIC"-//mybatis.org//DTDMapper  3.0//EN"   
  4. "http://mybatis.org/dtd/mybatis-3-mapper.dtd">    
  5. < !--namespace命名空间,为了对sql语句进行隔离,方便管理,mapper开发dao方式,使用namespace有特殊作用   
  6. mapper代理开发时将namespace指定为mapper接口的全限定名   
  7.   -->    
  8. < mapper  namespace="cn.itcast.mybatis.mapper.UserMapper">    
 
此步骤目的:通过mapper.xml和mapper.Java进行关联。
 
2、 UserMapper.xml中statement的id就是mapper.java中的方法名
3、  mapper接口的方法参数类型要和mapper映射文件的statement的parameterType的值一致。
4、  mapper接口的方法返回值类型要和mapper映射文件的statement的resultType的值一致。



  4.开发
  【1】Mapping接口
 
[html]  view plain  copy 
Mybatis Mapper代理的开发方式

文章图片
Mybatis Mapper代理的开发方式

文章图片
  1. public  interface  UserMapper{   
  2.         //1.根据用户ID查询用户信息   
  3.         public  User  findUserById(int  id)  throws  Exception;    
  4.    
  5.         //2.添加用户   
  6.         public  void  insertUser(User  user)  throws  Exception;    
  7.            
  8.         //3.根据用户名字查询用户信息   
  9.         public  List< User>   findUserByName(String  username)  throws  Exception;    
  10.     }   
【2】Mapper映射文件
在config下创建mapper目录然后创建UserMapper.xml
namespace和mapper接口的全限定名一致
 
[java]  view plain  copy 
Mybatis Mapper代理的开发方式

文章图片
Mybatis Mapper代理的开发方式

文章图片
  1. < mapper  namespace="cn.itcast.mybatis.mapper.UserMapper">        
  2.    
  3.       < !--    根据id查询用户信息   
  4.             id:唯一标识一个statement       
  5.             #{}:表示一个占位符,如果#{}中传入简单类型的参数,#{}中的名称随意       
  6.             parameterType:输入参数的类型,通过#{}接收parameterType输入的参数       
  7.             resultType:输出结果类型,不管返回是多条还是单条,指定单条记录映射的pojo类型       
  8.         -->        
  9.       < select  id="findUserById"  parameterType="int"  resultType="com.itheima.mybatis.po.user">        
  10.             SELECT  *  FROM  USER  WHERE  id=  #{id}       
  11.       < /select>      
  12.    
  13.    
  14.       < !--  添加用户       
  15.           parameterType:输入参数的类型,User对象包括username,birthday,sex,address       
  16.           #{}接收pojo数据,可以使用OGNL解析出pojo的属性值       
  17.           #{username}表示从parameterType中获取pojo的属性值       
  18.           selectKey:用于进行主键返回,定义了获取主键值的sql       
  19.           order:设置selectKey中sql执行的顺序,相对于insert语句来说       
  20.           keyProperty:将主键值设置到哪个属性       
  21.           resultType:select  LAST_INSERT_ID()的结果类型       
  22.       -->        
  23.    
  24.       < insert  id="insertUser"  parameterType="cn.itcast.mybatis.po.User">        
  25.             < selectKey  keyProperty="id"  order="AFTER"  resultType="int">        
  26.                   select  LAST_INSERT_ID()       
  27.             < /selectKey>        
  28.                  
  29.             INSERT  INTO  USER(username,birthday,sex,address)VALUES(#{username},#{birthday},#{sex},#{address})       
  30.       < /insert>        
  31.    
  32.    
  33.       < !--  根据用户名称查询用户信息,可能返回多条       
  34.         ${}:表示sql的拼接,通过${}接收参数,将参数的内容不加任何修饰拼接在sql中。         
  35.         -->        
  36.       < select  id="findUserByName"  parameterType="java.lang.String"  resultType="cn.itcast.mybatis.po.User">        
  37.             select  *  from  user  where  usernamelike  ‘%${value}%‘       
  38.       < /select>    
  39. < /mapper>    

 
【3】加载映射文件
 
    在SqlMapConfing.xml中加载UserMapper.xml,如果将和spring整合后,可以使用整合包中提供的mapper扫描器,此处的mappers不用配置了。代码如下所示:
   
Mybatis Mapper代理的开发方式

文章图片
 
      【4】测试代码
     
Mybatis Mapper代理的开发方式

文章图片

小结:
代理对象内部调用selectOne或selectList
 如果mapper方法返回单个pojo对象(非集合对象),代理对象内部通过selectOne查询数据库。
【Mybatis Mapper代理的开发方式】 如果mapper方法返回集合对象,代理对象内部通过selectList查询数据库。




    推荐阅读