23.Hibernate-基础.md
目录
1. ORM和Hibernare
- O:object ; R: realtion; M:Mapping。Hibernate是其中一种实现。
- 解决问题:对象直接保存到数据库<——>直接从数据库拿到一个对象
2. 基本开发
2.1 lib
对于版本hibernate-distribution-3.6.0.Final而言,需要jar包
核心包:hibernate3.jar
lib\required下
lib\jpa下hibernate-jpa-2.0-api-1.0.0.Final.jar
数据库驱动包:
2.2 写对象和引入对象映射
2.2.1 写对象类文件
- 和表对应的类
package per.liyue.code.hibernatehello;
/*
* 数据库表映射类
* 类的名称和成员变量的名称属性必须和数据库一致
*/
import java.util.Date;
public class Employee {
private int empId;
private String empName;
private Date workDate;
public int getEmpId() {
return empId;
}
public void setEmpId(int empId) {
this.empId = empId;
}
public String getEmpName() {
return empName;
}
public void setEmpName(String empName) {
this.empName = empName;
}
public Date getWorkDate() {
return workDate;
}
public void setWorkDate(Date workDate) {
this.workDate = workDate;
}
}
2.3 配置文件
2.3.1 配置加载映射文件
按照格式类名称.hbm.xml格式来创建,源文件可以从库文件中拷贝
配置时候注意对应关系:
- 类与表对应
- 类名和表名对已
- 属性对应
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<!-- Generated Nov 9, 2006 6:27:53 PM by Hibernate Tools 3.2.0.beta7 -->
<!-- package:类对象所在的包
auto-import:表面是自动导入包,如果设定为false,则需要在执行hql语句时候将包名写清楚:
Demo:在true时候可以写为session.createQuery("from Employee").list();
在false时候必须写为session.createQuery("from per.liyue.code.hibernatehello.Employee").list();
-->
<hibernate-mapping package="per.liyue.code.hibernatehello" auto-import="true">
<!-- 类与表的对应
name:类名称
table:表名称
-->
<class name="Employee" table="employee">
<!-- 主键 注意和类成员和表列名称的一致对应 -->
<id name="empId" column="EmpId" >
<!-- 主键的生成策略:
1.identity 自增长(mysql,db2)
2.sequence 自增长(序列), oracle中自增长是以序列方法实现
3.native 自增长【会根据底层数据库自增长的方式选择identity或sequence】
如果是mysql数据库, 采用的自增长方式是identity
如果是oracle数据库, 使用sequence序列的方式实现自增长
4.increment 自增长(会有并发访问的问题,一般在服务器集群环境使用会存在问题。)
5.assigned 指定主键生成策略为手动指定主键的值
6.uuid 指定uuid随机生成的唯一的值
7.foreign (外键的方式, one-to-one讲)
-->
<generator class="native" />
</id>
<!-- 非主键,同样一一映射
name:类的属性名称
column:表的字段名称
length:设定字段的长度,默认为255
type:设定映射表的类型,如果不写匹配类对应属性的类型
java类型:必须带完整包名:java.lang.String
hibernate类型:全部都是小写
-->
<property name="empName" column="EmpName"></property>
<property name="workDate" column="WorkDate"></property>
</class>
</hibernate-mapping>
2.3.2 配置数据库连接文件
配置文件hibernate.cfg.xml
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory name="foo">
<!-- 数据库连接配置 -->
<!-- 连接类 -->
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<!-- 连接数据库 -->
<property name="hibernate.connection.url">jdbc:mysql:///hi</property>
<!-- 连接用户名 -->
<property name="hibernate.connection.username">root</property>
<!-- 连接密码 -->
<property name="hibernate.connection.password">root</property>
<!-- 数据库方言 -->
<property name="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</property>
<!-- 加载所有的映射 -->
<mapping resource="per/liyue/code/hibernatehello/Employee.hbm.xml"/>
</session-factory>
</hibernate-configuration>
2.4 实现保存对象插入数据
package per.liyue.code.hibernatehello;
import java.util.Date;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.junit.Test;
public class App {
@Test
public void Fun(){
/*
* 创建一个对象,以便验证提交数据库
*/
Employee em = new Employee();
em.setEmpId(1);
em.setEmpName("张神马");
em.setWorkDate(new Date());
/*
* 通过Hibernate操作提交数据
*/
//获取加载配置文件
Configuration config = new Configuration();
config.configure();//默认加载src下的hibernate.cfg.xml文件
//创建session工程
SessionFactory sf = config.buildSessionFactory();
//创建一个会话,表示和数据库的一个连接
Session session = sf.openSession();
//开启事务
Transaction tx = session.beginTransaction();
//保存数据库
session.save(em);
//提交事务
tx.commit();
//关闭资源
session.close();
sf.close();
}
}
3. 常见错误
3.1 重复匹配
Exception : org.hibernate.MappingException: Repeated column in mapping for entity
检查配置文件.hbm.xml中的属性标签是否多个标签匹配了同一个数据库列
3.2表属性设置
org.hibernate.exception.GenericJDBCException: could not insert: [per.liyue.code.hibernatehello.Employee] at org.hibernate.exception.SQLStateConverter.handledNonSpecificException(SQLStateConverter.java:140) at org.hibernate.exception.SQLStateConverter.co
对应的表主键是自增长才能匹配配置文件中的
3.3程序执行成功且hibernate生成sql语句,但是数据库中没有数据
没有开启或者提交事务!
4. API详解
4.1 Configuration 配置管理类对象
config.configure(); 加载主配置文件的方法(hibernate.cfg.xml); 默认加载src/hibernate.cfg.xml
config.configure(“cn/config/hibernate.cfg.xml”); 加载指定路径下指定名称的主配置文件
config.buildSessionFactory(); 创建session的工厂对象
4.2 SessionFactory session的工厂(或者说代表了这个hibernate.cfg.xml配置文件)
- sf.openSession(); 创建一个sesison对象
- sf.getCurrentSession(); 创建session或取出session对象
4.3 Sessionsession对象维护了一个连接(Connection), 代表了与数据库连接的会话。
- Hibernate最重要的对象: 只用使用hibernate与数据库操作,都用到这个对象
- session.beginTransaction(); 开启一个事务; hibernate要求所有的与数据库的操作必须有事务的环境,否则报错!
4.4 Session是hibernate最重要的对象, 所有hibernate与数据库操作都需要!维护了一个与数据库的会话
4.4.1 插入记录
save()方法
4.4.2 更新记录
update()方法
saveOrUpdate()方法
4.4.3 查询记录
get()方法
load()方法
4.4.4 Demo:
将上述例子中的APP类代码修改为:
package per.liyue.code.hibernatehello;
import java.util.Date;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.hibernate.classic.Session;
import org.junit.Test;
/*
* hibernate测试类
*/
public class App {
//使用全局静态对象避免重复创建
private static SessionFactory sessionFactory;
static{
//这里记得一定要加载cuonfigure函数!!!
sessionFactory = new Configuration().configure().buildSessionFactory();
}
/*
* 实例:插入
*/
@Test
public void insertDemo(){
Employee e = new Employee();
//这里对应的表主键,非空,自增长。才可以插入
//e.setEmpId(1);
e.setEmpName("李四");
e.setWorkDate(new Date());
//获取Session对象
Session s = sessionFactory.openSession();
//下面函数同样可以获取Session对象
//Session s = sessionFactory.getCurrentSession();
//打开事务!hibernate所有业务都需要打开事务!!!
Transaction t = s.beginTransaction();
//执行业务
s.save(e);
//提交
t.commit();
//关闭
s.close();
sessionFactory.close();
}
/*
* 实例:更新
*/
@Test
public void updateDemo(){
Employee e = new Employee();
//这里对应的表主键,非空,自增长。才可以插入
e.setEmpId(1);
e.setEmpName("王五");
e.setWorkDate(new Date());
//获取Session对象
Session session = sessionFactory.openSession();
//打开事务
Transaction transaction = session.beginTransaction();
//执行业务
/*
* 更新的时候必须有主键!!!
*/
session.update(e);
//提交
transaction.commit();
//关闭
session.close();
sessionFactory.close();
}
/*
* 实例:更新或保存
*/
@Test
public void updateOrSaveDemo(){
Employee e = new Employee();
//这里对应的表主键,非空,自增长。才可以插入
e.setEmpId(1);
e.setEmpName("赵二");
e.setWorkDate(new Date());
//获取Session对象
Session session = sessionFactory.openSession();
//打开事务
Transaction transaction = session.beginTransaction();
//执行业务
/*
* 1.如果没有主键则执行保存
* 2.如果有主键则执行更新
* 3.如果主键有错误则报错
*/
session.saveOrUpdate(e);
//提交
transaction.commit();
//关闭
session.close();
sessionFactory.close();
}
/*
* 查询
*/
@Test
public void SelectDemo(){
//获取Session
Session session = sessionFactory.openSession();//.getCurrentSession();
//打开事务
Transaction t = session.beginTransaction();
//执行 业务
Employee employee = (Employee) session.get(Employee.class, 1);
/*
* load支持懒加载
*/
//Employee employee = (Employee) session.load(Employee.class, 1);
System.out.println(employee);
//提交
t.commit();
//关闭
session.close();
sessionFactory.close();
}
/*
* 删除
*/
@Test
public void DeleteOneData(){
Session s = sessionFactory.openSession();
Transaction t = session.beginTransaction();
//删除需要先查找到后再删除
Object obj = session.get(Employee.class, 2);
if(null != obj){
s.delete(obj);
}
t.commit();
session.close();
sessionFactory.close();
}
}
23.Hibernate-基础.md的更多相关文章
- hibernate基础dao类
此文章是基于 搭建SpringMVC+Spring+Hibernate平台 功能:数据库的保存.更新.删除:sql.hql查询:分页查询:调用存储过程 创建hibernate基础dao类: BaseD ...
- hibernate基础(1)
hibernate基础1.hibernate介绍与动手入门体验 问题:模型不匹配(java对象模型与数据库关系模型不匹配) 解决: 1.使用JDBC手工转换 2.使用ORM(Obje ...
- Hibernate.基础篇《二》. getOpenSession() 和 getCurrentSession() - 1
Hibernate.基础篇<二>. getOpenSession() 和 getCurrentSession() - 1 说明: 在Hibernate应用中,Session接口的使用最为广 ...
- Hibernate.基础篇《一》.Hibernate工具类.
Hibernate.基础篇<一>.Hibernate工具类. 话述: Hibernate.基础篇第一篇,前面是代码.后面再加理论&实践. Hibernate使用的版本是:5.x,在 ...
- Hibernate学习笔记2.1(Hibernate基础配置)
Hibernate基础配置 1.<property name="hbm2ddl.auto">update</property> 在SessionFactor ...
- Hibernate入门1. Hibernate基础知识入门
Hibernate入门1. Hibernate基础知识入门 20131127 前言: 之前学习过Spring框架的知识,但是不要以为自己就可以说掌握了Spring框架了.这样一个庞大的Spring架构 ...
- Hibernate基础学习2
Hibernate基础学习2 测试hibernate的一级缓存,事务以及查询语句 1)Hibernate的一些相关概念 hibernate的一级缓存 1)缓存是为了提高该框架对数据库的查询速度 2)一 ...
- Hibernate 基础配置及常用功能(三)
本章重点讲述Hibernate对象的三种状态以及如何配置二级缓存 有关Hibernate的三种状态如何相互转换网上都能查到,官方文档描述的也比较详细.这里主要是针对几个重点方法做代码演示. 一.状态转 ...
- Hibernate基础学习(五)—对象-关系映射(下)
一.单向n-1 单向n-1关联只需从n的一端可以访问1的一端. 域模型: 从Order到Customer的多对一单向关联.Order类中定义一个Customer属性,而在Customer类不用存放Or ...
- Hibernate基础学习(四)—对象-关系映射(上)
一.映射对象标识符 Java语言按内存地址来识别或区分同一个类的不同对象,而关系数据库按主键值来识别或区分同一个表的不同记录.Hibernate使用对象标识符(OID)来建立内存中的对象和数 ...
随机推荐
- java基础(5)内部类
1 成员内部类的定义和使用 public class Outer { private String name; public class Inner { public void innerMethod ...
- C++常见的概念
1)多态:允许将子类类型的指针赋值给父类类型的指针.赋值以后,父类对象可以根据当前赋值给它的子类对象的特性以不同的方式运作. 2)深拷贝:重新分配内存:浅拷贝:共用同一内存. 3)友元:非成员函数不能 ...
- java程序连接oracle12c报:java.sql.SQLException: ORA-28040: 没有匹配的验证协议。
报错信息: 2017-09-22 15:17:37,204 WARN [org.hibernate.cfg.SettingsFactory] - Could not obtain connection ...
- iis发布----在XP中发布高版本web遇到问题总结
解决方法是之前在网上看到的,总结一下. 我在vs2010中做的web网页,放到XP系统中发布是遇到问题,XP中的iis版本是iis. 提示.net framework版本上的问题. 1.在网站属性中把 ...
- Jekins学习
1.Windows 安装入门 https://blog.csdn.net/u011541946/article/details/78003772 PS:坑1,https问题 坑2,offline ...
- MySQL Event--Event and EventScheduler
MySQL Event 创建EVENT语法: CREATE [DEFINER = { user | CURRENT_USER }] EVENT [IF NOT EXISTS] event_name O ...
- LOJ 3059 「HNOI2019」序列——贪心与前后缀的思路+线段树上二分
题目:https://loj.ac/problem/3059 一段 A 选一个 B 的话, B 是这段 A 的平均值.因为 \( \sum (A_i-B)^2 = \sum A_i^2 - 2*B \ ...
- Innodb中MySQL如何快速删除2T的大表
转自:http://database.51cto.com/art/201808/582324.htm OK,这里就说了.假设,你有一个表erp,如果你直接进行下面的命令: drop table erp ...
- 解决scipy无法正确安装到virtualenv中的问题
一 . pip的基本操作 安装包: pip/pip3 install ***pkg 卸载包: pip/pip3 uninstall ***pkg 查看已经安装的某个包的信息: pip/pip3 sho ...
- 关于rtsp的时间戳问题
这里主要关注的rtp包的时间戳,在rtsp中,播放器的1S钟的定义是和媒体的采样率有关的. 例如视频的采样率是90K,那么最小时间粒度(单位)是1/90000秒,再转换成ms就是 1/90毫秒,这个就 ...