最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

MyBatis?typeHandler接口的定義和使用

 更新時(shí)間:2023年05月17日 10:23:01   作者:shenzhenNBA  
TypeHandler被稱作類型處理器,MyBatis在設(shè)置預(yù)處理語(yǔ)句中的參數(shù)或從結(jié)果集中取出一個(gè)值時(shí),都會(huì)用類型處理器將Java對(duì)象轉(zhuǎn)化為數(shù)據(jù)庫(kù)支持的類型或者將獲取到數(shù)據(jù)庫(kù)值以合適的方式轉(zhuǎn)換成Java類型,感興趣的同學(xué)可以參考下文

在Java項(xiàng)目中一般我們都需要處理數(shù)據(jù)庫(kù)表到Java的Bean對(duì)象的映射關(guān)系,常用的ORM框架有mybatis,在大多數(shù)據(jù)情況下,數(shù)據(jù)庫(kù)的數(shù)據(jù)類型到Java的數(shù)據(jù)類型滿足我們的需要,例如varchar到String,int到int等,但是有些時(shí)候項(xiàng)目需要完成數(shù)據(jù)庫(kù)數(shù)據(jù)類型到Java的某個(gè)數(shù)據(jù)類型的映射,mybatis現(xiàn)有的typeHandler不滿足要求,所以需要用戶自己開發(fā)用戶自定義的typeHandler類型,以滿足要求;

例如,數(shù)據(jù)庫(kù)需要保存用戶喜歡的產(chǎn)品,表字段以varchar類型保存,同時(shí)是一個(gè)符合JSON格式的列表,每個(gè)產(chǎn)品信息按 "產(chǎn)品名稱(產(chǎn)品代碼)",所以最終結(jié)果:["產(chǎn)品名稱1(產(chǎn)品代碼1)","產(chǎn)品名稱2(產(chǎn)品代碼2)"],即符合列表格式的JSON字符串,其對(duì)應(yīng)的Java的Bean變量為一個(gè)字符型的List變量,即List<String>,所以需要完成數(shù)據(jù)庫(kù)表字段的Varchar數(shù)據(jù)類型到Java的List<String>的映射處理關(guān)系,現(xiàn)有的typeHandler類型不足以滿足要求,所以我們需要開發(fā)一個(gè)用戶自定義的mybatis的typeHandler來(lái)處理這個(gè)問(wèn)題,然后應(yīng)用到mapper的XML文件中,大致框架代碼(具體自行豐富補(bǔ)充)和步驟如下:

1,引入相關(guān)依賴Jar包,版本看自行根據(jù)需要定義

<!-- mybatis依賴 -->
<dependency>  
    <groupId>org.mybatis.spring.boot</groupId>  
    <artifactId>mybatis-spring-boot-starter</artifactId>  
    <version>2.0.0</version>  
</dependency>
<!-- 數(shù)據(jù)庫(kù)連接池 -->
<dependency>  
    <groupId>com.alibaba</groupId>  
    <artifactId>druid</artifactId>  
    <version>1.1.10</version>  
</dependency>
<!-- mysql數(shù)據(jù)庫(kù)連接 -->
<dependency>  
    <groupId>mysql</groupId>  
    <artifactId>mysql-connector-java</artifactId>  
    <version>5.1.48</version>
	<!--此僅參考,版本根據(jù)需要而定-->
</dependency>

2,用戶相關(guān)的JavaBean對(duì)象

package com.xx.yy.zz.model; 
import java.util.List;
public class UserProduct {
	private String userName;
	private String userCode
	//DB字段以JSON格式保存:["產(chǎn)品名1(產(chǎn)品代碼1)","產(chǎn)品名2(產(chǎn)品代碼2)",...]
	private List<String> likeProducts = new ArraryList<String>();
	//...other... 
	//...setter/getter省略...
}

3,自定義DB表字段(內(nèi)容為符合JSON格式的字符串列表)的varchar數(shù)據(jù)類型到Java的List的映射處理關(guān)系的typeHandler開發(fā)

