Mybatis實現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的型別相同
二、Mapper.xml對映檔案
定義mapper對映檔案UserMapper.xml(內容同Users.xml),需要修改namespace的值為 UserMapper介面路徑。將UserMapper.xml放在classpath 下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="cn.itcast.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="java.lang.String" resultType="cn.itcast.mybatis.po.User"> select * from user where username like '%${value}%' </select> <!-- 新增使用者 --> <insert id="insertUser" parameterType="cn.itcast.mybatis.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> </mapper>
三、Mapper.java(介面檔案)
/**
* 使用者管理mapper
*/
Public interface UserMapper {
//根據使用者id查詢使用者資訊
public User findUserById(int id) throws Exception;
//查詢使用者列表
public List<User> findUserByUsername(String username) throws Exception;
//新增使用者資訊
public void insertUser(User user)throws Exception;
}
介面定義有如下特點:
1、Mapper介面方法名和Mapper.xml中定義的statement的id相同
2、Mapper介面方法的輸入引數型別和mapper.xml中定義的statement的parameterType的型別相同
3、Mapper介面方法的輸出引數型別和mapper.xml中定義的statement的resultType的型別相同
四、載入UserMapper.xml檔案
修改sqlMapConfig.xml檔案:
<!-- 載入對映檔案 -->
<mappers>
<mapper resource="mapper/UserMapper.xml"/>
</mappers>
五、測試
Public class UserMapperTest extends TestCase {
private SqlSessionFactory sqlSessionFactory;
protected void setUp() throws Exception {
//mybatis配置檔案
String resource = "sqlMapConfig.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
//使用SqlSessionFactoryBuilder建立sessionFactory
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
}
Public void testFindUserById() throws Exception {
//獲取session
SqlSession session = sqlSessionFactory.openSession();
//獲取mapper介面的代理物件
UserMapper userMapper = session.getMapper(UserMapper.class);
//呼叫代理物件方法
User user = userMapper.findUserById(1);
System.out.println(user);
//關閉session
session.close();
}
@Test
public void testFindUserByUsername() throws Exception {
SqlSession sqlSession = sqlSessionFactory.openSession();
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
List<User> list = userMapper.findUserByUsername("張");
System.out.println(list.size());
}
Public void testInsertUser() throws Exception {
//獲取session
SqlSession session = sqlSessionFactory.openSession();
//獲取mapper介面的代理物件
UserMapper userMapper = session.getMapper(UserMapper.class);
//要新增的資料
User user = new User();
user.setUsername("張三");
user.setBirthday(new Date());
user.setSex("1");
user.setAddress("北京市");
//通過mapper介面新增使用者
userMapper.insertUser(user);
//提交
session.commit();
//關閉session
session.close();
}
}
六、總結
selectOne和selectList
動態代理物件呼叫sqlSession.selectOne()和sqlSession.selectList()是根據mapper介面方法的返回值決定,如果返回list則呼叫selectList方法,如果返回單個物件則呼叫selectOne方法。
namespace
mybatis官方推薦使用mapper代理方法開發mapper介面,程式設計師不用編寫mapper介面實現類,使用mapper代理方法時,輸入引數可以使用pojo包裝物件或map物件,保證dao的通用性。