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

mybatis中實(shí)現(xiàn)枚舉自動(dòng)轉(zhuǎn)換方法詳解

 更新時(shí)間:2017年08月21日 10:36:55   作者:Fighter168  
在使用mybatis的時(shí)候經(jīng)常會(huì)遇到枚舉類型的轉(zhuǎn)換,下面這篇文章主要給大家介紹了關(guān)于mybatis中實(shí)現(xiàn)枚舉自動(dòng)轉(zhuǎn)換的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起看看吧。

前言

最近在工作中遇到一個(gè)問題,在設(shè)計(jì)數(shù)據(jù)庫的時(shí)候,我們有時(shí)候會(huì)把表里的某個(gè)字段的值設(shè)置為數(shù)字或者為英文來表示他的一些特殊含義。就拿設(shè)置成數(shù)字來說,假如1對(duì)應(yīng)是學(xué)生,2對(duì)應(yīng)是教師,在Java里面定義成這樣的枚舉,但是一般使用mybatis查出來的話,我們想要讓它自動(dòng)裝換成我們想要的枚舉,不需要再手動(dòng)根據(jù)數(shù)值去判斷設(shè)置成我們想要的枚舉。要是實(shí)現(xiàn)這樣的效果,那么我們就要用到mybatis的BaseTypeHandler了。

BaseTypeHandler介紹

讓我們來看看要繼承BaseTypeHandler這個(gè)抽象類,需要覆寫哪些方法:

public abstract void setNonNullParameter(PreparedStatement ps, int i, T parameter, JdbcType jdbcType) throws SQLException; 
 
public abstract T getNullableResult(ResultSet rs, String columnName) throws SQLException; 
 
public abstract T getNullableResult(ResultSet rs, int columnIndex) throws SQLException; 
 
public abstract T getNullableResult(CallableStatement cs, int columnIndex) throws SQLException; 

實(shí)現(xiàn)了這些抽象類,當(dāng)?shù)玫浇Y(jié)果集的時(shí)候,程序就會(huì)回調(diào)這些方法,例如根據(jù)名稱獲取當(dāng)前行的某一列的值,那么就會(huì)直接回調(diào)getNullableResult(ResultSet rs, String columnName)這個(gè)方法,根據(jù)名稱得到當(dāng)行的當(dāng)前列的值,然后我們在這里去調(diào)用枚舉,匹配枚舉中的每一個(gè)值,相等的話直接返回該枚舉,達(dá)到自動(dòng)轉(zhuǎn)換成我們想要的枚舉的效果。其他的重載方法類似,只不過是有些根據(jù)列索引,有些根據(jù)列名稱做枚舉自動(dòng)轉(zhuǎn)換而已。

好了,介紹就到這里,讓我們來看看具體實(shí)現(xiàn)。。

自動(dòng)轉(zhuǎn)換實(shí)現(xiàn)例子

創(chuàng)建數(shù)據(jù)庫表


創(chuàng)建枚舉

package net.itaem.less; 
 
import java.util.HashMap; 
import java.util.Map; 
 
/** 
 * @author: Fighter168 
 */ 
public enum PersonType{ 
 STUDENT("1","學(xué)生"), 
 TEACHER("2","教師"); 
 
 private String value; 
 private String displayName; 
 
 static Map<String,PersonType> enumMap=new HashMap<String, PersonType>(); 
 static{ 
 for(PersonType type:PersonType.values()){ 
  enumMap.put(type.getValue(), type); 
 } 
 } 
 
 private PersonType(String value,String displayName) { 
  this.value=value; 
  this.displayName=displayName; 
 } 
 
 public String getValue() { 
 return value; 
 } 
 public void setValue(String value) { 
 this.value = value; 
 } 
 public String getDisplayName() { 
 return displayName; 
 } 
 public void setDisplayName(String displayName) { 
 this.displayName = displayName; 
 } 
 
 public static PersonType getEnum(String value) { 
 return enumMap.get(value); 
 } 
} 

創(chuàng)建Po實(shí)體類

/** 
 * @author: Fighter168 
 */ 
