mapper代理(十一)
?
? 原始?dao開發問題
1、dao接口實現類方法中存在大量模板方法,設想能否將這些代碼提取出來,大大減輕程序員的工作量。
2、調用sqlsession方法時將statement的id硬編碼了
3、調用sqlsession方法時傳入的變量,由于sqlsession方法使用泛型,即使變量類型傳入錯誤(傳入的是泛型類),在編譯階段也不報錯,不利于程序員開發。
?mapper代理方法(程序員只需要mapper接口(相當?于dao接口))
?思路(mapper代理開發規范):
Mapper代理開發避免了原始的dao接口開發中實現類的很多重復代碼,讓程序員減輕了工作量
Sql語句的刪除、更新、添加操作要進行會話的提交才會生效
程序員還需要編寫mapper.xml映射文件
程序員編寫mapper接口需要遵循一些開發規范,mybatis可以自動生成mapper接口實現類代理對象。
開發規范:
1、在mapper.xml中namespace等于mapper接口地址
2、mapper.java接口中的方法名和mapper.xml中statement的id一致
(使用mapper代理對象,mybatis會自動根據接口地址和命名空間去查找相對應的statement的id)
3、mapper.java接口中的方法輸入參數類型和mapper.xml中statement的parameterType指定的類型一致。
4、mapper.java接口中的方法返回值類型和mapper.xml中statement的resultType指定的類型一致。
?
?代理對象內部調用selectOne或selectList
如果mapper方法返回單個pojo對象(非集合對象),代理對象內部通過selectOne查詢數據庫。
如果mapper方法返回集合對象,代理對象內部通過selectList查詢數據庫。
?
?mapper接口方法參數只能有一個是否影響系統?開發
mapper接口方法參數只能有一個,系統是否不利于擴展維護。
系統?框架中,dao層的代碼是被業務層公用的。
即使mapper接口只有一個參數,可以使用包裝類型的pojo滿足不同的業務方法的需求。
注意:持久層方法的參數可以包裝類型、map。。。,service方法中建議不要使用包裝類型(不利于業務層的可擴展)。
?
eclipse項目的結構
?
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"> <!-- namespace命名空間,作用就死對sql進行分類化管理,理解sql隔離 注意:使用mapper代理方法開發,namespace有特殊重要的作用(剛開始學還不能理解) --> <mapper namespace="ql.mybatis.mapper.UserMapper"> <!-- 在映射文件中配置很多sql語句--> <!-- 需求:通過id查詢用戶表的記錄 --> <!-- 通過select 執行數據庫的查詢 id:標識映射文件的sql 將sql語句封裝到mappedStatement對象中,所以將id稱為statement的id parameterType:指定輸入參數的類型,這里指定int型 #{}表示一個占位符 #{id}:其中的id表示接受輸入的參數,參數名稱就是id,如果輸入的參數是簡單類型,#{}中的參數可以任意 resultType:指定sql輸出的結果的所映射的java對象類型,select指定restultType表示將單條記錄映射成java對象 --> <select id="findUserById" parameterType="int" resultType="ql.mybatis.pojo.User"> select * from User where id=#{id} </select> <select id="findUserById2" parameterType="ql.mybatis.pojo.User" resultType="ql.mybatis.pojo.User"> select * from User where sex=#{sex} and address=#{address} </select> <!-- 根據用戶名稱模糊查詢用戶信息,可能返回多條 resultType:指定就是單條記錄所映射的java對象 類型 ${}:表示拼接sql串,將接收到參數的內容不加任何修飾拼接在sql中。 使用${}拼接sql,引起 sql注入 ${value}:接收輸入 參數的內容,如果傳入類型是簡單類型,${}中只能使用value --> <select id="findUserByName" parameterType="String" resultType="ql.mybatis.pojo.User"> SELECT * FROM USER WHERE username LIKE '%${value}%' </select> <!-- 添加用戶 parameterType:指定輸入 參數類型是pojo(包括 用戶信息) #{}中指定pojo的屬性名,接收到pojo對象的屬性值,mybatis通過OGNL獲取對象的屬性值 --> <insert id="insertUser" parameterType="ql.mybatis.pojo.User"> insert into user(username,birthday,sex,address) value(#{username},#{birthday},#{sex},#{address}) </insert> <!-- 刪除用戶 --> <delete id="deleteUser" parameterType="java.lang.Integer"> delete from user where id=#{id} </delete> <!-- 更新用戶 必須指定id,否則將會將表的內容全部更新 --> <update id="updateUser" parameterType="ql.mybatis.pojo.User"> update user set username=#{username},birthday=#{birthday},sex=#{sex},address=#{address} where id=#{id} </update> </mapper>?
UserMapper接口:
package ql.mybatis.mapper;import java.util.List;import ql.mybatis.pojo.User; public interface UserMapper { public User findUserById(int id) throws Exception; public List<User> findUserByName(String name) throws Exception; public User findUserById2(User user) throws Exception; public void insertUser(User user) throws Exception; public void deleteUser(int id) throws Exception; }?
單元測試類:
?
package ql.mybatis.test;import java.io.InputStream; import java.util.Date; import java.util.List; import org.apache.ibatis.io.Resources; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; import org.junit.Before; import org.junit.Test; import ql.mybatis.mapper.UserMapper; import ql.mybatis.pojo.User; public class UserMapperTest { SqlSession sqlSession = null; @Before public void setUp() throws Exception { // mybatis配置文件 String resource = "SqlMapConfig.xml"; // 得到配置文件流 InputStream inputStream = Resources.getResourceAsStream(resource); // 創建會話工廠,傳入mybatis的配置文件信息 SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder() .build(inputStream); sqlSession = sqlSessionFactory.openSession(); } @Test public void testFindUserById() throws Exception { UserMapper userMapper = sqlSession.getMapper(UserMapper.class); User user = userMapper.findUserById(22); System.out.println(user); } @Test public void testFindUserByName() throws Exception { // 得到代理對象,接口回調 UserMapper userMapper = sqlSession.getMapper(UserMapper.class); List<User> list = userMapper.findUserByName("小明"); System.out.println(list); } @Test public void testInsertUser() throws Exception { UserMapper userMapper = sqlSession.getMapper(UserMapper.class); User user = new User(); user.setSex("1"); user.setAddress("北京市"); user.setBirthday(new Date()); user.setUsername("王大東"); userMapper.insertUser(user); sqlSession.commit(); } @Test public void testDeleteUser() throws Exception { UserMapper userMapper = sqlSession.getMapper(UserMapper.class); userMapper.deleteUser(10); sqlSession.commit(); } @Test public void testFindUserById2() throws Exception { UserMapper userMapper = sqlSession.getMapper(UserMapper.class); User user=new User(); user.setSex("1"); user.setAddress("福建福州"); User user2=userMapper.findUserById2(user); System.out.println(user2); } }?還應在配置文件中SqlMapConfig.xml加上:
<mapper resource="mapper/UserMapper.xml"/>?
可以看到并沒有寫UserMapper接口的實現類,mybatis幫我們生成了一個Mapper代理對象
?
轉載于:https://www.cnblogs.com/ql211lin/p/4530354.html
總結
以上是生活随笔為你收集整理的mapper代理(十一)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 《RESTful Web Service
- 下一篇: HDOJ acm steps 3.1