Java Mybatis框架Dao層的實(shí)現(xiàn)與映射文件以及核心配置文件詳解分析
Mybatis的Dao層實(shí)現(xiàn)
傳統(tǒng)開(kāi)發(fā)方式
1、編寫(xiě)UserDao接口
public interface UserMapper {
public List<User> findAll() throws IOException;
}
2、編寫(xiě)UserDaoImpl實(shí)現(xiàn)

3、測(cè)試傳統(tǒng)方式

代理開(kāi)發(fā)方式
代理開(kāi)發(fā)方式介紹
采用Mybatis的代理開(kāi)發(fā)方式實(shí)現(xiàn)DAO層的開(kāi)發(fā),這種方式是我們后面進(jìn)入企業(yè)的主流.
Mapper接口開(kāi)發(fā)方法只需要程序員編寫(xiě)Mapper接口(相當(dāng)于Dao接口),由Mybatis框架根據(jù)接口定義創(chuàng)建接口的動(dòng)態(tài)代理對(duì)象,代理對(duì)象的方法體同上邊Dao接口實(shí)現(xiàn)類(lèi)方法。
Mapper接口開(kāi)發(fā)需要遵循以下規(guī)范:
①M(fèi)apper.xml文件中的namespace與mapper接口的全限定名相同
②Mapper接口方法名和Mapper.xml中定義的每個(gè)statement的id相同
③Mapper接口方法的輸入?yún)?shù)類(lèi)型和mapper.xml中定義的每個(gè)sql的parameterType的類(lèi)型相同4、④Mapper接口方法的輸出參數(shù)類(lèi)型和mapper.xml中定義的每個(gè)sql的resultType的類(lèi)型相
同
1、編寫(xiě)UserMapper接口

2、測(cè)試代理方式

MyBatis映射文件深入
動(dòng)態(tài)sql語(yǔ)句
動(dòng)態(tài)sql語(yǔ)句描述【官方文檔】

動(dòng)態(tài)SQL之<if>
我們根據(jù)實(shí)體類(lèi)的不同取值,使用不同的SQL語(yǔ)句來(lái)進(jìn)行查詢(xún)。比如在 id如果不為空時(shí)可以根據(jù)id查詢(xún),如果username不同空時(shí)還要加入用戶(hù)名作為條件。這種情況在我們的多條件組合查詢(xún)中經(jīng)常會(huì)碰到。
<!--sql語(yǔ)句抽取-->
<sql id="selectUser">select * from user</sql>
<select id="findByCondition" parameterType="user" resultType="user">
<include refid="selectUser"></include>
<where>
<if test="id!=0">
and id=#{id}
</if>
<if test="username!=null">
and username=#{username}
</if>
<if test="password!=null">
and password=#{password}
</if>
</where>
</select>
當(dāng)查詢(xún)條件id和username都存在時(shí),測(cè)試代碼如下

動(dòng)態(tài)SQL之<foreach>
循環(huán)執(zhí)行sql的拼接操作,例如: SELECT * FROM USER WHERE id IN (1,2,5)。
<select id="findByIds" parameterType="list" resultType="user">
<include refid="selectUser"></include>
<where>
<foreach collection="list" open="id in(" close=")" item="id" separator=",">
#{id}
</foreach>
</where>
</select>
測(cè)試代碼如下

foreach標(biāo)簽的屬性含義如下:
<foreach>標(biāo)簽用于遍歷集合,它的屬性:
①collection:代表要遍歷的集合元素,注意編寫(xiě)時(shí)不要寫(xiě)#{}
②open:代表語(yǔ)句的開(kāi)始部分
③close:代表結(jié)束部分
④item:代表遍歷集合的每個(gè)元素,生成的變量名
⑤sperator:代表分隔符
SQL片段抽取
Sql中可將重復(fù)的sql提取出來(lái),使用時(shí)用include引用即可,最終達(dá)到sql重用的目的

總結(jié)
MyBatis映射文件配置:
<select>:查詢(xún)
<insert>:插入
<update>:修改
<delete>:刪除
<where> : where條件
<if>: if判斷
<foreach>:循環(huán)
<sql> : sql片段抽取
Mybatis核心配置文件深入
typeHandlers標(biāo)簽
無(wú)論是MyBatis在預(yù)處理語(yǔ)句(PreparedStatement)中設(shè)置一個(gè)參數(shù)時(shí),還是從結(jié)果集中取出一個(gè)值時(shí),都會(huì)用類(lèi)型處理器將獲取的值以合適的方式轉(zhuǎn)換成Java類(lèi)型。下表描述了一些默認(rèn)的類(lèi)型處理器(截取部分)。

