概述
學習真是一個溫故知新的過程严沥。在寫前面的一些文章時,我自己對一些比較模糊的地方有了更好的認識拷沸,這應該算是寫東西最大的收獲吧色查。不管在什么時候,都要給自己找一個堅持的理由撞芍。成為最好的自己之前秧了,先做好當下的每件小事。
Mapper 代理開發(fā)方式
在一般的 Dao「 Data Access Object 」開發(fā)方法要寫 Dao 接口以及其實現(xiàn)類序无。Mapper 代理方式只需要編寫 Mapper 接口验毡,MyBatis 會根據(jù)接口定義創(chuàng)建接口的動態(tài)代理對象。創(chuàng)建代理對象的方法的具體實現(xiàn)帝嗡。在 Mapper 開發(fā)中晶通,要注意下面幾點:
- Mapper.xml 相當于前面出現(xiàn)的Users.xml 文件,但是這里要和 Mapper 接口在相同路徑哟玷,且名稱相同狮辽。
- Mapper.xml 中 namespace 的路徑和 Mapper 接口的路徑一致。
3 - Mapper 接口中的方法名稱和 Mapper.xml 中的對應的聲明 「 statement 」中id 一致巢寡。并且聲明中 parameterType 的類型和接口方法的輸入?yún)?shù)類型一致喉脖, resultType 的類型和接口方法的返回值類型一致。
創(chuàng)建 mapper 包讼渊,將 Mapper 接口和映射文件放在 mapper 包中动看。下面創(chuàng)建 UsesMapper 接口和 UsersMapper.xml 完成一個小例子,體驗下洪荒之力爪幻。
- UserMapper.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">
<!--這里的名稱空間是 UsersMapper 接口的路徑-->
<mapper namespace="com.jihe.mapper.UsersMapper">
<!--增加用戶-->
<insert id="addUser" parameterType="com.jihe.domain.Users">
insert into users(username,birthday,sex,address)
values(#{username},#{birthday},#{sex},#{address})
</insert>
<!--刪除用戶-->
<delete id="deleteUserById" parameterType="int">
delete from users where id=#{id}
</delete>
<!--查找用戶-->
<select id="findUserByName" parameterType="string" resultType="com.jihe.domain.Users">
select * from users where username like '%${value}%'
</select>
</mapper>
這是 Users.xml 實現(xiàn)的功能菱皆,現(xiàn)在使用代理的方式實現(xiàn)上面的功能。
- UsersMapper 接口
package com.jihe.mapper;
import com.jihe.domain.Users;
import java.util.List;
/**
* UsersMapper 接口
*/
public interface UsersMapper {
//增加用戶
public void addUser(Users user);
//刪除用戶
public void deleteUserById(Integer id);
//查找用戶
public List<Users> findUserByName(String username);
}
- 將 UsersMapper.xml 加載到 MyBatis 的核心配置文件 sqlMapConfig.xml 中:
<mappers>
<!--<mapper resource="Users.xml"/>-->
<mapper resource="com/jihe/mapper/UsersMapper.xml"/>
</mappers>
上面的方式是直接加載類路徑下的資源挨稿,還有下面的幾種方式可以加載 Mapper.xml 問價:
- 通過加載 Mapper 接口的類路徑方式
<mappers>
<mapper class="com.jihe.mapper.UsersMapper"/>
</mappers>
- 加載 Mapper 接口包下所有的文件
<mappers>
<package name="com.jihe.mapper"/>
</mappers>
- 測試
package com.jihe.test;
//省略導包
/**
* UsersMapper 接口的測試
*/
public class UsersMapperTest {
//創(chuàng)建 SqlSessionFactory
SqlSessionFactory sqlSessionFactory = null;
@Before
public void createFactroy()throws Exception{
String xml = "sqlMapConfig.xml";
InputStream in = Resources.getResourceAsStream(xml);
sqlSessionFactory = new SqlSessionFactoryBuilder().build(in);
}
//增加
@Test
public void testAddUser(){
Users user = new Users();
user.setUsername("大白波");
user.setAddress("USA");
user.setSex("男");
user.setBirthday(new Date());
SqlSession session = sqlSessionFactory.openSession();
//獲取 UsersMapper
UsersMapper mapper = session.getMapper(UsersMapper.class);
//增加用戶
mapper.addUser(user);
session.commit();
session.close();
}
//刪除
@Test
public void testDeleteUser(){
SqlSession session = sqlSessionFactory.openSession();
UsersMapper mapper = session.getMapper(UsersMapper.class);
mapper.deleteUserById(32);
session.commit();
session.close();
}
//查找
@Test
public void testFindUsers(){
SqlSession session = sqlSessionFactory.openSession();
UsersMapper mapper = session.getMapper(UsersMapper.class);
List<Users> list = mapper.findUserByName("波");
//在下面打斷點仇轻,可以看到查到的數(shù)據(jù)
System.out.print(list);
session.commit();
session.close();
}
}
以上就是 MyBatis 中使用 Mapper 接口動態(tài)代理的方式編寫持久層代碼。
小結(jié)
通過 Mapper 動態(tài)代理的方式簡化了傳統(tǒng) Dao 開發(fā)方法奶甘。我們只要編寫 Mapper 接口篷店,具體的實現(xiàn)類由 MyBatis 代理生成。將之前開發(fā)中寫死的代碼 //session.selectList("com.jihe.domain.findByUsername", "波");
抽離出來。這樣更有利于后期代碼的維護疲陕,畢竟維護在開發(fā)中方淤,后期維護占整個軟件開發(fā)很重要的一部分。以上就是 mapper 動態(tài)代理的方式蹄殃,還是挺有意思的携茂。
- 以上 dome 地址點擊這里