package com.xx.yy.zz.orm; 
import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.List;
import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;
import org.apache.ibatis.type.MappedJdbcTypes;
import org.apache.ibatis.type.MappedTypes;
import com.alibaba.fastjson.JSONObject; //需要fastjson的jar包支持
@MappedTypes(List.class) //映射的Java數(shù)據(jù)類型
@MappedJdbcTypes(JdbcType.VARCHAR)  //映射的JDBC數(shù)據(jù)類型
public class MyListTypeHandler extends BaseTypeHandler<List<String>>{
	//List列表中如果為其它對(duì)象xxJavaBean則把String換為目標(biāo)對(duì)象	
	//重寫mybatis設(shè)置參數(shù)的方法
	@Override
	public void setNonNullParameter(PreparedStatement ps,int i, List<String> param,
		JdbcType jdbcType) throws SQLException {
		ps.setString(i, JSONObject.toJSONString(param));
	}
	//重寫mybatis獲取字段字符串型內(nèi)容到Bean類List變量的方法
	@Override
	public List<String> getNullableResult(ResultSet rs, String columnName)
		throws SQLException{
		String tempJson = rs.getString(columnName);
		if (null != tempJson && !tempJson.trim().isEmpty()){
			return JSONObject.parseArray(tempJson,String.class);
		}
		return null;
	}
	@Override
	public List<String> getNullableResult(ResultSet rs, int columnIndex)
		throws SQLException{
		String tempJson = rs.getString(columnIndex);
		if (null != tempJson && !tempJson.trim().isEmpty()){
			return JSONObject.parseArray(tempJson,String.class);
		}
		return null;
	}
	@Override
	public List<String> getNullableResult(CallableStatement cs, int columnIndex)
		throws SQLException{
		String tempJson = cs.getString(columnName);
		if (null != tempJson && !tempJson.trim().isEmpty()){
			return JSONObject.parseArray(tempJson,String.class);
		}
		return null;
	}
}

4, 操作數(shù)據(jù)庫(kù)的DAO層定義

package com.xx.yy.zz.dao;
import com.xx.yy.zz.model.UserProduct;
public interface UserProductDao {
	int insertRecord(UserProduct record);
	int updateRecord(UserProduct record);
	//...more code...
}

5,在springboot的配置yml文件中進(jìn)行mybatis相關(guān)配置

#其它配置項(xiàng)省略

mybatis:

