MyBatis(2)之动态代理开发

MyBatis(2)之动态代理开发

微信搜索 zze_coding 或扫描 👉 二维码关注我的微信公众号获取更多资源推送:

介绍

为便于开发,MyBatis 为我们提供了更加便捷的开发方式,那就是动态代理开发。要使用该方式开发必须遵循下面几个条件:

  • mapper.xml 文件中的 namespace 与 Mapper 接口的类路径相同。
  • Mapper 接口方法名和 mapper.xml 中定义的每个 statementid 相同。
  • Mapper 接口方法的输入参数类型和 mapper.xml 中定义的每个 sql 的 parameterType 的类型相同。
  • Mapper 接口方法的输出参数类型和 mapper.xml 中定义的每个 sql 的 resultType 的类型相同。

示例

1、创建映射文件对应接口:

// com.zze.mybatis.mapper.UserMapper
import com.zze.mybatis.pojo.User;

import java.util.List;

public interface UserMapper {
    Integer add1(User user);

    Integer add2(User user);

    Integer add3(User user);

    Integer update(User user);

    User getById(Integer id);

    List<User> getByName1(String name);

    List<User> getByName2(String name);

    List<User> getAll();

    Integer deleteById(Integer id);
}

2、修改映射文件 namespace 为对应接口全路径名:

<!-- mybatis/mapper/User.xml -->
<?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.zze.mybatis.mapper.UserMapper">
    <!--
     新增操作
        parameterType : 参数类型
            selectKey 配置主键返回
                keyProperty : 主键属性
                resultType : 主键数据类型
                order : 指定 selectKey 何时执行
     -->
    <insert id="add1" parameterType="com.zze.mybatis.pojo.User">
        <selectKey keyProperty="id" resultType="int" order="AFTER">
            SELECT LAST_INSERT_ID();
        </selectKey>
        INSERT INTO user(name,age,birthday) VALUES(#{name},#{age},#{birthday});
    </insert>
    <!--
    新增操作
        useGeneratedKeys : 使用自增
        keyProperty : 指定主键属性,与 useGeneratedKeys 搭配使用
        用这两个属性相当于 add1 中使用 selectKey
    -->
    <insert id="add2" parameterType="com.zze.mybatis.pojo.User" useGeneratedKeys="true" keyProperty="id">
        INSERT INTO user(name,age,birthday) VALUES(#{name},#{age},#{birthday});
    </insert>

    <!--
    新增操作
    在真正执行插入操作之前生成一个 uuid 赋值给指定属性
    -->
    <insert id="add3" parameterType="com.zze.mybatis.pojo.User">
        <selectKey keyProperty="uuid" resultType="string" order="BEFORE">
            select UUID();
        </selectKey>
        INSERT INTO user(name,age,birthday,uuid) VALUES(#{name},#{age},#{birthday},#{uuid});
    </insert>

    <!--
    更新操作
    -->
    <update id="update" parameterType="com.zze.mybatis.pojo.User">
        UPDATE user SET name=#{name},age=#{age},birthday=#{birthday} WHERE id=#{id};
    </update>
    <!--
    获取单个对象
    -->
    <select id="getById" parameterType="int" resultType="com.zze.mybatis.pojo.User">
        SELECT id,name,age,birthday FROM user where id=#{id};
    </select>

    <!--
    根据名字模糊查询方式一
         #{} 方式相当于 jdbc 的 ? 占位符方式
         当传入参数为基础类型,使用 #{任意变量名},来引用传入的参数
    -->
    <select id="getByName1" parameterType="string" resultType="com.zze.mybatis.pojo.User">
        SELECT id,name,age,birthday FROM user where name like #{name};
    </select>

    <!--
    根据名字模糊查询方式二
         该方式为字符串拼接
         当传入的参数为基础类型时,只可以使用 ${value} 来引用传入参数
         当传入的参数为 POJO 时,直接使用${属性名}
    -->
    <select id="getByName2" parameterType="string" resultType="com.zze.mybatis.pojo.User">
        SELECT id,name,age,birthday FROM user where name like '%${value}%';
    </select>

    <!--
    查询所有
    -->
    <select id="getAll" resultType="com.zze.mybatis.pojo.User">
        SELECT id,name,age,birthday FROM user
    </select>
    <!--
    删除操作
    -->
    <delete id="deleteById" parameterType="int">
        DELETE FROM user WHERE id=#{id}
    </delete>
</mapper>

3、测试:

import com.zze.mybatis.mapper.UserMapper;
import com.zze.mybatis.util.SqlSessionFactoryUtil;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;

public class MyBatisMapperProxyTest {
    @Test
    public void test() {
        SqlSession sqlSession = SqlSessionFactoryUtil.openSession();
        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
//        userMapper.add1();
//        userMapper.add2();
//        userMapper.add3();
//        userMapper.getByName1();
//        userMapper.getByName2();
//        userMapper.getById();a
//        userMapper.deleteById();
//        userMapper.update()
        userMapper.getAll().forEach(u -> System.out.println(u));
    }
}

Copyright: 采用 知识共享署名4.0 国际许可协议进行许可

Links: https://www.zze.xyz/archives/mybatis2.html

Buy me a cup of coffee ☕.