Mybatis实现Mapper动态代理方式详解
一、实现原理
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的通用性。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
上一篇: MySQL中的基本查询语句学习笔记
下一篇: Spring之动态注册bean的实现方法