public class Person { 
 private String id; 
 private String name; 
 //枚舉 
 private PersonType personType; 
 //set get 方法。。 
} 

創(chuàng)建Dao接口

創(chuàng)建一個(gè)簡單的測試dao,這里簡單的提供一個(gè)測試的查詢方法。

/** 
 * @author: Fighter168 
 */ 
public interface PersonDao { 
 
 public List<Person> query(); 
 
} 

創(chuàng)建枚舉轉(zhuǎn)換處理器

package net.itaem.handler; 
 
import java.sql.CallableStatement; 
import java.sql.PreparedStatement; 
import java.sql.ResultSet; 
import java.sql.SQLException; 
 
import net.itaem.less.PersonType; 
 
import org.apache.ibatis.type.BaseTypeHandler; 
import org.apache.ibatis.type.JdbcType; 
 
/** 
 * @author: Fighter168 
 */ 
public class PersonTypeHandler extends BaseTypeHandler<PersonType>{ 
 
 private Class<PersonType> type; 
 
 private PersonType[] enums; 
 
 /** 
 * 設(shè)置配置文件設(shè)置的轉(zhuǎn)換類以及枚舉類內(nèi)容,供其他方法更便捷高效的實(shí)現(xiàn) 
 * @param type 配置文件中設(shè)置的轉(zhuǎn)換類 
 */ 
 public PersonTypeHandler(Class<PersonType> type) { 
 if (type == null) 
  throw new IllegalArgumentException("Type argument cannot be null"); 
 this.type = type; 
 this.enums = type.getEnumConstants(); 
 if (this.enums == null) 
  throw new IllegalArgumentException(type.getSimpleName() 
   + " does not represent an enum type."); 
 } 
 
 @Override 
 public PersonType getNullableResult(ResultSet rs, String columnName) throws SQLException { 
 // 根據(jù)數(shù)據(jù)庫存儲(chǔ)類型決定獲取類型,本例子中數(shù)據(jù)庫中存放String類型 
 String i = rs.getString(columnName); 
 if (rs.wasNull()) { 
  return null; 
 } else { 
  // 根據(jù)數(shù)據(jù)庫中的value值,定位PersonType子類 
  return PersonType.getEnum(i); 
 } 
 } 
 
 @Override 
 public PersonType getNullableResult(ResultSet rs, int columnIndex) throws SQLException { 
 // 根據(jù)數(shù)據(jù)庫存儲(chǔ)類型決定獲取類型,本例子中數(shù)據(jù)庫中存放String類型 
  String i = rs.getString(columnIndex); 
 if (rs.wasNull()) { 
  return null; 
 } else { 
  // 根據(jù)數(shù)據(jù)庫中的value值,定位PersonType子類 
  return PersonType.getEnum(i); 
 } 
 } 
 
 @Override 
 public PersonType getNullableResult(CallableStatement cs, int columnIndex) throws SQLException { 
  // 根據(jù)數(shù)據(jù)庫存儲(chǔ)類型決定獲取類型,本例子中數(shù)據(jù)庫中存放String類型 
 String i = cs.getString(columnIndex); 
 if (cs.wasNull()) { 
  return null; 
 } else { 
  // 根據(jù)數(shù)據(jù)庫中的value值,定位PersonType子類 
  return PersonType.getEnum(i); 
 } 
 } 
 
 @Override 
 public void setNonNullParameter(PreparedStatement ps, int i, PersonType parameter, JdbcType jdbcType) 
  throws SQLException { 
 // baseTypeHandler已經(jīng)幫我們做了parameter的null判斷 
 ps.setString(i, parameter.getValue()); 
 
 } 
 
} 

創(chuàng)建Mapper映射文件

PersonDao對(duì)應(yīng)的PersonMapper映射文件

<?xml version="1.0" encoding="UTF-8" ?> 
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://www.mybatis.org/dtd/mybatis-3-mapper.dtd" > 
<mapper namespace="net.itaem.dao.PersonDao" > 
 
 <resultMap id="resultMap" type="net.itaem.po.Person" > 
 <result column="id" property="id" jdbcType="CHAR" /> 
 <result column="name" property="name" jdbcType="CHAR" /> 
 <result column="type" property="personType" jdbcType="CHAR" /> 
 </resultMap> 
 
 <select id="query" resultMap="resultMap"> 
 select * from person 
 </select> 
 
