java_hibernate 框架1

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

  

原文地址:https://www.cnblogs.com/hywhyme/p/11613251.html