首页 > 代码库 > 02.MyBatis在DAO层开发使用的Mapper动态代理方式

02.MyBatis在DAO层开发使用的Mapper动态代理方式

  在实际开发中,Mybatis作用于DAO层,那么Service层该如何调用Mybatis

  Mybatis鼓励使用Mapper动态代理的方式

  Mapper接口开发方法只需要程序员编写Mapper接口(相当于Dao接口),由Mybatis框架根据接口定义创建接口的动态代理对象,代理对象的方法体等于Dao接口实现类方法。

1.编写Mapper.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">

<!-- namespace必须和Mapper接口类路径一致 -->
<mapper namespace="cn.mybatis.mapper.UserMapper">
    
    <!-- 通过ID查询一个结果 -->
    <select id="findUserById" parameterType="int" resultType="cn.itcast.mybatis.po.User">
        select * from user where id = #{id}
    </select>

    <!-- 通过用户名模糊查询 -->
    <select id="findUserByUsername" parameterType="String" resultType="cn.itcast.mybatis.po.User">
        select * from user where username like "%"#{username}"%"
    </select>

    <!-- 添加用户 -->
    <insert id="insert" parameterType="cn.itcast.mybatis.po.User">
        insert into user(username,sex,birthday,address) 
            values(#{username},#{sex},#{birthday},#{address})
    </insert>
    
</mapper>

2.编写Mapper.java接口文件

public interface UserMapper {

    /**
     * 通过ID查询一个结果
     * @param id
     * @return
     */
    public User findUserById(int id);
    
    /**
     * 通过用户名模糊查询
     * @param username
     * @return
     */
    public List<User> findUserByUsername(String username);
    
    /**
     * 添加用户
     * @param user
     */
    public void insert(User user);
    
}

3.Mapper接口开发必须遵循的规范

  • 1.Mapper.xml文件中的【namespace】必须与Mapper.java接口【类路径】相同
  • 2.Mapper.java接口中的方法名】必须与Mapper.xml中对应的id】相同
  • 3.Mapper.java接口中的入参】必须与Mapper.xml中对应的parameter】相同
  • 4.Mapper.java接口中的返回类型】必须与Mapper.xml中对应的resultType】相同

4.在SqlMapConfig.xml中加载Mapper.xml映射文件

技术分享

5.测试

public class UserServiceImpl {

    private SqlSessionFactory sqlSessionFactory;

    /**
     * 初始化工厂
     * 
     * @throws Exception
     */
    @Before
    public void init() throws Exception {
        InputStream inputStream = Resources.getResourceAsStream("SqlMapConfig.xml");
        this.sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
    }

    /**
     * 通过ID查询一个结果
     */
    @Test
    public void m01() {
        // 获取sqlSession,和Spring整理后由Spring管理
        SqlSession sqlSession = this.sqlSessionFactory.openSession();
        // 从sqlSession中获取Mapper接口的代理对象
        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);

        // 执行查询
        User user = userMapper.findUserById(10);
        System.out.println(user);

        // 和Spring整理后由Spring管理
        sqlSession.close();
    }

    /**
     * 通过用户名模糊查询
     */
    @Test
    public void m02() {
        // 获取sqlSession,和Spring整理后由Spring管理
        SqlSession sqlSession = this.sqlSessionFactory.openSession();
        // 从sqlSession中获取Mapper接口的代理对象
        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);

        // 执行查询
        List<User> list = userMapper.findUserByUsername("王五");
        for (User user : list) {
            System.out.println(user);
        }

        // 和Spring整理后由Spring管理
        sqlSession.close();
    }

    /**
     * 添加用户
     */
    @Test
    public void m03() {
        // 获取sqlSession,和Spring整理后由Spring管理
        SqlSession sqlSession = this.sqlSessionFactory.openSession();
        // 从sqlSession中获取Mapper接口的代理对象
        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);

        // 执行查询
        User user = new User();
        user.setUsername("添加User");
        user.setSex("男");
        user.setBirthday(new Date());
        user.setAddress("未知区域");
        
        userMapper.insert(user);
        
        // 和Spring整理后由Spring管理
        sqlSession.commit();
        sqlSession.close();

    }
}

02.MyBatis在DAO层开发使用的Mapper动态代理方式