</mapper> 

其實(shí)handler還可以寫在PersonMapper.xml這里,寫成下面這樣:

<result column="type" property="personType" typeHandler="net.itaem.handler.PersonTypeHandler"/> 

創(chuàng)建Spring的配置文件

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
 xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd"> 
 <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> 
  <property name="driverClassName" value="com.mysql.jdbc.Driver"/> 
  <property name="url" value="jdbc:mysql://localhost:3306/test"/> 
  <property name="username" value="root"/> 
  <property name="password" value="123abc"/> 
  <!-- 連接池啟動(dòng)時(shí)候的初始連接數(shù) --> 
  <property name="initialSize" value="10"/> 
  <!-- 最小空閑值 --> 
  <property name="minIdle" value="5"/> 
  <!-- 最大空閑值 --> 
  <property name="maxIdle" value="20"/> 
  <property name="maxWait" value="2000"/> 
  <!-- 連接池最大值 --> 
  <property name="maxActive" value="50"/> 
  <property name="logAbandoned" value="true"/> 
  <property name="removeAbandoned" value="true"/> 
  <property name="removeAbandonedTimeout" value="180"/> 
 </bean> 
 
 <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> 
 <property name="configLocation" value="classpath:/resource/cfg.xml"/> 
 <property name="dataSource" ref="dataSource"/> 
 </bean> 
 
 <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> 
  <property name="basePackage" value="net.itaem.dao"/> 
 </bean> 
</beans> 

創(chuàng)建mybatis的配置文件

下面是為mybatis創(chuàng)建配置文件cfg.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> 
 <typeHandlers> 
 <typeHandler handler="net.itaem.handler.PersonTypeHandler" 
  javaType="net.itaem.less.PersonType" jdbcType="CHAR"/> 
 </typeHandlers> 
 <!-- mapping 文件路徑配置 --> 
 <mappers> 
 <mapper resource="resource/PersonMapper.xml" /> 
 </mappers> 
</configuration> 

創(chuàng)建測試用例

/** 
 * @author: Fighter168 
 */ 
public class SpringTest { 
 
 public static void main(String[] args) { 
 ApplicationContext context=new ClassPathXmlApplicationContext("resource/ApplicationContext.xml"); 
 PersonDao personDao=(PersonDao) context.getBean("personDao"); 
 List<Person> list=personDao.query(); 
 for(Person p:list){ 
  System.out.println(p.toString()); 
 } 
 } 
} 

測試結(jié)果展示

結(jié)果是成功自動(dòng)轉(zhuǎn)換成了我們想要的枚舉

總結(jié)

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作能帶來一定的幫助,如果有疑問大家可以留言交流,謝謝大家對(duì)腳本之家的支持。

