MyBatis动态代理

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();
}

执行结果:

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

pan_junbiao

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值