mapper-locations: classpath:mapper/*Mapper.xml

type-aliases-package: com.xx.yy.zz.model

6,在Mapper的XML文件中應(yīng)用自定義的typeHandler類型,部分代碼如下

<mapper namespace="com.xx.yy.zz.dao.UserProductDao" >
	<resultMap id="resultMap" type="com.xx.yy.zz.model.Product">
		<id column="id" property="id" jdbcType="Decimal">
		<result column="likeProdcts" property="likeProdcts" jdbcType="varchar"
			typeHandler="com.xx.yy.zz.orm.MyListTypeHandler">
		<!-- ...other result... -->
	</resultMap>
</mapper>
<!-- 新增 -->
<insert id="insertRecord" parameterType="UserProduct">
	insert into xxTable
	<trim prefix="(" suffix=")" suffixOverride=",">
		<if test="userName != null">
		userName,
		</if>
		<!-- ...other... -->
		<if test="likeProdcts != null">
		likeProdcts,
		</if>		
	</trim>
	<trim prefix=" values (" suffix=")" suffixOverride=",">
		<if test="userName != null">
		#{userName,jdbcType=varchar},
		</if
		<!-- ...other... -->
		<if test="likeProdcts != null">
		#{likeProdcts,jdbcType=varchar,typeHandler=com.xx.yy.zz.orm.MyListTypeHandler},
		</if>
	</trim>
</insert>
<!-- 更新 -->
<update id="updateRecord" parameterType="UserProduct">
	update xxTable 
	<set>
		<if test="likeProdcts != null">
		#{likeProdcts,jdbcType=varchar,typeHandler=com.xx.yy.zz.orm.MyListTypeHandler},
		</if>
		<!-- ...other... -->
	</set>
	where id = #{id,jdbcType=decimal}
</update>

這樣處理之后即可滿足,數(shù)據(jù)庫(kù)表字段數(shù)據(jù)類型為varchar類型,字段保存內(nèi)容為符合JSON格式的字符串,到JavaBean對(duì)象為L(zhǎng)ist<String>列表類型的映射和處理,從Java持久化到表字段時(shí)自動(dòng)轉(zhuǎn)化為符合JSON格式的內(nèi)容保存,另一方面,程序從DB表字段內(nèi)容讀取到Java程序時(shí)內(nèi)容自動(dòng)轉(zhuǎn)化為L(zhǎng)ist<String>,非常方便,另外數(shù)組類型String[]也可以,但是Java對(duì)數(shù)組的增刪等操作,不如 List 方便,所以推薦使用 List 比較好,當(dāng)然,本例List中列表的項(xiàng)為String類型,那如果為某個(gè)JavaBean對(duì)象呢?其實(shí)完全可以,方法類似的,這里為簡(jiǎn)單舉例就用String,本身String也是一個(gè)對(duì)象;

除了我們自定義的 MyListTypeHandler 類型外,其mybatis本身內(nèi)部已經(jīng)含有很多的typeHandler類型,例如:BooleanTypeHandler,ByteTypeHandler,ShortTypeHandler,IntegerTypeHandler,LongTypeHandler,F(xiàn)loatTypeHandler,DoubleTypeHandler,StringTypeHandler,ClobTypeHandler,DateTypeHandler等等這些其實(shí)就是默認(rèn)已經(jīng)在為我們處理完成映射關(guān)系了,只不過(guò)內(nèi)部已經(jīng)有,且直接內(nèi)部自動(dòng)完成映射,我們不需要顯示指定typeHandler而已,這就是mybatis框架的功能,已經(jīng)幫我們完成了絕大部分功能,我們僅需處理一下特別的或特定需要即可;

到此這篇關(guān)于MyBatis typeHandler接口的定義和使用的文章就介紹到這了,更多相關(guān)MyBatis typeHandler內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 深入淺出Java 抽象類與接口及區(qū)別對(duì)比分析

    深入淺出Java 抽象類與接口及區(qū)別對(duì)比分析

    抽象類和接口是Java中實(shí)現(xiàn)多態(tài)和設(shè)計(jì)模式的重要工具,它們?cè)诰幊讨芯哂兄匾牡匚?能夠有效提高代碼的靈活性和可維護(hù)性,本文給大家介紹Java抽象類與接口及區(qū)別對(duì)比分析,感興趣的朋友跟隨小編一起看看吧
    2025-11-11
  • Java 配置加載機(jī)制詳解及實(shí)例

    Java 配置加載機(jī)制詳解及實(shí)例

    這篇文章主要介紹了Java 配置加載機(jī)制詳解及實(shí)例的相關(guān)資料,需要的朋友可以參考下
    2016-09-09
  • @KafkaListener 如何使用

    @KafkaListener 如何使用

    這篇文章主要介紹了@KafkaListener 如何使用,本文通過(guò)圖文實(shí)例代碼相結(jié)合給大家詳細(xì)講解,文末給大家介紹了kafka的消費(fèi)者分區(qū)分配策略,需要的朋友可以參考下
    2023-02-02
  • 詳解如何在Java中實(shí)現(xiàn)屏幕共享

    詳解如何在Java中實(shí)現(xiàn)屏幕共享

    在本文中,將為大家展示如何利用 JxBrowser 的功能,實(shí)現(xiàn)運(yùn)行在不同電腦上的兩個(gè) Java 應(yīng)用程序之間的屏幕共享,感興趣的小伙伴可以參考一下
    2024-10-10
  • SpringBoot下載docx文檔方式

    SpringBoot下載docx文檔方式

    這篇文章主要介紹了SpringBoot下載docx文檔方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2025-06-06
  • springboot整合solr的方法詳解

    springboot整合solr的方法詳解

    這篇文章主要介紹了springboot整合solr的方法詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-08-08
  • Java項(xiàng)目中如何訪問(wèn)WEB-INF下jsp頁(yè)面

    Java項(xiàng)目中如何訪問(wèn)WEB-INF下jsp頁(yè)面

    這篇文章主要介紹了Java項(xiàng)目中如何訪問(wèn)WEB-INF下jsp頁(yè)面,文章通過(guò)示例代碼和圖文解析介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-08-08
  • application.yaml與bootstrap.yaml的使用

    application.yaml與bootstrap.yaml的使用

    這篇文章主要介紹了application.yaml與bootstrap.yaml的使用方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-08-08
  • sprinboot項(xiàng)目啟動(dòng)一半到圖形化界面卡住了的解決

    sprinboot項(xiàng)目啟動(dòng)一半到圖形化界面卡住了的解決

    這篇文章主要介紹了sprinboot項(xiàng)目啟動(dòng)一半到圖形化界面卡住了的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-10-10
  • 使用AOP+反射實(shí)現(xiàn)自定義Mybatis多表關(guān)聯(lián)查詢

    使用AOP+反射實(shí)現(xiàn)自定義Mybatis多表關(guān)聯(lián)查詢

    這篇文章主要介紹了使用AOP+反射實(shí)現(xiàn)自定義Mybatis多表關(guān)聯(lián),目前的需求是增強(qiáng)現(xiàn)有的查詢,使用簡(jiǎn)單的注解即可實(shí)現(xiàn)多表關(guān)聯(lián),本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2022-05-05

最新評(píng)論

维西| 铅山县| 桑日县| 山阴县| 尤溪县| 修水县| 乐至县| 洪江市| 崇信县| 威信县| 广元市| 濮阳市| 德化县| 宽城| 昔阳县| 林芝县| 阳山县| 宣汉县| 万源市| 周口市| 确山县| 准格尔旗| 介休市| 剑河县| 广汉市| 靖宇县| 永川市| 北碚区| 九龙城区| 吉首市| 泽普县| 昆明市| 涞源县| 应城市| 孙吴县| 盐边县| 禹城市| 呼伦贝尔市| 农安县| 文登市| 武隆县|