相關(guān)文章

  • spring?boot項(xiàng)目實(shí)戰(zhàn)之實(shí)現(xiàn)與數(shù)據(jù)庫的連接

    spring?boot項(xiàng)目實(shí)戰(zhàn)之實(shí)現(xiàn)與數(shù)據(jù)庫的連接

    在我們?nèi)粘5拈_發(fā)過程中,肯定不可避免的會(huì)使用到數(shù)據(jù)庫以及SQL?語句,下面這篇文章主要給大家介紹了關(guān)于spring?boot項(xiàng)目實(shí)戰(zhàn)之實(shí)現(xiàn)與數(shù)據(jù)庫連接的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-05-05
  • 使用SpringMVC接收文件流上傳和表單參數(shù)

    使用SpringMVC接收文件流上傳和表單參數(shù)

    這篇文章主要介紹了使用SpringMVC接收文件流上傳和表單參數(shù),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-02-02
  • Java設(shè)計(jì)模式中的裝飾者模式

    Java設(shè)計(jì)模式中的裝飾者模式

    這篇文章主要介紹了Java設(shè)計(jì)模式中的裝飾者模式,裝飾者模式即Decorator?Pattern,裝飾模式是在不必改變原類文件和使用繼承的情況下,動(dòng)態(tài)地?cái)U(kuò)展一個(gè)對(duì)象的功能
    2022-07-07
  • java數(shù)據(jù)結(jié)構(gòu)基礎(chǔ):順序隊(duì)列和循環(huán)隊(duì)列

    java數(shù)據(jù)結(jié)構(gòu)基礎(chǔ):順序隊(duì)列和循環(huán)隊(duì)列

    下面小編就為大家分享一篇java隊(duì)列實(shí)現(xiàn)方法(順序隊(duì)列,循環(huán)隊(duì)列),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2021-08-08
  • SpringBoot+Redis實(shí)現(xiàn)消息的發(fā)布與訂閱的示例代碼

    SpringBoot+Redis實(shí)現(xiàn)消息的發(fā)布與訂閱的示例代碼

    本文主要介紹了SpringBoot+Redis實(shí)現(xiàn)消息的發(fā)布與訂閱,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-04-04
  • java必學(xué)必會(huì)之網(wǎng)絡(luò)編程

    java必學(xué)必會(huì)之網(wǎng)絡(luò)編程

    java必學(xué)必會(huì)之網(wǎng)絡(luò)編程,學(xué)習(xí)了解java網(wǎng)絡(luò)編程、網(wǎng)絡(luò)通信協(xié)議、TCP協(xié)議和UDP協(xié)議,對(duì)各個(gè)協(xié)議進(jìn)行深入學(xué)習(xí),做到必學(xué)必會(huì)
    2015-12-12
  • Spring?Aop+Redis實(shí)現(xiàn)優(yōu)雅記錄接口調(diào)用情況

    Spring?Aop+Redis實(shí)現(xiàn)優(yōu)雅記錄接口調(diào)用情況

    通常情況下,開發(fā)完一個(gè)接口,無論是在測試階段還是生產(chǎn)上線,我們都需要對(duì)接口的執(zhí)行情況做一個(gè)監(jiān)控,所以本文為大家整理了Spring統(tǒng)計(jì)接口調(diào)用的多種方法,希望對(duì)大家有所幫助
    2023-06-06
  • Java實(shí)現(xiàn)文件變化監(jiān)控

    Java實(shí)現(xiàn)文件變化監(jiān)控

    這篇文章主要介紹了Java實(shí)現(xiàn)文件變化監(jiān)控的實(shí)現(xiàn)代碼,代碼附有注釋,分步驟介紹的非常詳細(xì),非常不錯(cuò),具有參考借鑒價(jià)值,,需要的朋友可以參考下
    2016-08-08
  • Java并發(fā)編程示例(四):可控的線程中斷

    Java并發(fā)編程示例(四):可控的線程中斷

    這篇文章主要介紹了Java并發(fā)編程示例(四):可控的線程中斷,在本節(jié),我們將使用一個(gè)線程查找指定目錄及其子目錄下文件來演示通過使用InterruptedException異??刂凭€程中斷,需要的朋友可以參考下
    2014-12-12
  • 詳解java定時(shí)任務(wù)

    詳解java定時(shí)任務(wù)

    這篇文章主要為大家詳細(xì)介紹了java定時(shí)任務(wù),使用JDK中的Timer定時(shí)任務(wù)來實(shí)現(xiàn),感興趣的小伙伴們可以參考一下
    2016-03-03

最新評(píng)論

双柏县| 安陆市| 襄樊市| 油尖旺区| 桂东县| 双峰县| 饶河县| 宣汉县| 大余县| 周口市| 确山县| 抚顺县| 永新县| 绥棱县| 涡阳县| 桦川县| 鹤岗市| 峨眉山市| 广宗县| 河津市| 山西省| 汽车| 黄大仙区| 沅陵县| 安图县| 玛曲县| 县级市| 盐源县| 鹤山市| 那坡县| 永泰县| 稻城县| 黄山市| 镇宁| 聊城市| 柏乡县| 襄樊市| 九龙县| 朝阳市| 东方市| 博湖县|