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&amp;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());
}

sessionFactory的创建和四种查询方式的更多相关文章

  1. Hibernate的四种查询方式(主键查询,HQL查询,Criteria查询,本地sql查询)和修改和添加

    Hibernate的添加,修改,查询(三种查询方式)的方法: 案例演示: 1:第一步,导包,老生常谈了都是,省略: 2:第二步,创建数据库和数据表,表结构如下所示: 3:第三步创建实体类User.ja ...

  2. Spring Data Jpa的四种查询方式

    一.调用接口的方式 1.基本介绍 通过调用接口里的方法查询,需要我们自定义的接口继承Spring Data Jpa规定的接口 public interface UserDao extends JpaR ...

  3. Hibernate第四天——查询方式

    Hibernate入门最后一天第四天,我们进行查询方式的更进一步的细化: 先看一下大致的Hibernate的提供的查询的方式: 1.对象导航查询 2.OID查询 3.HQL查询 4.QBC查询 5.本 ...

  4. Android数据的四种存储方式SharedPreferences、SQLite、Content Provider和File (三) —— SharePreferences

    除了SQLite数据库外,SharedPreferences也是一种轻型的数据存储方式,它的本质是基于XML文件存储key-value键值对数据,通常用来存储一些简单的配置信息.其存储位置在/data ...

  5. Android数据的四种存储方式SharedPreferences、SQLite、Content Provider和File (二) —— SQLite

    SQLite是一种转为嵌入式设备设计的轻型数据库,其只有五种数据类型,分别是: NULL: 空值 INTEGER: 整数 REAL: 浮点数 TEXT: 字符串 BLOB: 大数据 在SQLite中, ...

  6. [Android]Android数据的四种存储方式

    存储方式 Android提供以下四种存储方式: SharePreference SQLite File ContentProvider Android系统中数据基本都是私有的,一般存放在“data/d ...

  7. Hibernate的Api以及三种查询方式

    Hibernate  Api |-- Configuration       配置管理类对象 config.configure();    加载主配置文件的方法(hibernate.cfg.xml) ...

  8. (转)Android数据的四种存储方式SharedPreferences、SQLite、Content Provider和File (三) —— SharePreferences

    除了SQLite数据库外,SharedPreferences也是一种轻型的数据存储方式,它的本质是基于XML文件存储key-value键值对数据,通常用来存储一些简单的配置信息.其存储位置在/data ...

  9. [转][Android]Android数据的四种存储方式

    android.database.sqlite类 SQLiteQueryBuilder java.lang.Object android.database.sqlite.SQLiteQueryBuil ...

随机推荐

  1. TOJ 1203: Number Sequence

    1203: Number Sequence Time Limit(Common/Java):1000MS/10000MS     Memory Limit:65536KByte Total Submi ...

  2. “玲珑杯”ACM比赛 Round #11 " ---1097 - 萌萌哒的第二题

    1097 - 萌萌哒的第二题 题意:中文题好像没有必要说题意了吧.. 思路:我们知道由于运输桥不能交叉,所以从右往左所修建的桥的序号是严格单增的.但是每个工厂B有6种选择,只能选一个求最多能建造几座桥 ...

  3. 【bzoj4826】[Hnoi2017]影魔 单调栈+可持久化线段树

    题目描述 影魔,奈文摩尔,据说有着一个诗人的灵魂.事实上,他吞噬的诗人灵魂早已成千上万.千百年来,他收集了各式各样的灵魂,包括诗人.牧师.帝王.乞丐.奴隶.罪人,当然,还有英雄.每一个灵魂,都有着自己 ...

  4. 持续集成---jenkins环境部署

    一.环境准备 操作系统:linux系统,此时我安装的是centos6.5,操作步骤具体见博客<虚拟机安装centos6.5> 依赖软件:1.jdk, 2.tomcat9(需要安装两个,一个 ...

  5. 【luogu】P1772物流运输(最短路+DP)

    题目链接 对于本题我们设ext[i][j]计算第i个码头在前j天总共有几天不能用(其实就一前缀和),设dis[i][j]是从第i天到第j天不变运输路线的最短路径,设f[i]是前i天运输货物的最小花费. ...

  6. spring两个核心IOC、AOP

    Spring是一个开放源代码的设计层面框架,他解决的是业务逻辑层和其他各层的松耦合问题,因此它将面向接口的编程思想贯穿整个系统应用.Spring是于2003 年兴起的一个轻量级的Java 开发框架,由 ...

  7. SLF4J 简单日志门面 介绍和使用

    参考:http://singleant.iteye.com/blog/934593        http://liuzidong.iteye.com/blog/776072 介绍: 简单日记门面(s ...

  8. Cards BZOJ 1004

    Cards [问题描述] 小春现在很清闲,面对书桌上的N张牌,他决定给每张染色,目前小春只有3种颜色:红色,蓝色,绿色.他询问Sun有多少种染色方案,Sun很快就给出了答案.进一步,小春要求染出Sr张 ...

  9. 记住密码后,密码框Password会自动带出数据

    一般登陆之后浏览器会询问是否记住密码,如果把密码记住在浏览器上,下次登陆的时候浏览器会把用户名和密码自动填充到登录页面.前段时间服务站平台的员工账号模块提测后,测试提出360浏览器记住密码后会自用把登 ...

  10. (8)C#连sqlserver

    str="Data Source=ip; Network Library=DBMSSOCN; Initial Catalog=数据库; User ID=sa; Password=xx&quo ...