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

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

程序员文章站 2024-02-20 12:34:16
一、实现原理         mapper接口开发方法只需要程序员编写mapper接口(相当于d...

一、实现原理

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

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