1、Mapper动态代理
什么是Mapper动态代理?一般创建Web工程时,从数据库取数据的逻辑会放置在DAO层(Date Access Object,数据访问对象)。使用MyBatis开发Web工程时,通过Mapper动态代理机制,可以只编写数据交互的接口及方法定义,和对应的Mapper映射文件,具体的交互方法实现由MyBatis来完成。这样大大节省了开发DAO层的时间。
实现Mapper动态代理的方法并不难,只需要遵守一定的开发规范即可。即创建一个interface接口,接口名称保持与某个mapper.xml配置文件相同,接口中方法定义的方法和方法参数,以及方法返回类型,都与mapper.xml配置文件中的SQL映射的id及输入/输出映射类型相同,而mapper的namespace指定interface接口路径,此时就可以使用SqlSession类获取Mapper代理(即一个interface接口类型的对象)来执行SQL映射配置。
2、Mapper动态代理实例
编写一个使用Mapper动态代理操作用户信息的实例。
实例中使用了MyBatis驼峰命名规则。需要在MyBatis的全局配置文件SqlMapConfig.xml(mybatis-config.xml)中,开启驼峰命名规则。
<!-- 开启自动驼峰命名规则(camel case)映射 -->
<setting name="mapUnderscoreToCamelCase" value="true"/>
(1)数据库中创建用户信息表(tb_user),并添加数据。
-- 创建“用户信息”数据表
CREATE TABLE IF NOT EXISTS tb_user
(
id INT AUTO_INCREMENT PRIMARY KEY COMMENT '用户编号',
user_name VARCHAR(50) NOT NULL COMMENT '用户姓名',
blog_url VARCHAR(50) NOT NULL COMMENT '博客地址',
remark VARCHAR(50) COMMENT '备注'
) COMMENT = '用户信息表';
-- 添加数据
INSERT INTO tb_user(user_name,blog_url,remark) VALUES('pan_junbiao的博客','https://blog.csdn.net/pan_junbiao','您好,欢迎访问 pan_junbiao的博客');
(2)创建用户信息持久化类(User.java)。
package com.pjb.mybatis.po;
/**
* 用户信息的持久化类
* @author pan_junbiao
**/
public class User
{
private int Id; //用户ID
private String userName; //用户姓名
private String blogUrl; //博客地址
private String remark; //备注
public int getId()
{
return Id;
}
public void setId(int id)
{
Id = id;
}
public String getUserName()
{
return userName;
}
public void setUserName(String userName)
{
this.userName = userName;
}
public String getBlogUrl()
{
return blogUrl;
}
public void setBlogUrl(String blogUrl)
{
this.blogUrl = blogUrl;
}
public String getRemark()
{
return remark;
}
public void setRemark(String remark)
{
this.remark = remark;
}
}
(3)创建SQL配置文件UserMapper.xml,其中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.pjb.mybatis.mapper.UserMapper">
<!-- 查询用户 -->
<select id="queryUserById" parameterType="int" resultType="com.pjb.mybatis.po.User">
SELECT * FROM tb_user WHERE id = #{id}
</select>
<!-- 新增用户 -->
<insert id="insertUser" parameterType="com.pjb.mybatis.po.User">
INSERT INTO tb_user(user_name,blog_url,remark)
VALUES(#{userName},#{blogUrl},#{remark})
</insert>
<!-- 修改用户 -->
<update id="updateUser" parameterType="com.pjb.mybatis.po.User">
UPDATE tb_user SET user_name = #{userName} ,blog_url=#{blogUrl} ,remark=#{remark} WHERE id = #{id}
</update>
<!-- 删除用户 -->
<delete id="deleteUser" parameterType="java.lang.Integer">
DELETE FROM tb_user WHERE id = #{id}
</delete>
</mapper>
(4)在MyBatis的全局配置文件SqlMapConfig.xml(mybatis-config.xml)中,mappers标签中配置上述的mapper映射文件。
<!-- 加载映射文件 -->
<mappers>
<!-- 其他的Mapper映射文件... -->
<!-- 用户信息Mapper映射配置文件 -->
<mapper resource="com/pjb/mybatis/sqlmap/UserMapper.xml"/>
</mappers>
(5)编写Mapper代理接口。
package com.pjb.mybatis.mapper;
import com.pjb.mybatis.po.User;
/**
* 用户信息Mapper动态代理接口
* @author pan_junbiao
**/
public interface UserMapper
{
//查询用户
public User queryUserById(int id) throws Exception;
//新增用户
public int insertUser(User user) throws Exception;
//修改用户
public int updateUser(User user) throws Exception;
//删除用户
public int deleteUser(int id) throws Exception;
}
(6)执行查询用户方法。
/**
* 查询用户
* @author pan_junbiao
*/
@Test
public void queryUserById() throws Exception
{
DataConnection dataConnection = new DataConnection();
SqlSession sqlSession = dataConnection.getSqlSession();
//获取Mapper代理
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
//执行Mapper代理对象的查询方法
User user = userMapper.queryUserById(1);
if(user!=null)
{
System.out.println("用户编号:" + user.getId());
System.out.println("用户姓名:" + user.getUserName());
System.out.println("博客地址:" + user.getBlogUrl());
System.out.println("备注信息:" + user.getRemark());
}
sqlSession.close();
}
执行结果:
(7)执行新增用户方法。
/**
* 新增用户
* @author pan_junbiao
*/
@Test
public void insertUser() throws Exception
{
DataConnection dataConnection = new DataConnection();
SqlSession sqlSession = dataConnection.getSqlSession();
//获取Mapper代理
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
//新增用户对象
User user = new User();
user.setUserName("pan_junbiao的博客");
user.setBlogUrl("https://blog.csdn.net/pan_junbiao");
user.setRemark("您好,欢迎访问 pan_junbiao的博客");
//执行Mapper代理对象的新增方法
int count = userMapper.insertUser(user);
sqlSession.commit();
System.out.println("执行结果:"+count);
sqlSession.close();
}
执行结果: