温故而知新之Hibernate

Test类 testSave.java

import java.util.List;
import org.hibernate.Criteria;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.hibernate.criterion.Order;
import org.junit.Test;
import com.DB.edu.Student;
public class testSave {
	//执行查找,不能忘记在实体类写一个tostring();
	//删除或修改,一定要先查再操作****,删除的session.delete()里面放的是对象,所以把那个查询到的对象放到里面,只有查询不需要事务,增删改都要事务
	@Test
	public void testSave(){
	// 先加载配置文件默认加载src目录下的配置文件,加载特定名称的配置文件
		Configuration config=new Configuration().configure();
	//1.创建SessionFactory对象,一个数据库只需要一个SessionFactory,创建工具类来实现,		不是轻量级的,它的创建于销毁浪费资源,
	//2.它是对hibernate的初始化,可以生产SessionFactory 重量级对象
	SessionFactory factory = config.buildSessionFactory();
	/*相当于数据库的连接池
	里面出现错误是看看hibernate.cfg.xml里是否出错,因为它的内容就在<session-factory>中
 	创建session对象,hibernate一级缓存由session缓存,单线程的对象,线程安全的问题,刷出缓存,更新缓存的数据session.flush,
	内部包含session.commit,session.flush能变更的查询,*/
	//从工厂中回去session对象,与数据库会话
	Session session = factory.openSession();
	// 开启事务
	Transaction tr = session.beginTransaction();
	// 编写保存代码
	Student c = new Student();
	//  已经自动递增
	//c.setId(0);
	c.setName("测试名称");
	c.setAge(110);
	// 保存客户
	//System.out.println("手动赋值为:"+c.getId());
	//session.save(c);
	//session.get(arg0, arg1)arg0__javabean的对象,主键的值
	Student s=session.get(Student.class,1);
	System.out.println(s);
	//session.delete(c);
	//System.out.println("手动赋值为:"+c.getId());
	// 提交事务
	tr.commit();
	// 释放资源
	session.close();
	factory.close();
	}
	/**
	 * 状态
	 *  瞬时  数据库中没有数据与之对应 超过作用域会被JVM垃圾回收器回收,
		持久
		托管
	 */

	@Test
	public void getStudent(Student stu){
	 	Session session=HibernateUtils.openSession();
	 	Transaction tr=session.beginTransaction();
	 	  Criteria criteria = session.createCriteria(Student.class);
	 	  // 设置排序
	 	  criteria.addOrder(Order.desc("id"));
	 	  criteria.setFirstResult(0);
	 	  criteria.setMaxResults(3);
	 	  List<Student> list = criteria.list();
	 	  for (Student Student : list) {
	 	      System.out.println(Student);
	 	  }
	 	  tr.commit();
	 	session.close();
	}

}

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-configuration>
<session-factory>
<!-- hibernate可以省略 -->
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/mydata</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">123456</property>
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
<!-- 以下为可选配置 -->
<!-- 显示sql语句 -->
<property name="hibernate.show_sql">true</property>
<!--  让sql语句格式化显示 -->
<property name="hibernate.format_sql">true</property>
<!-- 创建映射的表 慎用,否则表中的数据会被删掉,
<property name="hibernate.hbm2ddl.auto">create</property>-->
<!-- 没有表会创建,表不会删除,里面的数据还在,还可以进行字段的更新,在java的实例化对象中,添加它都在数据库中操作 但是不能删除-->
<property name="hibernate.hbm2ddl.auto">update</property>
<!-- 对映射进行校验 -->
<property name="hibernate.hbm2ddl.auto">validate</property>
<!-- 现在的Hibernate框架中,使用session对象开启事务,所以需要来传递session对象,框架提供了ThreadLocal的方式
    * 需要在hibernate.cfg.xml的配置文件中提供配置-->
    <!-- 这句话是为了getCurrentSession做准备
      a、如果是本地事务(jdbc事务)
     <propertyname="hibernate.current_session_context_class">thread</property>
      b、如果是全局事务(jta事务)
       <propertyname="hibernate.current_session_context_class">jta</property> -->
<property name="hibernate.current_session_context_class">thread</property>
<!-- 必须要有的映射路径 ***************************hibernate -->
<mapping resource="com/DB/edu/Student.hbm.xml"/>
</session-factory>
</hibernate-configuration>

Student.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">
<!-- multable: 配置是否可更新  动态的更新, 对象为null时均不在updata的语句中 -->
<hibernate-mapping package="com.DB.edu">
<class name="com.DB.edu.Student" table="student">
 <id name="id" column="id"><!-- type种类 -->
<generator class="increment"/><!--注意点: 适用类型 (代理主键) 数据类型  数据库的限制   -->
</id>
<property name="name" column="name" />
<property name="age" column="age"/>
</class>
</hibernate-mapping>

在hiubernate中常用的两种查询方式参照
HQL查询
QBC(Query By Criteria)查询
原生SQL查询
https://blog.csdn.net/weixin_39941298/article/details/81699743
TestSelect .java测试类

import java.util.List;

import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;

import com.DB.edu.Emp;

public class TestSelect {
	public static void main(String[] args) {
		select();

	}

	public static void select(){
			// 先加载配置文件
			Configuration config = new Configuration().configure();
			SessionFactory factory = config.buildSessionFactory();
			Session session = factory.openSession();
			//Transaction tr=session.beginTransaction();
			String hql="from Emp where empmoney>?";
			Query query= session.createQuery(hql);
			query.setInteger(0, 5000);
			List<Emp> em=query.list();
			for(Emp e:em){
				System.out.println(e.toString());
			}
			//tr.commit();
			session.close();
			factory.close();
	}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值