Hibernate常用的Java数据类型映射到mysql和Oracle

Posted Qiao_Zhi

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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;
    }

    @Override
    public 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(可选):配置该属性(列)是否不能为空. 默认值:false
                length(可选):配置数据库中列的长度. 默认值:使用数据库类型的最大长度
         -->
        <id name="id"  >
            <!-- generator:主键生成策略 -->
            <!--identity : 主键自增.由数据库来维护主键值.录入时不需要指定主键.  -->
            <generator class="native"></generator>
        </id>
        <!-- property元素:除id之外的普通属性映射
                name: 填写属性名
                column(可选): 填写列名
                type(可选):填写列(属性)的类型.hibernate会自动检测实体的属性类型.
                        每个类型有三种填法: java类型|hibernate类型|数据库类型
                not-null(可选):配置该属性(列)是否不能为空. 默认值:false
                length(可选):配置数据库中列的长度. 默认值:使用数据库类型的最大长度
         -->
         <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)

 

  • 插入数据:
    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();
    }

 

 

结果:

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 获得session
        Session 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 获得session
        Session 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);
    }

 

 

结果:

    select
        testtype0_.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_ 
    from
        testtype testtype0_ 
    where
        testtype0_.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(可选):配置该属性(列)是否不能为空. 默认值:false
                length(可选):配置数据库中列的长度. 默认值:使用数据库类型的最大长度
         -->
        <id name="id"  >
            <!-- generator:主键生成策略 -->
            <!--identity : 主键自增.由数据库来维护主键值.录入时不需要指定主键.  -->
            <generator class="native"></generator>
        </id>
        <!-- property元素:除id之外的普通属性映射
                name: 填写属性名
                column(可选): 填写列名
                type(可选):填写列(属性)的类型.hibernate会自动检测实体的属性类型.
                        每个类型有三种填法: java类型|hibernate类型|数据库类型
                not-null(可选):配置该属性(列)是否不能为空. 默认值:false
                length(可选):配置数据库中列的长度. 默认值:使用数据库类型的最大长度
         -->
         <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();
    } 

}

 

结果:

 

 

 

  • 查询所有:
    @Test
    // HQL查询所有数据
    public void fun1() {
        // 1 获得session
        Session session = HibernateUtil.openSession();
        // 2.书写HQL语句
        String hql = "from cn.qlq.domain.TestType";// from 类名全路径// 3.根据hql创建查询对象
        Query query = session.createQuery(hql);
        // 4.根据查询对象获取查询结果
        List<TestType> list = query.list();
        System.out.println(list);
    }

 

结果:

Hibernate: 
    select
        testtype0_.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_ 
    from
        testtype 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]]

 

 

 

 

 

  •  按上面的条件查询:
    @Test
    // HQL查询所有数据
    public void fun1() {
        // 1 获得session
        Session session = HibernateUtil.openSession();
        // 2.书写HQL语句
        String hql = "from TestType where age = 22 and sex = 1 and isPerson = true and name = \'zhangsan\'";// 如果整个项目中只有这一个类名可以直接写名字
        // 3.根据hql创建查询对象
        Query query = session.createQuery(hql);
        // 4.根据查询对象获取查询结果
        List<TestType> list = query.list();
        System.out.println(list);
    }

 

结果:  (日期不能直接like了)

Hibernate: 
    select
        testtype0_.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_ 
    from
        testtype testtype0_ 
    where
        testtype0_.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。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

以上是关于Hibernate常用的Java数据类型映射到mysql和Oracle的主要内容,如果未能解决你的问题,请参考以下文章

hibernate核心及常用技术

使用Hibernate在Java实体类上映射MySql无符号BigInt的正确数据类型是什么?

springboot+kotlin+gradle+hibernate学习笔记

在hibernate ,strut中怎么把timestamp类型数据转成date类型

springboot+kotlin+gradle+hibernate学习笔记

Hibernate 基础