package cn.itcast.b_dao;

import java.util.List;

import org.hibernate.Criteria;
import org.hibernate.Session;
import org.hibernate.Transaction;

import cn.itcast.a_helloworld.User;

public class UserDao {
/**
* 保存
*
* @param user
* 用户
*/
public void save(User user) {
Session session = HibernateUtils.opensession();
Transaction tx = null;
try {
tx = session.beginTransaction();// 开始事务
// 保存
session.save(user);
tx.commit();// 提交事务
} catch (RuntimeException e) {
tx.rollback();// 回滚事务
throw e;
} finally {
session.close();// 释放资源
}
}

/**
* 更新
*
* @param user
* 用户
*/
public void update(User user) {
Session session = HibernateUtils.opensession();
Transaction tx = null;
try {
tx = session.beginTransaction();

// 操作
session.update(user);

tx.commit();// 提交事务
} catch (RuntimeException e) {
tx.rollback();// 回棍事务
throw e;
} finally {
session.close();// 释放资源
}
}

/**
* 删除
*
* @param id
* 根据id删除数据
*/
public void delete(Integer id) {
Session session = HibernateUtils.opensession();
Transaction tx = null;
try {
tx = session.beginTransaction();

// 操作
Object user = session.get(User.class, id);// 要先获取到这个对象
session.delete(user);// 删除的是实体对象

tx.commit();// 提交事务
} catch (RuntimeException e) {
tx.rollback();// 回滚事务
throw e;
} finally {
session.close();// 释放资源
}
}

/**
* 根据id查询一个User数据
*
* @param id
* 根据id查询数据
* @return 返回一条User数据
*/
public User getById(Integer id) {
Session session = HibernateUtils.opensession();
Transaction tx = null;
try {
tx = session.beginTransaction();// 打开事务

// 操作
User user = (User) session.get(User.class, id);

tx.commit();// 提交事务
return user;
} catch (RuntimeException e) {
tx.rollback();// 回滚事务
throw e;
} finally {
session.close();// 释放资源;
}
}

/**
* 查询所有用户
*
* @return 返回所有用户
*/
@SuppressWarnings("unchecked")
public List<User> findAll() {
Session session = HibernateUtils.opensession();
Transaction tx = null;
try {
tx = session.beginTransaction();// 开始事务

// 方式一: 使用HQL查询
// List<User> list = session.createQuery(//
// "FROM User WHERE id=5 order by id")//
// .list();
// 方式二:使用Criteria查询
Criteria criteria = session.createCriteria(User.class);
// criteria.add(Restrictions.eq("id", 5));
// criteria.addOrder(Order.desc("id"));
List<User> list = criteria.list();

tx.commit();// 提交事务
return list;
} catch (RuntimeException e) {
tx.rollback();
// session.getTransaction().rollback();// 回滚事务
throw e;
} finally {
session.close();// 释放资源
}
}

/**
* * 分页的查询数据列表
*
* @param firstResult
* 从结果列表中那个索引开始取数据
* @param maxResult
* 最多取多少条数据
* @return 一页的数据列表 + 总计录数
*/
/**
* @param firstResult
* @param maxResult
* @return
*/
@SuppressWarnings("unchecked")
public QueryResult findAll(Integer firstResult, Integer maxResult) {
Session session = HibernateUtils.opensession();
Transaction tx = null;
try {
tx = session.beginTransaction();// 开始事务

// 查询一页的数据列表
// 方式1
// Query query = session.createQuery("FROM User");
// query.setFirstResult(firstResult);
// query.setMaxResults(maxResult);
// List<User> list = query.list();// 操作

// 方式2
List<User> list = session.createQuery(//
"FROM User")//
.setFirstResult(firstResult)//
.setMaxResults(maxResult)//
.list();

// 查询总记录数
Long count = (Long) session.createQuery(//
"SELECT COUNT(*) FROM User")//
.uniqueResult();

tx.commit();// 提交事务

// 返回结果
return new QueryResult(count.intValue(), list);
} catch (RuntimeException e) {
tx.rollback();// 回滚事务
throw e;
} finally {
session.close();// 释放资源
}
}
}


package cn.itcast.b_dao;

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

public class HibernateUtils {
// SessionFactory全局只需要一个就行了
private static SessionFactory sessionFactory;

static {
// Configuration cfg = new Configuration();
// cfg.configure();// 读取默认配置文件(hibernate.cfg.xml)
// // cfg.configure("hibernate.cfg.xml");//读取指定位置的配置文件
// sessionFactory = cfg.buildSessionFactory();//生成会话工厂

//初始化SessionFactory
sessionFactory = new Configuration()//
.configure()//
.buildSessionFactory();
}

/**
* 获取全局唯一的SessionFactory
*
* @return 返回SessionFactory
*/
public static SessionFactory getSessionFactory() {
return sessionFactory;
}

/**
* 从全局唯一的SessionFactory中打开一个Session
*
* @return 返回Session
*/
public static Session opensession() {
return sessionFactory.openSession();
}
}


package cn.itcast.b_dao;

import java.util.List;

/**
* 查询结果分页
*
* @author 风清杨
* @version V1.0
*/
@SuppressWarnings("rawtypes")
public class QueryResult {
private int count;// 总记录数
private List list;// 一页的数据

public QueryResult(int count, List list) {
this.count = count;
this.list = list;
}

public int getCount() {
return count;
}

public void setCount(int count) {
this.count = count;
}

public List getList() {
return list;
}

public void setList(List list) {
this.list = list;
}

}


User.hbm.xml

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- 导入包 -->
<hibernate-mapping package="cn.itcast.a_helloworld">
<!-- 类名 -->
<class name="User" table="t_user">
<!-- id int类型 -->
<id name="id" type="int" column="id">
<!-- 自增长 -->
<generator class="native"/>
</id>
<property name="name" type="string" column="name"/>
</class>
</hibernate-mapping>


Hibernate.cfg.xml

<!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 name="foo">
<!-- 配置数据库信息 -->
<!-- 方言 -->
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
<!-- mysql连接配置 -->
<property name="connection.url">jdbc:mysql://localhost:3306/hibernate_20170423</property>
<!-- 配置连接mysql驱动 -->
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<!-- mysql用户名 -->
<property name="connection.username">root</property>
<!-- mysql密码 -->
<property name="hibernate.connection.password">root</property>

<!-- 其它配置 -->
<!-- 显示生成的SQL语句 -->
<property name="hibernate.show_sql">true</property>
<!-- 格式化SQL语 -->
<property name="hibernate.format_sql">false</property>

<!-- create:先删除,再创建。 update:如果表不存在就创建,不一样就更新,一样就什么都不做。 create-dorp:初始化时创建表,SessionFactory执行close()时删除表。
validate:验证表结构是否一致,如果不一致,就抛异常。 -->
<property name="hbm2ddl.auto">update</property>

<!-- 导入映射文件 -->
<mapping resource="cn/itcast/c_hbm_property/User.hbm.xml" />

</session-factory>
</hibernate-configuration>