sessionFactory的创建和四种查询方式
1,关于sessionFactory的创建
5.0版本之前,下面这种方式在5.0及之后,可能会出问题,建议修改为5.0之后的方式
// 实例化Configuration
Configuration configuration = new Configuration();
// 加载hibernate.cfg.xml文件
configuration.configure("/hibernate.cfg.xml");
// 创建SessionFactory
StandardServiceRegistryBuilder standardServiceRegistryBuilder = new StandardServiceRegistryBuilder();
standardServiceRegistryBuilder.applySettings(configuration
.getProperties());
SessionFactory sessionFactory = configuration
.buildSessionFactory(standardServiceRegistryBuilder.build());
5.0版本以及5.0之后
SessionFactory sessionFactory = new Configuration().configure("/hibernate.cfg.xml").buildSessionFactory();
官方建议的方法
StandardServiceRegistry standardRegistry = new StandardServiceRegistryBuilder() .configure( "hibernate.cfg.xml" ) .build(); Metadata metadata = new MetadataSources( standardRegistry ) .addAnnotatedClass( HiberNew.class ) .getMetadataBuilder() .applyImplicitNamingStrategy( ImplicitNamingStrategyJpaCompliantImpl.INSTANCE ) .build(); SessionFactory sessionFactory = metadata.getSessionFactoryBuilder().build();
hibernate获取sessionFactory的工具类
public class HibernateUtils {
private static String CONFIG_FILE_LOCATION = "/hibernate.cfg.xml";
private static final ThreadLocal<Session> threadLocal
= new ThreadLocal<Session>();
private static SessionFactory sessionFactory;
private static String configFile = CONFIG_FILE_LOCATION;
/* 静态代码块创建SessionFactory */
static {
try {
sessionFactory = new Configuration().configure(configFile).buildSessionFactory();
} catch (Exception e) {
System.err.println("%%%% Error Creating SessionFactory %%%%");
e.printStackTrace();
}
}
private HibernateUtils() {
}
/**
* 返回ThreadLocal中的session实例
*/
public static Session getSession() throws HibernateException {
Session session = (Session) threadLocal.get();
if (session == null || !session.isOpen()) {
if (sessionFactory == null) {
rebuildSessionFactory();
}
session = (sessionFactory != null) ? sessionFactory.openSession()
: null;
threadLocal.set(session);
}
return session;
}
/**
* 返回Hibernate的SessionFactory
*/
public static void rebuildSessionFactory() {
try {
sessionFactory = new Configuration().configure(configFile).buildSessionFactory();
} catch (Exception e) {
System.err.println("%%%% Error Creating SessionFactory %%%%");
e.printStackTrace();
}
}
/**
* 关闭Session实例并且把ThreadLocal中副本清除
*/
public static void closeSession() throws HibernateException {
Session session = (Session) threadLocal.get();
threadLocal.set(null);
if (session != null) {
session.close();
}
}
/**
* 返回SessionFactory
*/
public static SessionFactory getSessionFactory() {
return sessionFactory;
}
public static void setConfigFile(String configFile) {
HibernateUtils.configFile = configFile;
sessionFactory = null;
}
}
2.hibernate的使用
这里要注意,hibernate不会自动产生数据库,所以你需要自己先建立一个空数据库,编码设置为utf8,hibernate自己建表时会参考数据库的编码格式
1)配置文件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> <!-- 配置访问Oracle数据库参数信息 --> <property name="dialect"> org.hibernate.dialect.MySQLDialect </property> <property name="connection.driver_class"> com.mysql.jdbc.Driver </property> <property name="connection.url"> jdbc:mysql://127.0.0.1:3306/hibTest?useUnicode=true&characterEncoding=UTF-8 <!-- jdbc:oracle:thin:@localhost:1521:orcl --> </property> <property name="connection.username">root</property> <property name="connection.password">password</property> <!-- 在控制台显示SQL语句 --> <property name="show_sql">true</property> <!--根据需要自动生成、更新数据表 --> <property name="hbm2ddl.auto">update</property> <!-- 注册所有ORM映射文件 --> <mapping resource="com/qst/chapter05/pojos/Student.hbm.xml" /> <!-- <mapping resource="com/qst/chapter05/pojos/User.hbm.xml" /> --> <mapping class="com.qst.chapter05.pojos.TestAno" /> <mapping class="com.qst.chapter05.pojos.User" /> </session-factory> </hibernate-configuration>
2)POJO 不建议用xml的方式,用注解更简单易读
package com.qst.chapter05.pojos;
import java.io.Serializable;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
@Entity
@Table(name="user")
public class User implements Serializable {
/**
*
*/
private static final long serialVersionUID = 1L;
/* 用户ID */
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name = "id", insertable = false, updatable = false)
private Integer id;
/* 用户名 */
@Column(name = "user_name")
private String userName;
/* 密码 */
@Column(name = "user_pwd")
private String userPwd;
/* 权限 */
@Column(name = "role")
private Integer role;
/* 默认构造方法 */
public User() {
}
/* 根据属性创建 构造方法 */
public User(String userName, String userPwd,Integer role) {
this.userName = userName;
this.userPwd=userPwd;
this.role=role;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getUserPwd() {
return userPwd;
}
public void setUserPwd(String userPwd) {
this.userPwd = userPwd;
}
public Integer getRole() {
return role;
}
public void setRole(Integer role) {
this.role = role;
}
}
测试代码
session自带的方法
保存
public class UserDemo {
public static void main(String[] args) {
// 创建User对象
User user = new User("zhangsan", "123", 1);
SessionFactory sessionFactory = new Configuration().configure("/hibernate.cfg.xml").buildSessionFactory();
// 打开Session
Session session = sessionFactory.openSession();
// 开始一个事务
Transaction trans = session.beginTransaction();
// 持久化操作
session.save(user);
// 提交事务
trans.commit();
// 关闭Session
session.close();
}
}
更新
session.update(user);
查询
User user = (User) session.get(User.class, key);
HQL语句
Query query = session.createQuery("from User");
// 执行查询
List<User> list = query.list();
// 遍历输出
for (User u : list) {
System.out.println(u.getId() + "\t" + u.getUserName() + "\t"
+ u.getUserPwd() + "\t" + u.getRole());
}
SQL查询,这个查完了需要手工映射,比较麻烦
Query query = session.createSQLQuery("select * from user");
// 执行查询
List<Object[]> list = query.list();
// 遍历输出
for (Object[] u : list) {
System.out.println(u[0] + "\t" + u[1] + "\t"
+ u[2] + "\t" + u[3]);
}
Criteria查询
Criteria criteria = session.createCriteria(User.class); // 执行查询 List<User> list = criteria.list(); // 遍历输出 for (User stu : list) { System.out.println(stu.getId() + "\t" + stu.getUserName() + "\t"+stu.getUserPwd()); }

浙公网安备 33010602011771号