Hibernate(下)

来源:互联网 发布:大学生程序员怎么赚钱 编辑:程序博客网 时间:2024/05/18 09:21
Hibenate中对象状态

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="">>

原创粉丝点击