可以重寫(xiě)類(lèi)型處理器或創(chuàng)建你自己的類(lèi)型處理器來(lái)處理不支持的或非標(biāo)準(zhǔn)的類(lèi)型。具體做法為:實(shí)現(xiàn)org.apache.ibatis.type.TypeHandler接口,或繼承一個(gè)很便利的類(lèi)org.apache.ibatis.type.BaseTypeHandler,然后可以選擇性地將它映射到一個(gè)JDBC類(lèi)型。例如需求:一個(gè)Java中的Date數(shù)據(jù)類(lèi)型,我想將之存到數(shù)據(jù)庫(kù)的時(shí)候存成一個(gè)1970年至今的毫秒數(shù),取出來(lái)時(shí)轉(zhuǎn)換成java的Date,即java的Date與數(shù)據(jù)庫(kù)的varchar毫秒值之間轉(zhuǎn)換。
開(kāi)發(fā)步驟:
①定義轉(zhuǎn)換類(lèi)繼承類(lèi)BaseTypeHandler<T>
②覆蓋4個(gè)未實(shí)現(xiàn)的方法,其中setNonNullarameter為java程序設(shè)置數(shù)據(jù)到數(shù)據(jù)庫(kù)的回調(diào)方法,getNullableResult為查詢(xún)時(shí) mysql的字符串類(lèi)型轉(zhuǎn)換成java的Type類(lèi)型的方法
③在MyBatis核心配置文件中進(jìn)行注冊(cè)
④測(cè)試轉(zhuǎn)換是否正確
public class DateTypeHandler extends BaseTypeHandler<Date> {
//將java類(lèi)型 轉(zhuǎn)換成 數(shù)據(jù)庫(kù)需要的類(lèi)型
public void setNonNullParameter(PreparedStatement preparedStatement, int i, Date date, JdbcType jdbcType) throws SQLException {
long time = date.getTime();
preparedStatement.setLong(i,time);
}
//將數(shù)據(jù)庫(kù)中類(lèi)型 轉(zhuǎn)換成java類(lèi)型
//String參數(shù) 要轉(zhuǎn)換的字段名稱(chēng)
//ResultSet 查詢(xún)出的結(jié)果集
public Date getNullableResult(ResultSet resultSet, String s) throws SQLException {
//獲得結(jié)果集中需要的數(shù)據(jù)(long) 轉(zhuǎn)換成Date類(lèi)型 返回
long aLong = resultSet.getLong(s);
Date date = new Date(aLong);
return date;
}
//將數(shù)據(jù)庫(kù)中類(lèi)型 轉(zhuǎn)換成java類(lèi)型
public Date getNullableResult(ResultSet resultSet, int i) throws SQLException {
long aLong = resultSet.getLong(i);
Date date = new Date(aLong);
return date;
}
//將數(shù)據(jù)庫(kù)中類(lèi)型 轉(zhuǎn)換成java類(lèi)型
public Date getNullableResult(CallableStatement callableStatement, int i) throws SQLException {
long aLong = callableStatement.getLong(i);
Date date = new Date(aLong);
return date;
}
}
<!--注冊(cè)自定義類(lèi)型處理器-->
<typeHandlers>
<typeHandler handler="com.longdi.handler.DateTypeHandler"></typeHandler>
</typeHandlers>
測(cè)試添加操作

數(shù)據(jù)庫(kù)數(shù)據(jù):

plugins標(biāo)簽
MyBatis可以使用第三方的插件來(lái)對(duì)功能進(jìn)行擴(kuò)展,分頁(yè)助手PageHelper是將分頁(yè)的復(fù)雜操作進(jìn)行封裝,使用簡(jiǎn)單的方式即可獲得分頁(yè)的相關(guān)數(shù)據(jù)
開(kāi)發(fā)步驟:
①導(dǎo)入通用PageHelper的坐標(biāo)
②在mybatis核心配置文件中配置PageHelper插件
③測(cè)試分頁(yè)數(shù)據(jù)獲取
①導(dǎo)入通用PageHelper的坐標(biāo)
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>3.7.5</version>
</dependency>
<dependency>
<groupId>com.github.jsqlparser</groupId>
<artifactId>jsqlparser</artifactId>
<version>0.9.1</version>
</dependency>
②在mybatis核心配置文件中配置PageHelper插件
<!--配置分頁(yè)助手插件 配置在mapper之前-->
<plugins>
<plugin interceptor="com.github.pagehelper.PageHelper">
<property name="dialect" value="mysql"></property>
</plugin>
</plugins>
③測(cè)試分頁(yè)數(shù)據(jù)獲取

