hibernate简单查询单表数据库(1)
Hibernate :基于JDBC的,不用写SQL语句的持久层框架,其构架JAVA实体对象映射储存到数据库的表中,只需要维护对象与表的映射关系。
Hibernate自动生成SQL语句。Hibernate简化了对数据库的操作,提供了不同数据库的统一接口,应用程序开发使跨数据库成了可能。
Hibernate是开源的、用于封装数据库访问层的组件,我们称之为数据访问层框架(持久层框架),之前我们通过JDBC/SQL语句从数据库中访问/操作数据,而Hibernate就封装了这些操作,专门用于数据访问层的组件技术。
出现Hibernate框架之前在企业项目开发过程中,如下几点造就了程序员的痛苦:hibernate的好处是:
-
SQL语句过于繁杂,和数据库的耦合度太高。
-
2.不同数据库之间SQL不同,导致项目难以移植。
-
3.二维关系表和对象之间数据结构不匹配。基于以上苦难,Hibernate应用而生。对象关系映射
-
在我们的应用程序(APP)中,数据用对象来体现,而在数据库中,数据使用表的形式保存。Hibernate用于应用程序中的对象(Object)与表中的数据关系之间的映射(Mapping),即把对象保存到关系表中或者把关系表中数据取出映射为对象。6、可以这样理解,当我们使用 Hibernate 框架技术,就可以直接从数据库中取出 Java 对象,或者把Java 对象直接保存于数据库中,中间写 sql 语句等繁琐的步骤被 Hibernate 封装,对我们是透明的。
-
Hibernate 自动化的程度很高的组件,因此比较难以驾驭,在对 Hibernate 理解不够透彻的情况下使用,稍不留神可能就会影响性能。
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
核心API:configuration Sessionfactory session query transaction
工作原理:Hibernate 启动------>configuration(xml)-->
SessionFactory---->Session--->创建Transaction--->持久化操作
----->提交transaction----关闭session
使用: 1、导包 2、文件配置 :Hibernate.cfg.xml和xx.hbm.xml(映射关系)
Saveorupdate:有就保存。没有就更新
在数据库中的主外键的形式来体现,实体对象中体现在对象与对象之间的引用。Hibernate多表之间关系不好做。Hibernate 可以控制外键,主表不需要创建外键
权限:
1、用URL控制
2、资源控制 shiro 权威指南
Hibernate的缓存机制:
Hibernate是持久层的数据框架,与数据库交互,为了降低应用程序与物理数据源的交互评率,提高应用的运行的性能
工作原理:查询请求首先进入一级缓存,如果没有进到二级缓存查找,如果还没有,与数据库进行交互,将查询到的结果返回给应用程序。
一级缓存的管理:
evict(obj)将对象从session中清除,从持久态变为游离态。
Clear()将session中的所有对象读清除。
Flush():将缓存中的数据与数据库中的数据进行同步。
Contains(obj):判断缓存中是否存在已知的对象。
load( ):是懒加载。
一级缓存的应用:save( ) ;get();load()将查询的数据放到session
HQL查询:将查询到的对象放到session中
主键的生成的方式
1、自增长
2、Sequence
3、UUID
搭建项目
一、这里在数据库test中建3个表,分别为T_user、T_student、T_teaher
t_user表
t_student表
t_teacher表
二、在com.zhiyou100.entity中分别根据数据库的属性创建User、Teaher、Student
三、配置hibernate.cfg.xml文件
<hibernate-configuration>
<!--与数据库进行连接,建sessionFactory工厂-->
<session-factory>
<property name="dialect">org.hibernate.dialect.MySQLDialect</property>
<property name="connection.username">root</property>
<property name="connection.password">123456</property>
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="connection.url">jdbc:mysql:///test</property>
<property name="show_sql">true</property>
<!-- 数据库与实体类关系表不用写SQl语句 -->
<mapping resource="User.hbm.xml"/>
<mapping resource="Student.hbm.xml"/>
<mapping resource="Teacher.hbm.xml"/>
<mapping resource="Book.hbm.xml"/>
</session-factory>
</hibernate-configuration>
在这里必须在每个.xml文件中加
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
四、根据数据库的属性分别建.hbm.xml文件
User.hbm.xml
<hibernate-mapping>
<class name="com.zhiyou100.entity.User" table="T_user">
<id name="id" column="id" type="string">
<generator class="uuid"></generator>
</id>
<property name="name" column="name" type="string"></property>
</class>
</hibernate-mapping>
Teacher.hbm.xml
<hibernate-mapping>
<class name="com.zhiyou100.entity.Teacher" table="T_teacher">
<id name="id" column="id" type="int">
</id>
<property name="name" column="name" type="string"></property>
</class>
</hibernate-mapping>
Studnt.hbm.xml
<hibernate-mapping>
<class name="com.zhiyou100.entity.Student" table="T_student">
<id name="id" column="id" type="int">
<generator class="identity"></generator>
</id>
<property name="name" column="name" type="string"></property>
</class>
</hibernate-mapping>
五、进行测试建Testcase,查询条件的时候要参照数据库中的条件
public class TestCase {
public static Session openSession() {
//读取数据库信息
Configuration cfg = new Configuration();
cfg.configure("Hibernate.cfg.xml");
//获取session对象
SessionFactory sf = cfg.buildSessionFactory();
Session session = sf.openSession();
return session;
}
//测试类
/*public static void main(String[] args) {
System.out.println(TestCase.openSession());
}*/
@Test
public void testUser() {
//获取session对象
Session session=TestCase.openSession();
//通过Session操作数据库
User user = (User) session.get(User.class,"1");
System.out.println(user.getName());
session.close();
}
@Test
public void testStudent() {
//获取Session
Session session=TestCase.openSession();
//开启事务
Transaction t = session.beginTransaction();
t.begin();
//创建Student对象,给name赋值
Student st=new Student();
//st.setId();
st.setName("tom");
session.save(st);
t.commit();
session.close();
}
@Test
public void testTeacher() {
//获取Session
Session session=TestCase.openSession();
//开启事务
Transaction t = session.beginTransaction();
t.begin();
//创建Student对象,给name赋值
Teacher st=new Teacher();
//st.setId();
st.setName("tom");
session.save(st);
t.commit();
session.close();
}
@Test
/*
* 修改,先查找,后修改
*/
public void testUpdate() {
Session session = TestCase.openSession();
Transaction t = session.beginTransaction();
t.begin();
Student student = (Student) session.get(Student.class, 2);
System.out.println(student);
student.setName("Jery");
System.out.println(student);
t.commit();
System.out.println("");
session.close();
}
@Test
public void testDelete() {
Session session = TestCase.openSession();
Transaction t = session.beginTransaction();
t.begin();
Student st = (Student) session.get(Student.class, 5);
session.delete(st);
t.commit();
session.close();
}
@Test
public void testEvict() {
Session session = TestCase.openSession();
Transaction t = session.beginTransaction();
t.begin();
Student student = (Student) session.get(Student.class, 6);
System.out.println(student);
//与studnet解除关系 ,从session中清除student对象
session.evict(student);
student.setName("tmo");
System.out.println(student);
t.commit();
session.close();
}
@Test
public void testObjectUpdate() {
//游离态变回持久态
Session session = TestCase.openSession();
Transaction t = session.beginTransaction();
t.begin();
//获取持久态对象
Student student = (Student) session.get(Student.class, 6);
session.evict(student);
System.out.println(student);
//让对象回到持久态
student.setName("2");
session.update(student);
System.out.println(student);
t.commit();
session.close();
}
//练习HQL
@Test
public void testSelect() {
//1.获取Session
Session session = TestCase.openSession();
// 不用获取事务
//2.编写HQL语句
String hql="from Student";
//3.创建query对象
Query query=session.createQuery(hql);
//4.调用list()方法查询数据
@SuppressWarnings("unchecked")
List<Student> list=query.list();
for (Student student : list) {
System.out.println(student);
}
//6.关闭session
session.close();
}
@Test
//hql 条件查询
public void testWhere() {
//获取session
Session session = TestCase.openSession();
//2.编写HQL语句
String hql="from Student where name=:name";
//3.创建query对象
Query query = session.createQuery(hql);
//4.设置参数
query.setString("name", "Jery");
//5.调用list()方法查询数据
@SuppressWarnings("unchecked")
List <Student> list= query.list();
for (Student student : list) {
System.out.println(student);
}
//6.关闭session
session.close();
}
//排序查询,查询Student所有记录,以ID倒序的方式显示出来
@Test
public void testOrder() {
//获取session
Session session = TestCase.openSession();
String hql="from Student order by id desc";
Query query = session.createQuery(hql);
@SuppressWarnings("unchecked")
List<Student> list = query.list();
for (Student student : list) {
System.out.println(student);
}
session.close();
}
在测试的时候细心,后续继续改善!!!