Hibernate(下)
来源:互联网 发布:大学生程序员怎么赚钱 编辑:程序博客网 时间:2024/05/18 09:21
n 临时状态
1) 直接new出来的对象
2) 不处于session的管理
3) 数据库没有对象的记录
n 持久化状态
1) 处于session的管理
2) 数据库中有对应的记录
3) 怎么来的?
执行session对象的方法:save/update/get/load/list()等方法!
执行上面的方法,当前操作的对象就是持久化状态!
4) 对处于持久化状态的对象,进行修改的时候,最后提交事务会把最后修改的结果反映到数据库中!
n 游离状态
1) 一般指session关闭后,对象由持久化变为游离状态!
2) 不处于session的管理!
3) 数据库中有对象的记录!
举例1:
User user = new User(); 临时
举例2:
User user = new User(); (数据库中有id为1的记录)
user.setId(1); 手动模拟一个游离状态的对象!
public class App_1_status {
private static SessionFactory sf;
static {
sf = new Configuration()
.configure()
.addClass(User.class)
.addClass(Address.class)
.buildSessionFactory();
}
// 问题:只保存地址,且建立与用户的关系?
// 在保存地址的时候,关联的用户需要有主键; 这样保存地址时候,会建立与用户的关系!(不保存用户!)
@Test
public void testLazy(){
Session session = sf.openSession();
session.beginTransaction();
// 需求: 给“张总添加地址信息”
// 地址
Address address = new Address();
address.setAddress("天河区东圃镇BRT");
// 用户
User user = new User();
user.setId(2); // 设置用户主键 (对象状态,以及状态转换!)
//user.setName("张总");
// 关系
address.setUser(user);
// 保存
session.save(address); // 保存地址
session.getTransaction().commit();
session.close();
}
@Test
public void po_status(){
Session session = sf.openSession();
session.beginTransaction();
// 创建对象
User user = new User(); // 【【临时】】
user.setName("测试用户");
// 保存
session.save(user); /
//Query q = session.createQuery("select d.user, count(*) from Address d group by d.user having count(*) >3");
// Query q = session.createQuery("from Address d inner join d.user");
// fetch 把“右表”的数据,填充到“左表!”
Query q = session.createQuery("from Address d inner join fetch d.user");
System.out.println(q.list());
session.getTransaction().commit();
session.close();
}
// 内连接, 获取数据
@Test
public void testhql2(){
Session session = sf.openSession();
session.beginTransaction();
// 显示: 地址、用户
// 方式1:
// Query q = session.createQuery("from Address where id=1");
// Address address = (Address) q.uniqueResult();
// System.out.println(address.getAddress());
// 方式2: 连接查询
// Query q = session.createQuery("from Address d inner join d.user where d.id=1");
// Object[] obj = (Object[]) q.uniqueResult();
// Address address = (Address) obj[0];
// 方式3: 连接查询,fetch, 更方便获取数据
Query q = session.createQuery("from Address d inner join fetch d.user where d.id=1");
Address address = (Address) q.uniqueResult();
session.getTransaction().commit();
session.close();
// 如果使用对象关联的数据?(dao中关闭session, jsp中使用!)
System.out.println(address.getUser().getName());
}
// 左/右外连接
@Test
public void testhql3(){
Session session = sf.openSession();
session.beginTransaction();
// Query q = session.createQuery("from User u left join u.addresses ");
// Listlist = q.list();
// list.size();
Query q = session.createQuery("from User u left join fetch u.addresses ");
List list = q.list(); // select.....
list.size();
session.getTransaction().commit();
session.close();
}
}
4) Criteria 查询
QBC, Query By Criteria, 更加面向对象的查询!
public class App_2_qbc {
private static SessionFactory sf;
static {
sf = new Configuration()
.configure()
.addClass(User.class)
.addClass(Address.class)
.buildSessionFactory();
}
@Test
public void testQBC(){
Session session = sf.openSession();
session.beginTransaction();
// Criteria查询
Criteria c =session.createCriteria(User.class);
// 添加条件
c.add(Restrictions.idEq(1)); //根据主键查询!
c.add(Restrictions.eq("name", "副班2")); // 等值查询
List list = c.list();
System.out.println(list);
session.getTransaction().commit();
session.close();
}
@Test
public void testQBC2(){
Session session = sf.openSession();
session.beginTransaction();
// Criteria查询
Criteria c =session.createCriteria(User.class);
// 添加条件 , 用map封装
Map map = new HashMap();
map.put("id", 1); // map的key表示对象的属性!
map.put("name", "副班1");
c.add(Restrictions.allEq(map));
List list = c.list();
System.out.println(list);
session.getTransaction().commit();
session.close();
}
@Test
public void testQBC3(){
Session session = sf.openSession();
session.beginTransaction();
// Example查询 : 把对象属性作为条件!
User user = new User();
// user.setId(1000); 不会作为查询条件!
user.setName("副班1");
user.setAge(25);
user.setSex('女');
// Criteria查询
Criteria c =session.createCriteria(User.class);
// 把对象的属性作为查询条件!
c.add(Example.create(user));
System.out.println(c.list());
session.getTransaction().commit();
session.close();
}
}
5) 本地SQL查询
复杂的sql语句,有些时候,hibernate是实现不了的!
此时用hql就不行了!
所以,
Hibernate也提供了对原始的sql语句的支持,我们可以是在hibernate中写sql语句!
缺点:
不能跨数据库平台,而hql或Criteria 可以!
如果换了数据库,需要修改sql语句!改代码!
通常,
优先选择HQL查询!
@Test
public void testQBC(){
Session session = sf.openSession();
session.beginTransaction();
// 获取本地sql查询接口
SQLQuery q = session.createSQLQuery("SELECT * FROM t_address d");
// 查询返回的是:List
, 如果希望把每一条记录封装为对象: List//System.out.println(q.list());
// 可以这样做,
q.addEntity(Address.class); // Address对象必须映射!
System.out.println(q.list());
session.getTransaction().commit();
session.close();
}
2. Hibernate对连接池支持
连接池:
C3P0连接池!
Hibernate对C3P0连接池有支持!
hibernate.properties
#################################
### Hibernate Connection Pool ###
#################################
hibernate.connection.pool_size 1 hibernate默认使用的连接池,只支持1个连接
###########################
### C3P0 Connection Pool### hibernate对c3p0连接池的支持
###########################
#hibernate.c3p0.max_size 2
#hibernate.c3p0.min_size 2
#hibernate.c3p0.timeout 5000
#hibernate.c3p0.max_statements 100
#hibernate.c3p0.idle_test_period 3000
#hibernate.c3p0.acquire_increment 2
#hibernate.c3p0.validate false
连接池驱动类 (CombopooledDataSource)
#hibernate.connection.provider_class org.hibernate.connection.C3P0ConnectionProvider
连接池配置:
DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<</span>hibernate-configuration>
<</span>session-factory>
<</span>property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</</span>property>
<</span>property name="hibernate.connection.url">jdbc:mysql:///day33?createDatabaseIfNotExist=true</</span>property>
<</span>property name="hibernate.connection.username">root</</span>property>
<</span>property name="hibernate.connection.password">root</</span>property>
<</span>property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</</span>property>
<</span>property name="hibernate.show_sql">true</</span>property>
<</span>property name="hibernate.format_sql">true</</span>property>
<</span>property name="hibernate.hbm2ddl.auto">update</</span>property>
<</span>property name="">>
- Hibernate(下)
- Eclipse下安装Hibernate
- Hibernate课程下
- Hibernate初识(下)
- win10下安装hibernate
- Spring+Hibernate下配置Hibernate二级缓存EhCache
- Spring+Hibernate下配置Hibernate二级缓存EhCache
- Hibernate下数据批量处理
- hibernate下实现分页实例
- Spring下Hibernate Annotation注解
- Spring下Hibernate Annotation注解
- Hibernate HQL 语法大全(下)
- myeclipse下Hibernate的使用
- MyEclipse9下开发Hibernate实例
- 学习下Hibernate的Criteria
- Hibernate框架笔记(下)
- hibernate tool 教下新手
- maven下搭建hibernate体验
- jQuery中Ajax事件beforesend及各参数含义
- Hibernate(中)
- LeetCode Recover Binary Search Tree
- 91.使用BigDecimal进行精确运算
- python opencv入门(学习笔记no.3)-从摄像头读取视频并显示
- Hibernate(下)
- Java Servlet API中文说明文档
- OGNL表达式
- 学习互联网架构第四课(volatile关键字)
- spark 内存管理
- intval()和int()
- 剑指Offer-37
- Struts2后台校验两种方式
- android 自定义MP4播放器