MyBatis 开发原始 Dao 层请阅读我的上一篇博客: MyBatis 开发 Dao 层的两种方式 (原始 Dao 层开发)
接上一篇博客继续介绍 MyBatis 开发 Dao 层的第二种方式: 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 的类型相同
1, 定义 mapper 映射文件 UserMapper.xml(内容同 User.xml), 需要修改 namespace 的值为 UserMapper 接口路径. 将 UserMapper.xml 放在 classpath 下 sqlmapperr 目录下.
<?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.xyfer.mapper.UserMapper">
- <!-- 根据 id 查询用户 -->
- <select id="getUserById" parameterType="int" resultType="com.xyfer.po.User">
- select * from user where id = #{id}
- </select>
- <!-- 添加用户 -->
- <insert id="insertUser" parameterType="com.xyfer.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>
- <!-- 修改用户 -->
- <update id="updateUser" parameterType="com.xyfer.po.User">
- update user set username=#{username},birthday=#{birthday},sex=#{sex},address=#{address}
- where id=#{id}
- </update>
- <!-- 删除用户 -->
- <delete id="deleteUserById" parameterType="int">
- delete from user where id=#{id}
- </delete>
- </mapper>
2,UserMapper.java 接口文件
- package com.xyfer.mapper;
- import com.xyfer.po.User;
- public interface UserMapper {
- public User getUserById(int id); // 根据 id 值查询一个用户
- public void insertUser(User user); // 新增一个用户
- public void updateUser(User user); // 修改一个用户
- public void deleteUser(int id); // 删除一个用户
- }
接口定义有如下特点:
(1)UserMapper 接口方法名和 Mapper.xml 中定义的 statement 的 id 相同
(2)UserMapper 接口方法的输入参数类型和 mapper.xml 中定义的 statement 的 parameterType 的类型相同
(3) UserMapper 接口方法的输出参数类型和 mapper.xml 中定义的 statement 的 resultType 的类型相同
3, 在 SqlMapConfig.xml 文件中加载 UserMapper.xml 文件
- <mappers>
- <mapper resource="UserMapper.xml"/>
- </mappers>
4, 测试
- package com.xyfer.mapper;
- import static org.junit.Assert.*;
- import java.io.InputStream;
- import java.util.Date;
- import org.apache.ibatis.io.Resources;
- import org.apache.ibatis.session.SqlSession;
- import org.apache.ibatis.session.SqlSessionFactory;
- import org.apache.ibatis.session.SqlSessionFactoryBuilder;
- import org.junit.Before;
- import org.junit.Test;
- import com.xyfer.po.User;
- import junit.framework.TestCase;
- public class UserMapperTest extends TestCase{
- private SqlSessionFactory sqlSessionFactory;
- protected void setUp() throws Exception {
- SqlSessionFactoryBuilder sessionFactoryBuilder = new SqlSessionFactoryBuilder();
- InputStream inputStream = Resources.getResourceAsStream("SqlMapConfig.xml");
- sqlSessionFactory = sessionFactoryBuilder.build(inputStream);
- }
- @Test
- public void testGetUserById() {
- // 获取 sqlsession
- SqlSession sqlsession = sqlSessionFactory.openSession();
- // 获取 UserMapper 接口代理对象
- UserMapper userMapper = sqlsession.getMapper(UserMapper.class);
- // 调用代理对象方法
- User user = userMapper.getUserById(10);
- // 打印结果
- System.out.println(user);
- // 关闭 sqlsession
- sqlsession.close();
- }
- @Test
- public void testInsertUser() {
- // 获取 sqlsession
- SqlSession sqlsession = sqlSessionFactory.openSession();
- // 获取 UserMapper 接口代理对象
- UserMapper userMapper = sqlsession.getMapper(UserMapper.class);
- // 新建一个对象
- User user = new User();
- user.setUsername("小谢");
- user.setSex("男");
- user.setBirthday(new Date());
- user.setAddress("浙江省杭州市");
- // 调用代理对象方法
- userMapper.insertUser(user);
- // 关闭 sqlsession
- sqlsession.close();
- }
- @Test
- public void testUpdateUser() {
- // 获取 sqlsession
- SqlSession sqlsession = sqlSessionFactory.openSession();
- // 获取 UserMapper 接口代理对象
- UserMapper userMapper = sqlsession.getMapper(UserMapper.class);
- // 新建一个对象
- User user = new User();
- user.setUsername("小谢");
- user.setSex("男");
- user.setBirthday(new Date());
- user.setAddress("上海市");
- // 调用代理对象方法
- userMapper.updateUser(user);
- // 关闭 sqlsession
- sqlsession.close();
- }
- @Test
- public void testDeleteUser() {
- // 获取 sqlsession
- SqlSession sqlsession = sqlSessionFactory.openSession();
- // 获取 UserMapper 接口代理对象
- UserMapper userMapper = sqlsession.getMapper(UserMapper.class);
- // 调用代理对象方法
- userMapper.deleteUser(6);
- // 关闭 sqlsession
- sqlsession.close();
- }
- }
以上步骤, 完成 mybatis 框架以 Mapper 动态代理方式开发 Dao 层, 并对数据库进行增删改查操作.
需要注意的是, 上文提到的 config 文件夹和 sqlmapper 文件夹均为资源文件夹 (source folder), 默认会加载该路径下的文件.
来源: https://www.cnblogs.com/xyfer1018/p/10117227.html