Mapper代理的开发方式,程序员只需要编写mapper接口(相当于dao接口)即可。Mybatis会自动的为mapper接口生成动态代理实现类。Mapper代理使用的是jdk的代理策略。
不过要实现mapper代理的开发方式,需要遵循一些开发规范。
- mapper接口的全限定名要和mapper映射文件的namespace的值相同。
- mapper接口的方法名称要和mapper映射文件中的statement的id相同;
- mapper接口的方法参数只能有一个,且类型要和mapper映射文件中statement的parameterType的值保持一致。
- mapper接口的返回值类型要和mapper映射文件中statement的resultType值或resultMap中的type值保持一致;
通过规范式的开发mapper接口,可以解决原始dao开发当中存在的问题:
模板代码已经去掉;
剩下去不掉的操作数据库的代码,其实就是一行代码。这行代码中硬编码的部分,通过第一和第二个规范就可以解决。
1、编写mapper映射文件。重新定义mapper映射文件UserMapper.xml(内容同Users.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.itheima.mybatis.mapper.UserMapper">
<!-- 根据用户ID查询用户信息 -->
<select id="findUserById" parameterType="int" resultType="User">
SELECT * FROM USER WHERE id =#{id}
</select>
<!-- 添加用户 -->
<insert id="insertUser" parameterType="com.itheima.mybatis.po.User">
<selectKey keyProperty="id" resultType="int" order="AFTER">
SELECT LAST_INSERT_ID()
</selectKey>
INSERT INTO USER
(username,birthday,sex,address)
VALUES(#{username},#{birthday},#{sex},#{address})
</insert>
</mapper>
2、在全局配置文件中加载mapper映射文件
<!-- 加载mapper -->
<mappers>
<mapper resource="sqlmap/User.xml"/>
<mapper resource="mapper/UserMapper.xml"/>
</mappers>
3、编写mapper接口
package com.task.mapper;
import com.task.po.User;
import com.task.po.UserQueryVO;
import java.util.List;
public interface UserMapper {
// 1、 根据用户ID查询用户信息
public User findUserById(int id) throws Exception;
// 3、 添加用户
public void insertUser(User user) throws Exception;
//综合查询
public List<User> findUserList(UserQueryVO vo);
//综合查询用户总数
public int findUserCount(UserQueryVO vo);
//resultMap入门
public User findUserRstMap(int id);
}
4、测试代码
@Test
public void testFindUserById() throws Exception {
// 创建UserMapper对象
SqlSession sqlSession = sqlSessionFactory.openSession();
// 由mybatis通过sqlsession来创建代理对象
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
User user = mapper.findUserById(1);
System.out.println(user);
sqlSession.close();
}