mybatis使用mapper代理開發(fā)方式
mapper代理開發(fā)規(guī)則
使用mybatis的代理開發(fā),不僅可以用來管理冗多的xml配置文件,還可以解決硬編碼,傳遞多個參數(shù),簡化執(zhí)行sql的優(yōu)點。
主要有以下注意事項:
- 定義與映射的配置文件(UserMapper.xml)同名的接口類,并且要在同一目錄下。
- 映射文件中的namspace屬性為接口類的路徑。
- 在接口類中實現(xiàn)映射的配置文件方法時,方法名和映射文件的id屬性的名稱一樣。返回數(shù)據(jù)類型也一樣。
- mybatis-config.xml的映射配置文件的路徑要一一對應(yīng)。
對上面有疑惑的可以看我之前的文章 mybatis基礎(chǔ)。
創(chuàng)建mapper目錄結(jié)構(gòu)和映射接口類
根據(jù)上面的規(guī)則來具體實現(xiàn),在java目錄下創(chuàng)建mapper軟件包,將UserMapper接口放在該目錄下。
在resources下創(chuàng)建mapper目錄,將隱射配置文件放在該目錄下。
可以下載mybatisX插件將兩者聯(lián)系起來。
maven目錄結(jié)構(gòu)下,java和resources編譯后在同一目錄下,他們里面的包也是。
所以滿足規(guī)則但是層級結(jié)構(gòu)必須一樣。
當然也可以直接將xml放在java目錄下的mapper包中即和UserMapper在一起,就不需要考慮其他問題了。滿足第一個規(guī)則。
修改映射配置文件的namespace屬性
使用mapper映射代理開發(fā),這個屬性就顯得尤為重要,UserMapper接口(映射接口類)和UserMapper.xml
(映射配置文件)的聯(lián)系都是產(chǎn)生于namespace屬性。
<?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="mapper.UserMapper"> <select id="selectAll" resultType="model.User"> select * from user </select> <select id="selectById" resultType="model.User"> select * from user where id=#{id} </select> </mapper>
將namespace的內(nèi)容由test(自定義)改為mapper.UserMapper(映射接口所在的路徑)。滿足第二個規(guī)則。
編寫映射接口類的方法
package mapper; import model.User; import java.util.List; public interface UserMapper { List<User> selectAll(); //默認public關(guān)鍵字修飾,selectAll對應(yīng)xml的id屬性 }
前面我們知道xml配置文件的id屬性本身時一個方法,可以看作mybatis將其封裝為一個resultSet(jdbc)的結(jié)果集,接口的作用主要是繼承該方法并處理結(jié)果集。
用list集合存儲結(jié)果集。滿足第三個規(guī)則
修改mybatis-config.xml的映射配置文件的路徑
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration> <environments default="development"> <environment id="development"> <transactionManager type="JDBC"/> <dataSource type="POOLED"> <!--連接配置-> <property name="driver" value="${driver}"/> <property name="url" value="${url}"/> <property name="username" value="${username}"/> <property name="password" value="${password}"/> </dataSource> </environment> </environments> <mappers> <!--mappper映射路徑--> <mapper resource="UserMapper.xml"/> </mappers> </configuration>
要修改的只有mapper標簽下顎resource屬性,內(nèi)容為映射配置文件的路徑:mapper/UserMapper.xml
這是我的目錄結(jié)構(gòu)每個人的不一樣。
當然你的映射配置文件較多時直接用packge標簽把整個mapper包直接加載進來(包掃描)
如果時直接把包導(dǎo)入的話,就不是/來展現(xiàn)目錄的層級了,而是.來體現(xiàn)。如util.chapter.mapper。實現(xiàn)規(guī)則四。
編寫測試類調(diào)用方法
package mybatis; import mapper.UserMapper; import model.User; 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.Test; import java.io.IOException; import java.io.InputStream; import java.util.List; public class MybatisTest { @Test public void method() throws IOException { //單元測試不能要static //mybatis框架都在xml配置文件中加載配置文件 //從 XML 文件中構(gòu)建 SqlSessionFactory 的實例 String resource = "mybatis-config.xml"; InputStream inputStream = null; inputStream = Resources.getResourceAsStream(resource); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); //從 SqlSessionFactory 中獲取 SqlSession SqlSession session = sqlSessionFactory.openSession(); //執(zhí)行sql //List<User> users=session.selectList("test.selectAll"); //System.out.println(users); //mapper代理執(zhí)行sql UserMapper userMapper=session.getMapper(UserMapper.class); List<User> users= userMapper.selectAll(); //UserMapper接口的實現(xiàn)方法 System.out.println(users); //釋放資源 session.close(); } }
注意要導(dǎo)入javabean和映射接口類。使用代理和不使用的區(qū)別。
如下面的映射文件的配置,那么如何調(diào)用有多個參數(shù)的方法呢?
配置文件xml
<select id="selectAll" resultType="model.User"> select * from user </select> <select id="selectById" resultType="model.User"> select * from user where id=#{id} </select> <select id="selectmore" resultType="model.User"> select * from user where id =#{id} and username=#{username} </select>
映射接口類
List<User> selectAll(); //默認public關(guān)鍵字修飾 List<User> selectById(int id); List<User> selectMore(int id,String name);
mybatis的參數(shù)傳遞:
當傳遞多個不同類型的參數(shù)時mybatis將參數(shù)封裝為map集合,并默認有key,可以通過@param注解更改key的名稱,value保留參數(shù)的值,通過更改后的key名稱獲取參數(shù)。當只有一個參數(shù)時就不用了。
javabean的參數(shù)類型:可以直接使用,對象的屬性名和參數(shù)占位符保持一致即可,上面使用的reultType手勢javabean對象,位置對應(yīng)就可以了。
Map集合 :map的鍵和參數(shù)占位符一致也直接使用。
(上面的數(shù)據(jù)類型可以直接傳遞,位置對應(yīng)即可)
array,list當數(shù)據(jù)類型都要加注解@param。
實際上sql的占位符會接收該方法傳遞的參數(shù),mybatis是將參數(shù)封裝為一個map集合,占位符的名稱就是key,但是系統(tǒng)默認的key并不是,需要用@param將默認的key改為占位符的名稱就可以了。
具體操作就是@param中的值與xml文件的占位符一致就可以了,緊跟著就是參數(shù)了。調(diào)用也是按位置傳參。
所有數(shù)據(jù)類型的都可以用注解@Param來傳參(P大寫)。
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
關(guān)于Java中的dozer對象轉(zhuǎn)換問題
Dozer是Java?Bean到Java?Bean映射器,它以遞歸方式將數(shù)據(jù)從一個對象復(fù)制到另一個對象,這篇文章主要介紹了Java中的dozer對象轉(zhuǎn)換的操作方法,需要的朋友可以參考下2022-08-08Mybatis利用分頁插件PageHelper快速實現(xiàn)分頁查詢
如果你也在用MyBatis,建議嘗試該分頁插件,這一定是最方便使用的分頁插件,這篇文章主要給大家介紹了關(guān)于Mybatis利用分頁插件PageHelper快速實現(xiàn)分頁查詢的相關(guān)資料,PageHelper是一個Mybatis的分頁插件,負責將已經(jīng)寫好的sql語句,進行分頁加工,需要的朋友可以參考下2021-08-08spring aop實現(xiàn)接口超時處理組件的代碼詳解
這篇文章給大家介紹了spring aop實現(xiàn)接口超時處理組件,文中有詳細的實現(xiàn)思路,并通過代碼示例給大家介紹的非常詳細,對大家的學(xué)習或工作有一定的幫助,需要的朋友可以參考下2024-02-02解決Weblogic部署war找不到spring配置文件的問題
這篇文章主要介紹了解決Weblogic部署war找不到spring配置文件的問題,具有很好的參考價值,希望對大家有所幫助。2021-07-07java內(nèi)存泄漏與內(nèi)存溢出關(guān)系解析
這篇文章主要介紹了java內(nèi)存泄漏與內(nèi)存溢出關(guān)系解析,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習或者工作具有一定的參考學(xué)習價值,需要的朋友可以參考下2019-12-12