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();//释放资源