【框架】mybatis 開發dao方法---mapper代理開發
mapper代理的開發
1、需要編寫mapper.xml對映檔案
2、需要編寫mapper.java介面檔案(mapper.java相當於dao介面)
1、接下來我們先將之前的mapper.xml對映檔案拷貝下來:
<mapper namespace="com.mybatis.mapper.UserMapper"> <select id="findUserById" parameterType="int" resultType="com.mybatis.pojo.User"> SELECT * FROM USER WHERE id=#{id} </select> <select id="findUserByName" parameterType="java.lang.String" resultType="com.mybatis.pojo.User"> SELECT * FROM USER WHERE username like '%${value}%' </select> <insert id="insertUser" parameterType="com.mybatis.pojo.User"> <!-- <selectKey keyProperty="id" order="AFTER" resultType="java.lang.Integer"> SELECT LAST_INSERT_ID() </selectKey> --> <selectKey keyProperty="id" order="BEFORE" resultType="java.lang.String"> SELECT UUID() </selectKey> insert into user(id,username,birthday,sex,address) value (#{id},#{username},#{birthday},#{sex},#{address}) <!-- insert into user(username,birthday,sex,address) value (#{username},#{birthday},#{sex},#{address}) --> </insert> <delete id="deleteUserById" parameterType="java.lang.String"> delete from user where id=#{id} </delete> <update id="upadteUserById" parameterType="com.mybatis.pojo.User" > update user set username=#{username},birthday=#{birthday},sex=#{sex},address=#{address} where id=#{id} </update> </mapper>
這就是我們的mapper.xml的配置檔案
2、然後是mapper.java介面的編寫,
public interface UserMapper {
//查詢使用者
public User findUserById(String id);
//刪除使用者
public void deleteUserById(String id);
//新增使用者
public void insertUser(User user);
//更新使用者
public void upadteUserById(User user);
}
mapper.java介面的編寫需要遵循一些開發規範:
1、在mapper.xml中namespace等於mapper介面地址。
2、mapper.java介面中的方法名與mapper.xml中的statement的id一直。
3、mapper.java介面中的方法輸入引數型別與mapper.xml中的statement的parameterType指定的型別一致。
4、mapper.java介面中的返回值型別與mapper.xml中statement的resultType指定的型別一致。
mapper.xml
<mapper namespace="com.mybatis.mapper.UserMapper"> <select id="findUserById" parameterType="int" resultType="com.mybatis.pojo.User"> SELECT * FROM USER WHERE id=#{id} </select>
mapper.java
public interface UserMapper {
//查詢使用者
public User findUserById(String id);
有了以上的配置,原來我們寫的下面的這些執行語句變成了自動生成:
User user = sqlSession.selectOne("test.findUserById", id);
sqlSession.insert("test.insertUser", user);
那麼自動生成的原理就是,以select查詢舉例,mapper.xml 的namespace對應介面,<select>標籤的id對應mapper.java介面中的方法名,引數型別和結果型別對應介面中的引數和返回值,執行語句的程式碼都是通過反射機制找到一一對應的位置並生成程式碼。
3、在sqlMapConfig中載入mapper.xml檔案
<!-- 載入對映檔案 -->
<mappers>
<mapper resource="sqlMap/User.xml"/>
<package name="com.mybatis.mapper"/>
</mappers>
4、測試
@Test
public void testFindUserById() throws Exception{
SqlSession sqlSession = null;
try {
// mybatis配置檔案
String resource = "SqlMapConfig.xml";
// 得到配置檔案流
InputStream inputStream;
inputStream = Resources.getResourceAsStream(resource);
// 建立會話工廠,傳入mybaatis的配置檔案資訊
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(inputStream);
sqlSession = factory.openSession();
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
User user = userMapper.findUserById(27);
得到sqlSession ,建立UserMapper物件,mybatis自動生成mapper物件:
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
一些問題
- 代理物件內部呼叫selectOne或selectList
如果mapper方法返回單個pojo物件(非集合物件),代理物件內部通過selectOne查詢資料庫。
如果mapper方法返回集合物件,代理物件內部通過selectList查詢資料庫。
- 2、mapper介面方法引數只能有一個是否影響系統 開發
系統 框架中,dao層的程式碼是被業務層公用的。
即使mapper介面只有一個引數,可以使用包裝型別的pojo滿足不同的業務方法的需求。
注意:持久層方法的引數可以包裝型別、map。。。,service方法中建議不要使用包裝型別(不利於業務層的可擴充套件)。