WEB Service Dao
hibernate处于 Dao层 是ORM框架 帮助我们操作数据库的
object Relational mapping 对象关系映射,是一种为了解决面向对象与关系型数据库存在不匹配现象的技术,简单说,orm通过描述对象和数据库之间映射的元数据,将程序中的对象自动持久化到关系型数据库中
1.导入所需的包
在src目录下创建hibernate.cfg.xml 作为配<?xml version="1.0" encoding="UTF-8"?><!-- 约束 -->
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<!-- hibernate主配置-->
<hibernate-configuration>
<!-- session工场-->
<session-factory>
<!--
#hibernate.dialect org.hibernate.dialect.MySQLDialect
#hibernate.dialect org.hibernate.dialect.MySQLInnoDBDialect
#hibernate.dialect org.hibernate.dialect.MySQLMyISAMDialect
#hibernate.connection.driver_class com.mysql.jdbc.Driver
#hibernate.connection.url jdbc:mysql:///test
#hibernate.connection.username gavin
#hibernate.connection.password-->
<!-- 数据库方言
指定方言可以让hibernate框架在生成sql语句时.针对数据库的方言生成.
DDL 定义语言 库表的增删改查
DCL 控制语言 事务 权限
DML 操纵语言 增删改查
-->
<!--最新的mysql5方言-->
<property name="hibernate.dialect">org.hibernate.dialect.MySQL5InnoDBDialect</property>
<!-- 数据库驱动 -->
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<!-- 数据库url 使用的是mysql8 需要加一定的参数 -->
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/mydatabase?useSSL=false&useUnicode=true&characterEncoding=utf-8&serverTimezone=UTC&allowPublicKeyRetrieval=true</property>
<!-- 数据库连接用户名 -->
<property name="hibernate.connection.username">root</property>
<!-- 数据库连接密码 -->
<property name="hibernate.connection.password">root</property>
<!-- 生成的sql语句打印到控制台 -->
<property name="hibernate.show_sql">true</property>
<!-- 生成的sql语句格式化 -->
<property name="hibernate.format_sql">true</property>
<!--
#hibernate.hbm2ddl.auto create 自动建表.每次框架运行都会创建新的表.以前表将会被覆盖,表数据会丢失.
#hibernate.hbm2ddl.auto create-drop 自动建表.每次框架运行结束都会将所有表删除.
#hibernate.hbm2ddl.auto update 自动生成表.如果已经存在不会再生成.如果表有变动.自动更新表(不会删除任何数据).
#hibernate.hbm2ddl.auto validate 校验.不自动生成表.每次启动会校验数据库中表是否正确.校验失败.
-->
<property name="hibernate.hbm2ddl.auto">update</property>
<!--orm元数据的xml-->
<mapping resource="domain/User.hbm.xml" />
<mapping resource="domain/Role.hbm.xml" />
</session-factory>
</hibernate-configuration>
创建domain包 放置对象
package domain;
import java.util.HashSet;
import java.util.Set;
public class User {
public String getUser_name() {
return user_name;
}
public void setUser_name(String user_name) {
this.user_name = user_name;
}
public Set<Role> getRoles() {
return roles;
}
public void setRoles(Set<Role> roles) {
this.roles = roles;
}
private Long user_id;
private String user_code;
private String user_name;
private String user_password;
private Character user_state;
private Set<Role> roles = new HashSet<Role>();
public Long getUser_id() {
return user_id;
}
public void setUser_id(Long user_id) {
this.user_id = user_id;
}
public String getUser_code() {
return user_code;
}
public void setUser_code(String user_code) {
this.user_code = user_code;
}
public String getUser_password() {
return user_password;
}
public void setUser_password(String user_password) {
this.user_password = user_password;
}
public Character getUser_state() {
return user_state;
}
public void setUser_state(Character user_state) {
this.user_state = user_state;
}
}
在相同的domain包下 放置对应的xml文件 例如User.hbm.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="domain" >
<!--
class元素: 配置实体与表的对应关系的
name: 完整类名
table:数据库表名
-->
<class name="User" table="sys_user" >
<!-- id元素:配置主键映射的属性
name: 填写主键对应属性名
column(可选): 填写表中的主键列名.默认值:列名会默认使用属性名
type(可选):填写列(属性)的类型.hibernate会自动检测实体的属性类型.
每个类型有三种填法: java类型|hibernate类型|数据库类型
not-null(可选):配置该属性(列)是否不能为空. 默认值:false
length(可选):配置数据库中列的长度. 默认值:使用数据库类型的最大长度
-->
<id name="user_id" >
<!-- generator:主键生成策略,每条记录录入时,主键的生成规则
identity 主键自增 由数据库来维护主键值,录入时不需要制定主键
increment:主键自增 由hibernate维护 每次插入前查询最大id值 加一个作为新主键值
sequence:oracle中的主键生成策略;
hlio:高低位 算法 主键自增 由hibernate维护
native:hilo + sequence + identity 自动 三选一策略;
uuid :产生随机字符串作为主键、主键类型 必须为string
assigned:自然主键 没有策略 手动制定 hibernate不会管理 开发人员自己录入 这就代表我们new对象的时候 需要设置id值 不设置 是会抛出异常的
-->
<generator class="native"></generator>
</id>
<property name="user_name" ></property>
<property name="user_code" ></property>
<property name="user_password"></property>
<property name="user_state"></property>
<!-- 多对多描述 -->
<!-- 多对多关系表达 -->
<!--
name: 集合属性名
table: 配置中间表名
key
|-column:外键,别人引用本类的外键列名
class: 我与其他类是多对多关系
column:外键.我引用另一类的外键列名
-->
<!-- cascade级联操作:
save-update: 级联保存更新
delete:级联删除
all:级联保存更新+级联删除
cascade简化代码书写.该属性使不使用无所谓. 建议要用只用save-update.如果使用delete操作太过危险.尤其在多对多中.不建议使用.-->
<set name="roles" table="sys_user_role" cascade="save-update">
<key column="user_id"></key>
<many-to-many class="Role" column="role_id"></many-to-many>
</set>
</class>
</hibernate-mapping>
配置完成 可以开始进行测试了 创建demo类
public class demo {
public static void main(String[] args){
//创建 调用构造方法指定cfg.xml
Configuration configuration = new Configuration().configure(new File("src/hibernate.cfg.xml"));
//读取orm元数据 主配置加载了映射配置 就不需要在加载了
//configuration.addResource(resourceName);
//configuration.addClass(persistentClass);
/* SessionFactory功能: 用于创建操作数据库核心对象session对象的工厂.
功能就是创建session对象
注意:1.sessionfactory 负责保存和使用所有配置信息.消耗内存资源非常大.
2.sessionFactory属于线程安全的对象设计.
结论: 保证在web项目中,只创建一个sessionFactory.
*/
SessionFactory sessionfactory = configuration.buildSessionFactory();
//openSession 新的session对象
/*session对象功能 类似connection对象 完成增删改查操作 session是hibernate操作数据库的核心对象*/
Session session = sessionfactory.openSession();
//开启事务
Transaction txTransaction = session.beginTransaction();
//操作数据库的代码
//--------------------------------------------------------------------------
try {
/*存数据*/
User user = new User();
user.setUser_name("asdf");
session.save(user);
/*调用session.save保存对象*/
/*错误 事务会回滚*/
throw new Exception("出错");
/*调用session.save保存对象*/
}catch(Exception e) {
/*回滚*/
txTransaction.rollback();
}finally {
/*提交 结束代码--------------------------------------------------------------*/
txTransaction.commit();
session.close();
/*释放资源*/
sessionfactory.close();
}
}
}
会出错 因为抛出了异常
INFO: HHH000490: Using JtaPlatform implementation: [org.hibernate.engine.transaction.jta.platform.internal.NoJtaPlatform]
Hibernate:
insert
into
sys_user
(user_name, user_code, user_password, user_state)
values
(?, ?, ?, ?)
Exception in thread "main" java.lang.IllegalStateException: Transaction not successfully started
at org.hibernate.engine.transaction.internal.TransactionImpl.commit(TransactionImpl.java:98)
at demo.main(demo.java:57)
注释掉 在运行
插入成功
查询
//1 创建,调用空参构造
Configuration conf = new Configuration().configure();
//2 根据配置信息,创建 SessionFactory对象
SessionFactory sf = conf.buildSessionFactory();
//3 获得session
Session session = sf.openSession();
//4 session获得操作事务的Transaction对象
//获得操作事务的tx对象
//Transaction tx = session.getTransaction();
//开启事务并获得操作事务的tx对象(建议使用)
Transaction tx2 = session.beginTransaction();
//----------------------------------------------
User user = session.get(User.class, 1l);
System.out.println(user);
//----------------------------------------------
tx2.commit();//提交事务
session.close();//释放资源
sf.close();//释放资源
Hibernate:
select
user0_.user_id as user_id1_3_0_,
user0_.user_name as user_nam2_3_0_,
user0_.user_code as user_cod3_3_0_,
user0_.user_password as user_pas4_3_0_,
user0_.user_state as user_sta5_3_0_
from
sys_user user0_
where
user0_.user_id=?
domain.User@31e04b13
修改
//1 创建,调用空参构造
Configuration conf = new Configuration().configure();
//2 根据配置信息,创建 SessionFactory对象
SessionFactory sf = conf.buildSessionFactory();
//3 获得session
Session session = sf.openSession();
//4 session获得操作事务的Transaction对象
//获得操作事务的tx对象
//Transaction tx = session.getTransaction();
//开启事务并获得操作事务的tx对象(建议使用)
Transaction tx2 = session.beginTransaction();
//----------------------------------------------
//1 获得要修改的对象
User user = session.get(User.class, 1l);
//2 修改
user.setUser_name("程序员");
//3 执行update
session.update(user);
//----------------------------------------------
tx2.commit();//提交事务
session.close();//释放资源
sf.close();//释放资源
删除
//1 创建,调用空参构造
Configuration conf = new Configuration().configure();
//2 根据配置信息,创建 SessionFactory对象
SessionFactory sf = conf.buildSessionFactory();
//3 获得session
Session session = sf.openSession();
//4 session获得操作事务的Transaction对象
//获得操作事务的tx对象
Transaction tx = session.getTransaction();
tx.begin();
//开启事务并获得操作事务的tx对象(建议使用)
Transaction tx2 = session.beginTransaction();
//----------------------------------------------
//1 获得要修改的对象
User user = session.get(User.class, 1l);
//2 调用delete删除对象
session.delete(user);
//----------------------------------------------
tx2.commit();//提交事务
session.close();//释放资源
sf.close();//释放资源