当前位置: 移动技术网 > IT编程>开发语言>Java > Mybatis实现Mapper动态代理方式详解

Mybatis实现Mapper动态代理方式详解

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

一、实现原理

        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的类型相同

二、mapper.xml映射文件

       定义mapper映射文件usermapper.xml(内容同users.xml),需要修改namespace的值为 usermapper接口路径。将usermapper.xml放在classpath 下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="cn.itcast.mybatis.mapper.usermapper"> 
<!-- 根据id获取用户信息 --> 
 <select id="finduserbyid" parametertype="int" resulttype="cn.itcast.mybatis.po.user"> 
  select * from user where id = #{id} 
 </select> 
<!-- 自定义条件查询用户列表 --> 
 <select id="finduserbyusername" parametertype="java.lang.string" 
   resulttype="cn.itcast.mybatis.po.user"> 
  select * from user where username like '%${value}%' 
 </select> 
<!-- 添加用户 --> 
 <insert id="insertuser" parametertype="cn.itcast.mybatis.po.user"> 
 <selectkey keyproperty="id" order="after" resulttype="java.lang.integer"> 
  select last_insert_id() 
 </selectkey> 
  insert into user(username,birthday,sex,address) 
  values(#{username},#{birthday},#{sex},#{address}) 
 </insert> 
 
</mapper> 

三、mapper.java(接口文件) 

/** 
 * 用户管理mapper 
 */ 
public interface usermapper { 
 //根据用户id查询用户信息 
 public user finduserbyid(int id) throws exception; 
 //查询用户列表 
 public list<user> finduserbyusername(string username) throws exception; 
 //添加用户信息 
 public void insertuser(user user)throws exception; 
} 

接口定义有如下特点:

1、mapper接口方法名和mapper.xml中定义的statement的id相同
2、mapper接口方法的输入参数类型和mapper.xml中定义的statement的parametertype的类型相同
3、mapper接口方法的输出参数类型和mapper.xml中定义的statement的resulttype的类型相同 

四、加载usermapper.xml文件

修改sqlmapconfig.xml文件: 

<!-- 加载映射文件 --> 
 <mappers> 
 <mapper resource="mapper/usermapper.xml"/> 
 </mappers> 

五、测试  

public class usermappertest extends testcase { 
 
 private sqlsessionfactory sqlsessionfactory; 
  
 protected void setup() throws exception { 
  //mybatis配置文件 
  string resource = "sqlmapconfig.xml"; 
  inputstream inputstream = resources.getresourceasstream(resource); 
  //使用sqlsessionfactorybuilder创建sessionfactory 
  sqlsessionfactory = new sqlsessionfactorybuilder().build(inputstream); 
 } 
 
  
 public void testfinduserbyid() throws exception { 
  //获取session 
  sqlsession session = sqlsessionfactory.opensession(); 
  //获取mapper接口的代理对象 
  usermapper usermapper = session.getmapper(usermapper.class); 
  //调用代理对象方法 
  user user = usermapper.finduserbyid(1); 
  system.out.println(user); 
  //关闭session 
  session.close(); 
   
 } 
 @test 
 public void testfinduserbyusername() throws exception { 
  sqlsession sqlsession = sqlsessionfactory.opensession(); 
  usermapper usermapper = sqlsession.getmapper(usermapper.class); 
  list<user> list = usermapper.finduserbyusername("张"); 
  system.out.println(list.size()); 
 
 } 
public void testinsertuser() throws exception { 
  //获取session 
  sqlsession session = sqlsessionfactory.opensession(); 
  //获取mapper接口的代理对象 
  usermapper usermapper = session.getmapper(usermapper.class); 
  //要添加的数据 
  user user = new user(); 
  user.setusername("张三"); 
  user.setbirthday(new date()); 
  user.setsex("1"); 
  user.setaddress("北京市"); 
  //通过mapper接口添加用户 
  usermapper.insertuser(user); 
  //提交 
  session.commit(); 
  //关闭session 
  session.close(); 
 } 
  
 
} 
 

六、总结 

 selectone和selectlist

         动态代理对象调用sqlsession.selectone()和sqlsession.selectlist()是根据mapper接口方法的返回值决定,如果返回list则调用selectlist方法,如果返回单个对象则调用selectone方法。

namespace

         mybatis官方推荐使用mapper代理方法开发mapper接口,程序员不用编写mapper接口实现类,使用mapper代理方法时,输入参数可以使用pojo包装对象或map对象,保证dao的通用性。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持移动技术网。

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网