介绍
为便于开发,MyBatis 为我们提供了更加便捷的开发方式,那就是动态代理开发。要使用该方式开发必须遵循下面几个条件:
mapper.xml
文件中的namespace
与 Mapper 接口的类路径相同。- Mapper 接口方法名和
mapper.xml
中定义的每个statement
的id
相同。 - 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));
}
}
评论区