zoukankan      html  css  js  c++  java
  • 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();//释放资源
    

      

  • 相关阅读:
    简单的java socket 示例
    Java Socket编程
    session的常用方法。
    Request与session与application的区别
    百度echart使用心得,百度图表。
    SpingMVC ModelAndView, Model,Control以及参数传递
    Flume理论研究与实验
    RocketMq在SparkStreaming中的应用总结
    数据实践过程中理论总结
    flink-vs.-spark
  • 原文地址:https://www.cnblogs.com/hywhyme/p/11613251.html
Copyright © 2011-2022 走看看