MyBatis?typeHandler接口的定義和使用
在Java項目中一般我們都需要處理數(shù)據(jù)庫表到Java的Bean對象的映射關系,常用的ORM框架有mybatis,在大多數(shù)據(jù)情況下,數(shù)據(jù)庫的數(shù)據(jù)類型到Java的數(shù)據(jù)類型滿足我們的需要,例如varchar到String,int到int等,但是有些時候項目需要完成數(shù)據(jù)庫數(shù)據(jù)類型到Java的某個數(shù)據(jù)類型的映射,mybatis現(xiàn)有的typeHandler不滿足要求,所以需要用戶自己開發(fā)用戶自定義的typeHandler類型,以滿足要求;
例如,數(shù)據(jù)庫需要保存用戶喜歡的產(chǎn)品,表字段以varchar類型保存,同時是一個符合JSON格式的列表,每個產(chǎn)品信息按 "產(chǎn)品名稱(產(chǎn)品代碼)",所以最終結果:["產(chǎn)品名稱1(產(chǎn)品代碼1)","產(chǎn)品名稱2(產(chǎn)品代碼2)"],即符合列表格式的JSON字符串,其對應的Java的Bean變量為一個字符型的List變量,即List<String>,所以需要完成數(shù)據(jù)庫表字段的Varchar數(shù)據(jù)類型到Java的List<String>的映射處理關系,現(xiàn)有的typeHandler類型不足以滿足要求,所以我們需要開發(fā)一個用戶自定義的mybatis的typeHandler來處理這個問題,然后應用到mapper的XML文件中,大致框架代碼(具體自行豐富補充)和步驟如下:
1,引入相關依賴Jar包,版本看自行根據(jù)需要定義
<!-- mybatis依賴 --> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>2.0.0</version> </dependency> <!-- 數(shù)據(jù)庫連接池 --> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.1.10</version> </dependency> <!-- mysql數(shù)據(jù)庫連接 --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.48</version> <!--此僅參考,版本根據(jù)需要而定--> </dependency>
2,用戶相關的JavaBean對象
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表字段(內容為符合JSON格式的字符串列表)的varchar數(shù)據(jù)類型到Java的List的映射處理關系的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列表中如果為其它對象xxJavaBean則把String換為目標對象 //重寫mybatis設置參數(shù)的方法 @Override public void setNonNullParameter(PreparedStatement ps,int i, List<String> param, JdbcType jdbcType) throws SQLException { ps.setString(i, JSONObject.toJSONString(param)); } //重寫mybatis獲取字段字符串型內容到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ù)庫的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文件中進行mybatis相關配置
#其它配置項省略
mybatis:
mapper-locations: classpath:mapper/*Mapper.xml
type-aliases-package: com.xx.yy.zz.model
6,在Mapper的XML文件中應用自定義的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ù)庫表字段數(shù)據(jù)類型為varchar類型,字段保存內容為符合JSON格式的字符串,到JavaBean對象為List<String>列表類型的映射和處理,從Java持久化到表字段時自動轉化為符合JSON格式的內容保存,另一方面,程序從DB表字段內容讀取到Java程序時內容自動轉化為List<String>,非常方便,另外數(shù)組類型String[]也可以,但是Java對數(shù)組的增刪等操作,不如 List 方便,所以推薦使用 List 比較好,當然,本例List中列表的項為String類型,那如果為某個JavaBean對象呢?其實完全可以,方法類似的,這里為簡單舉例就用String,本身String也是一個對象;
除了我們自定義的 MyListTypeHandler 類型外,其mybatis本身內部已經(jīng)含有很多的typeHandler類型,例如:BooleanTypeHandler,ByteTypeHandler,ShortTypeHandler,IntegerTypeHandler,LongTypeHandler,F(xiàn)loatTypeHandler,DoubleTypeHandler,StringTypeHandler,ClobTypeHandler,DateTypeHandler等等這些其實就是默認已經(jīng)在為我們處理完成映射關系了,只不過內部已經(jīng)有,且直接內部自動完成映射,我們不需要顯示指定typeHandler而已,這就是mybatis框架的功能,已經(jīng)幫我們完成了絕大部分功能,我們僅需處理一下特別的或特定需要即可;
到此這篇關于MyBatis typeHandler接口的定義和使用的文章就介紹到這了,更多相關MyBatis typeHandler內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
- MyBatis中的自定義TypeHandler詳解
- Mybatis中自定義TypeHandler處理枚舉的示例代碼
- Mybatis的TypeHandler實現(xiàn)數(shù)據(jù)加解密詳解
- Mybatis中TypeHandler使用小結
- SpringBoot中MyBatis使用自定義TypeHandler的實現(xiàn)
- Mybatis使用typeHandler加密的實現(xiàn)
- MyBatis-Plus?中?typeHandler?的使用實例詳解
- MyBatis中TypeHandler的使用教程詳解
- MyBatis類型處理器TypeHandler的作用及說明
- MyBatis自定義TypeHandler實現(xiàn)字段加密解密