獲得分頁(yè)相關(guān)的其他參數(shù)
//獲得與分頁(yè)相關(guān)參數(shù)
PageInfo<User> pageInfo = new PageInfo<User>(userList);
System.out.println("當(dāng)前頁(yè):"+pageInfo.getPageNum());
System.out.println("每頁(yè)顯示條數(shù):"+pageInfo.getPageSize());
System.out.println("總條數(shù):"+pageInfo.getTotal());
System.out.println("總頁(yè)數(shù):"+pageInfo.getPages());
System.out.println("上一頁(yè):"+pageInfo.getPrePage());
System.out.println("下一頁(yè):"+pageInfo.getNextPage());
System.out.println("是否是第一個(gè):"+pageInfo.isIsFirstPage());
System.out.println("是否是最后一個(gè):"+pageInfo.isIsLastPage());
總結(jié)
MyBatis核心配置文件常用標(biāo)簽:
1、properties標(biāo)簽:該標(biāo)簽可以加載外部的properties文件
2、 typeAliases標(biāo)簽:設(shè)置類(lèi)型別名
3、environments標(biāo)簽:數(shù)據(jù)源環(huán)境配置標(biāo)簽
4、typeHandlers標(biāo)簽:配置自定義類(lèi)型處理器
5、plugins標(biāo)簽:配置MyBatis的插件
到此這篇關(guān)于Java Mybatis框架Dao層的實(shí)現(xiàn)與映射文件以及核心配置文件詳解分析的文章就介紹到這了,更多相關(guān)Java Mybatis內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
springboot接收日期類(lèi)型參數(shù)的操作方法
如果使用Get請(qǐng)求,直接使用對(duì)象接收,則可以使用@DateTimeFormat注解進(jìn)行格式化,本文重點(diǎn)給大家介紹springboot接收日期類(lèi)型參數(shù)的方法,感興趣的朋友一起看看吧2024-02-02
利用javaFX實(shí)現(xiàn)移動(dòng)一個(gè)小球的示例代碼
這篇文章主要介紹了利用javaFX實(shí)現(xiàn)移動(dòng)一個(gè)小球的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-09-09
Java運(yùn)行時(shí)動(dòng)態(tài)生成對(duì)象的方法小結(jié)
Java是一門(mén)靜態(tài)語(yǔ)言,通常,我們需要的class在編譯的時(shí)候就已經(jīng)生成了,為什么有時(shí)候我們還想在運(yùn)行時(shí)動(dòng)態(tài)生成class呢?今天通過(guò)本文給大家分享Java運(yùn)行時(shí)動(dòng)態(tài)生成對(duì)象的方法小結(jié),需要的朋友參考下吧2021-08-08
Mybatis?如何開(kāi)啟控制臺(tái)打印sql語(yǔ)句
這篇文章主要介紹了Mybatis?如何開(kāi)啟控制臺(tái)打印sql語(yǔ)句問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-11-11
詳解Java中用于查找對(duì)象哈希碼值的hashCode()函數(shù)
Java中入HashMap等一些鍵值對(duì)應(yīng)的結(jié)構(gòu),基本上都可以用hashCode()來(lái)查找值,接下來(lái)我們就來(lái)詳解Java中用于查找對(duì)象哈希碼值的hashCode()函數(shù):2016-05-05
java實(shí)現(xiàn)代碼統(tǒng)計(jì)小程序
這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)代碼統(tǒng)計(jì)小程序,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-09-09
SpringBoot中restTemplate請(qǐng)求存在亂碼問(wèn)題的解決方法
這篇文章主要介紹了SpringBoot中restTemplate請(qǐng)求存在亂碼問(wèn)題的解決方法,文中有相關(guān)的圖文和代碼示例供大家參考,對(duì)大家的解決問(wèn)題有一定的幫助,需要的朋友可以參考下2024-11-11

