研究了常用的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)

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

结果:

  • 查询所有:
    @Test// HQL查询所有数据public void fun1() {// 1 获得sessionSession 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: 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]]

  • 按上面的条件查询:
    @Test// HQL查询所有数据public void fun1() {// 1 获得sessionSession 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: 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相关推荐

  1. C# 数据类型映射 (SQLite,MySQL,MSSQL,Oracle)

    MSSQL SQLITE 一.C# vs SQLite: C# SQLite 字段名 类型 库类型 GetFieldType(#) 转换 备注 F_BOOL bool BIT NOT NULL Boo ...

  2. 总结java数据类型和mysql、oracle、pgsql数据类型对应关系,附数据库字段类型转java类型代码

    java的基本数据类型有八种: byte.short.int.long.float.double.char.boolean 总结java和mysql.oracle.pgsql数据类型对应关系 java ...

  3. 【Java】JDBC连接MySQL/SQLServer/Oracle三种数据库

    JDBC连接MySQL数据库 import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLExcepti ...

  4. mysql tinyint对应java什么类型_MySQL数据类型与Java数据类型

    MySQL 中常见的数据类型:tinyint,int,bigint 整数类型 float,double,decimal 浮点类型 date,dateTime,time,timestamp 时间类型 c ...

  5. 使用Hibernate注解Annotations进行对象映射的异常处理

    通过Hibernate注解Annotations进行对象映射,想在Oracle数据库中自动创建表,代码如下: 实体类: import javax.persistence.Basic; import j ...

  6. Hibenate主键映射和Hibernate常用的标示生成器

    l  Hibenate主键映射 自然主键:充当主键的字段具有一定的含义,是构成记录的组成部分. 代理主键:充当主键的字段本身没有什么含义 Hibernate常用的标示生成器 标示生成器名称 描述 As ...

  7. Mysql中tinyint与Java数据类型对应关系

    Mysql中,如果使用tinyint(1)来设置表中字段的数据类型,可以存储0和1:在Java中使用Boolean来接收,0映射为false,1映射为true. Mysql中,如果使用tinyint来 ...

  8. java实体属性对应mysql和SQL Server 和Oracle 数据类型对应

    1:Java数据类型与MySql数据类型对照表 类型名称 显示长度 数据库类型 JAVA类型 JDBC类型索引(int) VARCHAR L+N VARCHAR java.lang.String 12 ...

  9. Java程序员从笨鸟到菜鸟之(五十二)细谈Hibernate(三)Hibernate常用API详解及源码分析--csdn 曹胜欢...

    新接触一个框架的目的就是想利用这个框架来为我们做一些工作,或者是让他来简化我们的工作,利用这个框架无非就是要利用这个框架所给我们提供的API去操作我们的数据,所以利用一个框架的好坏很大一部分取决于你对 ...

最新文章

  1. 动态树形列表基本原理演示
  2. python变量进阶(可变不可变,局部变量和全局变量)
  3. 编程方法学17:多维数组
  4. Jmeter-逻辑控制器
  5. 计算机操作系统(8):进程的控制
  6. 关于嵌入式学习随笔-1《STM32简介》
  7. 分布式智能微电网的体系结构操作系统
  8. 除了攀附名人、杜撰荣恩录,家谱造假中,还有这件事令人羞耻
  9. android 拍照水印日期,胶片日期水印app安卓版-胶片日期水印手机版预约v1.0-发卡屋...
  10. MySQL 修改frm文件_mysql 之 frm+ibd文件还原data
  11. 吴恩达深度学习作业(week2)-(1)
  12. python 输入5*5矩阵a、完成下列要求_python编程练习(五)
  13. sqlDbx连接oracle64位
  14. LuoguP1710 地铁涨价
  15. 阿里云和腾讯云香港服务器区别及如何选择?
  16. python 编码 乱码问题
  17. MacClean360 for Mac(mac系统清理软件)
  18. AirPlay Android接收端学习一 协议
  19. 虚拟环境下的Pip引用外部环境的解决方法
  20. QT阶段项目——飞机大战1.0

热门文章

  1. 预测回归_回归分析预测技术简介
  2. python数据的格式输出_Python格式化输出
  3. Linux 实操———CentOS 6 安装配置 Tomcat
  4. 2020idea插件怎么同步_没有用过这些插件,别说你在用vscode
  5. c# url传参不能包含html标签,c#解析包含HTML特殊字符的字符串XElement
  6. 江西省计算机应用基础对口高考复习,江西省对口高考计算机应用基础复习题(各章及综合练习)...
  7. 字典添加数据_MATLAB自动化——EXCEL与数据字典管理(一)
  8. HTML+CSS+JS实现 ❤️swiper倾斜图片特效❤️
  9. css动画改变高度有过渡效果,css3-形变、过渡、动画
  10. python extract的使用_Python extract及contains方法代码实例