Hibernate常用的Java数据类型映射到mysql和Oracle
研究了常用的Java基本數據類型在mysql和oracle數據庫的映射類型。這里使用的是包裝類型做研究,一般在hibernate聲明的時候最好不要用基本類型,因為數據庫中的null空數據有可能映射為基本類型的時候會報錯,但是映射到包裝類型的時候值為null,不會報錯。
1.常見數據類型在Mysql數據庫的映射
實體:
package cn.qlq.domain;import java.sql.Time; import java.util.Date;public class TestType {private Long id;private Integer age;private Character sex;private Boolean isPerson;private Date birth;private Time birthTime;private String name;public Long getId() {return id;}public void setId(Long id) {this.id = id;}public Integer getAge() {return age;}public void setAge(Integer age) {this.age = age;}public Character getSex() {return sex;}public void setSex(Character sex) {this.sex = sex;}public Boolean getIsPerson() {return isPerson;}public void setIsPerson(Boolean isPerson) {this.isPerson = isPerson;}public Date getBirth() {return birth;}public void setBirth(Date birth) {this.birth = birth;}public Time getBirthTime() {return birthTime;}public void setBirthTime(Time birthTime) {this.birthTime = birthTime;}public String getName() {return name;}public void setName(String name) {this.name = name;}@Overridepublic String toString() {return "TestType [id=" + id + ", age=" + age + ", sex=" + sex + ", isPerson=" + isPerson + ", birth=" + birth+ ", birthTime=" + birthTime + ", name=" + name + "]";}}?
?
?
xml:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN""http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"><!-- 配置表與實體對象的關系 --><!-- package屬性:填寫一個包名.在元素內部凡是需要書寫完整類名的屬性,可以直接寫簡答類名了. --> <hibernate-mapping package="cn.qlq.domain" ><!-- class元素: 配置實體與表的對應關系的name: 完整類名table:數據庫表名--><class name="TestType" table="testtype" ><!-- id元素:配置主鍵映射的屬性name: 填寫主鍵對應屬性名column(可選): 填寫表中的主鍵列名.默認值:列名會默認使用屬性名type(可選):填寫列(屬性)的類型.hibernate會自動檢測實體的屬性類型.每個類型有三種填法: java類型|hibernate類型|數據庫類型not-null(可選):配置該屬性(列)是否不能為空. 默認值:falselength(可選):配置數據庫中列的長度. 默認值:使用數據庫類型的最大長度--><id name="id" ><!-- generator:主鍵生成策略 --><!--identity : 主鍵自增.由數據庫來維護主鍵值.錄入時不需要指定主鍵. --><generator class="native"></generator></id><!-- property元素:除id之外的普通屬性映射name: 填寫屬性名column(可選): 填寫列名type(可選):填寫列(屬性)的類型.hibernate會自動檢測實體的屬性類型.每個類型有三種填法: java類型|hibernate類型|數據庫類型not-null(可選):配置該屬性(列)是否不能為空. 默認值:falselength(可選):配置數據庫中列的長度. 默認值:使用數據庫類型的最大長度--><property name="age"/><property name="sex"/><property name="isPerson"/><property name="birth"/><property name="birthTime"/><property name="name"/></class> </hibernate-mapping>?
?
Mysql映射的類型:
mysql> desc testtype; +-----------+--------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +-----------+--------------+------+-----+---------+----------------+ | id | bigint(20) | NO | PRI | NULL | auto_increment | | age | int(11) | YES | | NULL | | | sex | char(1) | YES | | NULL | | | isPerson | bit(1) | YES | | NULL | | | birth | datetime | YES | | NULL | | | birthTime | time | YES | | NULL | | | name | varchar(255) | YES | | NULL | | +-----------+--------------+------+-----+---------+----------------+ 7 rows in set (0.01 sec)?
?
結果:
Long------------------------------bigint
Integer-----------------------? ? int
Character---------------------? char
Bolean---------------------------bit
java.util.Date;--------------datetime
java.sql.Time;------------------time
String----------------------------varchar(255)
?
- 插入數據:
?
?
結果:
mysql> select * from testtype; +----+------+------+----------+---------------------+-----------+--------------+ | id | age | sex | isPerson | birth | birthTime | name | +----+------+------+----------+---------------------+-----------+--------------+ | 1 | 22 | 1 | | 2018-08-10 22:39:19 | NULL | zhangsan | | 2 | 23 | 2 | | 2018-08-10 22:39:19 | NULL | zhangsanhaha | +----+------+------+----------+---------------------+-----------+--------------+ 2 rows in set (0.00 sec)?
?
?
- 查詢
(1)基本查詢:
@Test// HQL查詢所有數據public void fun1() {// 1 獲得sessionSession session = HibernateUtil.openSession();// 2.書寫HQL語句 // String hql = "from cn.qlq.domain.Customer";// from 類名全路徑String hql = "from TestType";// 如果整個項目中只有這一個類名可以直接寫名字// 3.根據hql創建查詢對象Query query = session.createQuery(hql);// 4.根據查詢對象獲取查詢結果List<TestType> list = query.list();System.out.println(list);}?
結果:
[TestType [id=1, age=22, sex=1, isPerson=true, birth=2018-08-10 22:39:19.0, birthTime=null, name=zhangsan], TestType [id=2, age=23, sex=2, isPerson=false, birth=2018-08-10 22:39:19.0, birthTime=null, name=zhangsanhaha]]
?
(2)條件查詢:----針對上面的類型進行條件查詢
@Test// HQL查詢所有數據public void fun1() {// 1 獲得sessionSession session = HibernateUtil.openSession();// 2.書寫HQL語句 // String hql = "from cn.qlq.domain.Customer";// from 類名全路徑String hql = "from TestType where age = 22 and sex = 1 and isPerson = true and name = 'zhangsan' and birth like '2018-08-10%'";// 如果整個項目中只有這一個類名可以直接寫名字// 3.根據hql創建查詢對象Query query = session.createQuery(hql);// 4.根據查詢對象獲取查詢結果List<TestType> list = query.list();System.out.println(list);}?
?
結果:
selecttesttype0_.id as id1_0_,testtype0_.age as age2_0_,testtype0_.sex as sex3_0_,testtype0_.isPerson as isPerson4_0_,testtype0_.birth as birth5_0_,testtype0_.birthTime as birthTim6_0_,testtype0_.name as name7_0_ fromtesttype testtype0_ wheretesttype0_.age=22 and testtype0_.sex=1 and testtype0_.isPerson=1 and testtype0_.name='zhangsan' and (testtype0_.birth like '2018-08-10%') [TestType [id=1, age=22, sex=1, isPerson=true, birth=2018-08-10 22:39:19.0, birthTime=null, name=zhangsan]]?
?
補充:Mysql的boolean類型也可以用true_false表示,數據類型會變為char(1),存的是T和F:
<property name="isPerson" type="true_false"/>?
?
2.常見數據類型在Oracle數據庫的映射
Oracle映射上面直接映射會報錯,解決辦法:? 將boolean映射為hibernate的true_false? (原理都是在數據庫存T或者F,F為false,T為true)
第一種:? ?boolean映射為yes_no
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN""http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"><!-- 配置表與實體對象的關系 --><!-- package屬性:填寫一個包名.在元素內部凡是需要書寫完整類名的屬性,可以直接寫簡答類名了. --> <hibernate-mapping package="cn.qlq.domain" ><!-- class元素: 配置實體與表的對應關系的name: 完整類名table:數據庫表名--><class name="TestType" table="testtype" ><!-- id元素:配置主鍵映射的屬性name: 填寫主鍵對應屬性名column(可選): 填寫表中的主鍵列名.默認值:列名會默認使用屬性名type(可選):填寫列(屬性)的類型.hibernate會自動檢測實體的屬性類型.每個類型有三種填法: java類型|hibernate類型|數據庫類型not-null(可選):配置該屬性(列)是否不能為空. 默認值:falselength(可選):配置數據庫中列的長度. 默認值:使用數據庫類型的最大長度--><id name="id" ><!-- generator:主鍵生成策略 --><!--identity : 主鍵自增.由數據庫來維護主鍵值.錄入時不需要指定主鍵. --><generator class="native"></generator></id><!-- property元素:除id之外的普通屬性映射name: 填寫屬性名column(可選): 填寫列名type(可選):填寫列(屬性)的類型.hibernate會自動檢測實體的屬性類型.每個類型有三種填法: java類型|hibernate類型|數據庫類型not-null(可選):配置該屬性(列)是否不能為空. 默認值:falselength(可選):配置數據庫中列的長度. 默認值:使用數據庫類型的最大長度--><property name="age"/><property name="sex"/> <property name="isPerson" type="true_false"/><property name="birth"/><property name="birthTime"/><property name="name"/></class> </hibernate-mapping>?
?
結果:
?
?
總結:
Long------------------------------number
Integer-----------------------? ? number
Character---------------------? char
Bolean---------------------------char
java.util.Date;--------------date
java.sql.Time;------------------date
String----------------------------varchar(255)
?
?
添加數據:
package cn.qlq.util;import java.util.Date;import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.Transaction; import org.hibernate.boot.MetadataSources; import org.hibernate.boot.registry.StandardServiceRegistryBuilder; import org.hibernate.service.ServiceRegistry;import cn.qlq.domain.TestType;public class TestSave {public static void main(String[] args) {//3.3以及之前的版本構建會話工廠對象 // SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory();//5.0之后獲取SessionFactory//創建服務注冊對象ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder().configure().build();//創建會話工廠對象SessionFactory sessionFactory = new MetadataSources(serviceRegistry).buildMetadata().buildSessionFactory();//獲取session對象Session session = sessionFactory.openSession();//開啟事務Transaction tx = session.beginTransaction();//保存對象TestType t1 = new TestType();TestType t2 = new TestType();t1.setAge(22);t2.setAge(23);t1.setName("zhangsan");t2.setName("zhangsanhaha");t1.setSex('1');t2.setSex('2');t1.setBirth(new Date());t2.setBirth(new Date());t1.setIsPerson(true);t2.setIsPerson(false);session.save(t1);session.save(t2);tx.commit();//關閉流 session.close();sessionFactory.close();} }?
結果:
?
?
?
- 查詢所有:
?
結果:
Hibernate: selecttesttype0_.id as id1_0_,testtype0_.age as age2_0_,testtype0_.sex as sex3_0_,testtype0_.isPerson as isPerson4_0_,testtype0_.birth as birth5_0_,testtype0_.birthTime as birthTim6_0_,testtype0_.name as name7_0_ fromtesttype testtype0_ [TestType [id=15, age=22, sex=1, isPerson=true, birth=2018-08-10 23:19:33.0, birthTime=null, name=zhangsan], TestType [id=16, age=23, sex=2, isPerson=false, birth=2018-08-10 23:19:33.0, birthTime=null, name=zhangsanhaha]]?
?
?
?
?
- ?按上面的條件查詢:
?
結果:? (日期不能直接like了)
Hibernate: selecttesttype0_.id as id1_0_,testtype0_.age as age2_0_,testtype0_.sex as sex3_0_,testtype0_.isPerson as isPerson4_0_,testtype0_.birth as birth5_0_,testtype0_.birthTime as birthTim6_0_,testtype0_.name as name7_0_ fromtesttype testtype0_ wheretesttype0_.age=22 and testtype0_.sex=1 and testtype0_.isPerson='T' and testtype0_.name='zhangsan' [TestType [id=15, age=22, sex=1, isPerson=true, birth=2018-08-10 23:19:33.0, birthTime=null, name=zhangsan]]?
?
?總結:?
對于mysql和oracle的boolean的通用類型就是true_false,hibernate會將字段類型設置為char(1),然后true的時候存T,false的時候存F。
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
轉載于:https://www.cnblogs.com/qlqwjy/p/9457988.html
總結
以上是生活随笔為你收集整理的Hibernate常用的Java数据类型映射到mysql和Oracle的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: django的基本操作流程
- 下一篇: Android中LayoutInflat