Hibernate的环境搭建(uid方式):

1:导入包

2:创建实体对象

3:hibernate的映射配置文件

4:hibernate的核心配置文件

5:创建测试类实现表的创建

2:创建实体对象—User.java

private int uid;

private String username;

private String password;

private String address;

3:hibernate的映射配置文件---User.hbm.xml

<?xml version="1.0" encoding="UTF-8"?>

<!-- 导入约束 -->

<!DOCTYPE hibernate-mapping PUBLIC

"-//Hibernate/Hibernate Mapping DTD 3.0//EN"

"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">

<hibernate-mapping>

<!--表名对应 ,name属性要求是实体对象的全路径,table属性要求是对应的表名 -->

<class name="com.entity.User" table="t_user">

<!--hibernate要求有唯一的id,native值是说明表里的id是主键,并且自动增长  -->

<!-- column属性可以省略,如果省略默认和实体字段名相同 -->

<id name="uid" column="uid">

<generator class="native"></generator>

</id>

<!-- 这里的name属性必须和实体实里的字段名一样,建议复制过 -->

<property name="username" column="username"></property>

<property name="password" column="password"></property>

<property name="address"  column="address"></property>

</class>

</hibernate-mapping>

4:hibernate的核心配置文件---hibernate.cfg.xml

<?xml version="1.0" encoding="UTF-8"?>

<!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>

<!-- 1:配置数据库信息 -->

<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>

<property name="hibernate.connection.url">jdbc:mysql:///test</property>

<property name="hibernate.connection.username">root</property>

<property name="hibernate.connection.password">123</property>

<!-- 2:配置hibernate信息可选的  -->

<!--在控制台显示sql  -->

<property name="hibernate.show_sql">true</property>

<!-- 控制台显示的sql语句格式化输出-->

<property name="hibernate.format_sql">true</property>

<!-- 这句代码很关键,只有配置了它,hibernate才会自动生成表 -->

<property name="hibernate.hbm2ddl.auto">update</property>

<!-- 这句代码能够让hibernate使用mysql的特殊语句 -->

<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>

<!-- 3:把映射文件放到核心配置文件中 -->

<mapping resource="com/entity/User.hbm.xml"></mapping>

</session-factory>

</hibernate-configuration>

5:创建测试类实现表的创建---Demo1.java

public class Demo1 {

@Test

public void add() {

// 1.加载核心配置文件,它会自动去SRC下面找hibernate.cfg.xml的文件

Configuration configuration = new Configuration().configure();

// 根据核心配置文件创建SessionFactory对象,并根据映射关系,在配置数据库里把表创建

SessionFactory sessionFactory = configuration.buildSessionFactory();

// 3.通过工厂创建Session,类似于连接

Session session = sessionFactory.openSession();

// 4.开启事务

Transaction tx = session.beginTransaction();

// 5.写具体的逻辑crud操作

User user = new User();

user.setUsername("小陈");

user.setPassword("123");

user.setAddress("中国");

//调用session的方法实现添加

session.save(user);

// 6.提交事务

tx.commit();

// 7.关闭资源

session.clear();

sessionFactory.close();

}

}

但是前面的代码有问题,它是不完整的,第二步的SessionFactory如果多次创建就会多次去创建表,这样就会特别浪费资源,所以,我们把它抽取出来封装成一个工具类.----HibernateUtils.java

public class HibernateUtils {

private static Configuration configuration =null;

private static SessionFactory sessionFactory=null;

static {

// 1.加载核心配置文件,它会自动去SRC下面找hibernate.cfg.xml的文件

configuration = new Configuration().configure();

// 根据核心配置文件内容创建SessionFactory对象,并根据映射关系在配置数据库里把表创建

sessionFactory = configuration.buildSessionFactory();

}

public static SessionFactory getSessionFactory(){

return sessionFactory;

}

}

那个我们的测试类就改写为:---Demo2.java

public class Demo2 {

@Test

public void add() {

//省略前两步,直接通过工具类得到SessionFactory对象;

SessionFactory sessionFactory=HibernateUtils.getSessionFactory();

// 3.通过工厂创建Session,类似于连接

Session session = sessionFactory.openSession();

// 4.开启事务

Transaction tx = session.beginTransaction();

// 5.写具体的逻辑crud操作

User user = new User();

user.setUsername("小洪");

user.setPassword("123");

user.setAddress("中国");

//调用session的方法实现添加

session.save(user);

// 6.提交事务

tx.commit();

// 7.关闭资源

session.clear();

sessionFactory.close();

}

}

同时后面几步也是不完整的,比如第三步的session下还有save,updata,delete,根据id查询的get方法

第四步的Transaction下面有commit和rollback方法;

实体类的编写规范:

1:实体类里面的属性私有

2:私有属性使用公开的set和get方法进行操作

3:要求实体类有属性作为唯一值 (一般使用id值)

4:实体类属性建议不使用基本数据类型,使用基本数据类型对应的包装类

比如如果使用基本数据数据类型去表示某一学生考0分和没有考就没办法表示

使用包装类我们就可以用0去表示0分,null去表示没有考

实体类的主键生成策略:

一共有两种:native 和uuid

上面用的native,如果改成uuid,那么实体类中的唯一值要改成字符串

private String uuid;

映射配置文件里的唯一id的生成策略要改成

<generator class="uuid"></generator>

实现类的操作,根据id查询:

// 5.写具体的逻辑crud操作

//第一个参数:实体类的class

//第二个参数:id值

User user=session.get(User.class, 1);

System.out.println(user);

实现类的操作,修改:

User user=session.get(User.class, 1);

user.setUsername("小小陈");

session.update(user);

实现类的操作,删除:

User user=session.get(User.class,2);

session.delete(user);

还有一种方式可以实现上面的四步:但是不推荐,因为结果有可能不是想要的,例如下面,它修改后其它项就是空

这种方式叫托管态,如果没有id值,那么它就是瞬时态,瞬时态一般只用于添加操作,其它三种操作尽量不要用;

删除,修改,查询,我们用持久态,里面有id,跟session有关联

User user=new User();

user.setUid(1);

user.setUsername("小洪");

session.update(user);

实现类的三种状态:

瞬时态:对象里面没有id,跟session没有关联(一般用于添加数据)

托管态:对象里面有id,跟session没有关联(如果是主键自动增长,这id通常没有意义)

持久态:有id,跟session有关联(数据库里查出来的数据)

Session下有一个常用的方法savaOrUpdate(),它会根据三种不同的状态去决定是保存还是修改

如果是瞬时态,那么它就会保存,如果是托管态或者持久态,它就会修改;

Hibernate的一级缓存:

1:它是默认打开的

2:它的范围,是session的范围,从session创建到session关闭

3:它存储的数据必须是持久数据(就是从数据库里查出来的数据)

当我们第一次根据id查询了数据后,它就保存到缓存中了,第二次查,就会直接到内存中去查了

Hibernate的二级缓存:

二级缓存现在不用了redis技术替代它了,它要手动开启,它的范围是SessionFactory

Hibernate查询数据的执行过程:

它首先会去缓存中查找,如果没有找到,它就会去数据库中找,并把找到的数据存入一级缓存中以及快照(副本)中

Hibernate修改数据的执行过程:

它会首先去修改实体对象里的值,以前一级缓存里的值,然后去比较快照里的值,如果相同,就不修改,如果不同就去数据库里修改值,这样极大的提高效率

事务隔离级别:

1:Read uncomitted isolation

2:Read committed isolation

4:Repeatable read isolation

8:Serializble isolation

Hibernate环境搭建最终模板

由于可能会有很多人同时访问你的程序,那么这时就要让session同线程一起绑定,保证session的唯一性,如何绑定:

1:在核心配置文件里加入绑定语句:

<property name="hibernate.connection.isolation">4</property>

2:工具类里加上返回session有方法:

public static Session getSession(){

return session;

}

3:实现类里加上try catch finnaly 并且不再关闭资源,因为session绑定线程后,关闭session后,纯种也后跟着关闭,这样就会出错;

那么四个模板的最终样式如下:

核心配置文件----hibernate.cfg.xml

<?xml version="1.0" encoding="UTF-8"?>

<!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>

<!-- 1:配置数据库信息 -->

<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>

<property name="hibernate.connection.url">jdbc:mysql:///test</property>

<property name="hibernate.connection.username">root</property>

<property name="hibernate.connection.password">123</property>

<!-- 2:配置hibernate信息可选的  -->

<!--在控制台显示sql  -->

<property name="hibernate.show_sql">true</property>

<!-- 控制台显示的sql语句格式化输出-->

<property name="hibernate.format_sql">true</property>

<!-- 这句代码很关键,只有配置了它,hibernate才会自动生成表 -->

<property name="hibernate.hbm2ddl.auto">update</property>

<!-- 这句代码能够让hibernate使用mysql的特殊语句 -->

<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>

<!-- session绑定线程 -->

<property name="hibernate.connection.isolation">4</property>

<!-- 3:把映射文件放到核心配置文件中 -->

<mapping resource="com/entity/User.hbm.xml"></mapping>

</session-factory>

</hibernate-configuration>

工具类----HibernateUtils.java

import org.hibernate.Session;

import org.hibernate.SessionFactory;

import org.hibernate.cfg.Configuration;

public class HibernateUtils {

private static Configuration configuration =null;

private static SessionFactory sessionFactory=null;

private static Session session=null;

static {

// 1.加载核心配置文件,它会自动去SRC下面找hibernate.cfg.xml的文件

configuration = new Configuration().configure();

// 根据核心配置文件内容创建SessionFactory对象,并根据映射关系,在配置数据库里把表创建

sessionFactory = configuration.buildSessionFactory();

//根据sessionFactory得到session

session=sessionFactory.openSession();

}

public static Session getSession(){

return session;

}

public static SessionFactory getSessionFactory(){

return sessionFactory;

}

}

实现类模板----Demo.java

public class Demo1 {

@Test

public void add() {

Session session=null;

Transaction tx=null;

try {

session = HibernateUtils.getSession();

// 4.开启事务

tx = session.beginTransaction();

// 5.写具体的逻辑crud操作

User user = new User();

user.setUsername("小陈");

user.setPassword("123");

user.setAddress("中国");

// 调用session的方法实现添加

session.save(user);

// 6.提交事务

tx.commit();

} catch (Exception e) {

e.printStackTrace();

tx.rollback();

}

}

}

映射类模板-----User.hbm.xml

<?xml version="1.0" encoding="UTF-8"?>

<!-- 导入约束 -->

<!DOCTYPE hibernate-mapping PUBLIC

"-//Hibernate/Hibernate Mapping DTD 3.0//EN"

"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">

<hibernate-mapping>

<!--表名对应 ,name属性要求是实体对象的全路径,table属性要求是对应的表名 -->

<class name="com.entity.User" table="t_user">

<!--hibernate要求有唯一的id,native值是说明表里的id是主键,并且自动增长  -->

<!-- column属性可以省略,如果省略默认和实体字段名相同 -->

<id name="uuid" column="uuid">

<generator class="uuid"></generator>

</id>

<!-- 这里的name属性必须和实体实里的字段名一样,建议复制过 -->

<property name="username" column="username"></property>

<property name="password" column="password"></property>

<property name="address"  column="address"></property>

</class>

</hibernate-mapping>

实现类里的查询操作有三个对象对应三种不同的方式可以实现分别如下:

Query:

Query query=session.createQuery("from User");

List<User> list=query.list();

for (User user : list) {

System.out.println(user);

}

Criteria

Criteria criteria=session.createCriteria(User.class);

List<User> list = criteria.list();

for (User user : list) {

System.out.println(user);

}

SQLQuery:

这个比较特殊,它返回的是数组,所以要先将数组转成对象

SQLQuery sqlQuery=session.createSQLQuery("select * from t_user");

sqlQuery.addEntity(User.class);

List<User> list=sqlQuery.list();

for (User user : list) {

System.out.println(user);

}

2017-01-27-hibernate环境搭建的更多相关文章

  1. Hibernate之Hibernate环境搭建

    Hibernate之Hibernate环境搭建 一.Hibernate环境搭建的步骤 1.添加Hibernate && SQLServer 的Jar antlr-2.7.7.jar d ...

  2. Hibernate学习之——Hibernate环境搭建

    之前在写关于安卓闹钟的教程,写了一半就没后一半了,其实自己也没做好,在校外实习,校内毕业实习又有任务,只能先放放了,等毕业实习结束之后,在继续安卓闹钟开发之旅,相信这个时间不会很久的.现在毕业实习用到 ...

  3. Hibernate环境搭建超详细

    前言 环境搭建其实可以简单到导入相关jar包即可. 但是对于学习来说,这个环境搭建的内容还是挺多的,目的是提供一个让我们如何快速学习和掌握类库的学习环境.作为程序猿,学习和使用类库是必须掌握的技能.如 ...

  4. SSH环境搭建之Hibernate环境搭建篇

    SSH环境搭建之Hibernate环境搭建篇 搭建有两种方式: 1.使用IntelliJ IDEA或者MyEclipse的逆向工程(关系模型 -> 对象模型),我使用的是IntelliJ IDE ...

  5. 一、hibernate环境搭建

    hibernate环境搭建 下载hibernate hibernate的jar 连接数据库的jar 解压hibernate,解压后目录结构 documentation :对应hibernate开发文档 ...

  6. 黑马程序员_java基础笔记(01)...java的环境搭建

    —————————— ASP.Net+Android+IOS开发..Net培训.期待与您交流!——————————  JavaSE(Java Standard Edtion java标准版)技术概况 ...

  7. Hibernate环境搭建+struts整合

    说明:本文档,是和struts2+hibernate的整合示例. lib下还有struts2的jar包,本示例没有显示.struts2的搭建参考struts2的环境搭建 一下载hibernate的ja ...

  8. Hibernate环境搭建

    Hibernate的环境搭建,主要步骤分为一下四步: 首先创建一个工程,在工程里创建一个实体类User,在这个实体类中必须包含无参的构造器,和这个类对属性的存取方法(getter and setter ...

  9. springmvc+spring-data-jpa+hibernate环境搭建与配置

    1.JPA诞生的缘由是为了整合第三方ORM框架,建立一种标准的方式,百度百科说是JDK为了实现ORM的天下归一,目前也是在按照这个方向发展,但是还没能完全实现.在ORM框架中,Hibernate是一支 ...

  10. [01] cocos2d-x开发环境搭建

    cocos2d-x 是跨平台的游戏开发引擎,支持的平台有 ios , android , windows phone , web , tizen,windows等. 先来搭建开发环境,一般我们开发游戏 ...

随机推荐

  1. JAVA调用c/c++代码

    JNI是Java Native Interface的缩写,中文为JAVA本地调用.使用JNI可以很方便的用我们的Java程序调用C/C++程序.很多时候,某些功能用Java无法实现,比如说涉及到底层驱 ...

  2. Docker - 容器编排工具 compose 之安装

    准备 首先,在使用和安装 docker compose之前,我们应该确保我们已经安装了 docker engine. 安装 官网上面有好多种安装方式,由于我们现在是在使用Docker, 个人感觉应该以 ...

  3. java中有几种类型的流?JDK为每种类型的流提供了一些抽象类以供继承,请说出他们分别是哪些类?

    java中有几种类型的流?JDK为每种类型的流提供了一些抽象类以供继承,请说出他们分别是哪些类? Java中的流分为两种,一种是字节流,另一种是字符流,分别由四个抽象类来表示(每种流包括输入和输出两种 ...

  4. 蘑菇街teamtalk简介

    这几天在看蘑菇街实时通讯程序teamtalk的安卓端代码.现在对程序的大概情况进行简单的介绍. 蘑菇街的teamtalk开源项目包含了服务器端,Android客户端和iPhone客户端的程序.想要进行 ...

  5. iOS推送跳转AppDelegate跳转VC

    在开发项目中,会有这样变态的需求: 推送:根据服务端推送过来的数据规则,跳转到对应的控制器 feeds列表:不同类似的cell,可能跳转不同的控制器(嘘!产品经理是这样要求:我也不确定会跳转哪个界面哦 ...

  6. CI框架学习——检查用户名与密码是否合法(二)

    检查用户名与密码是否合法 步骤一.编写用户登录的窗体见下面内容 步骤二.编写数据库校验方法 $username = $_POST["username"];            # ...

  7. JSON-lib框架,转换JSON、XML不再困难

    Json-lib可以将Java对象转成json格式的字符串,也可以将Java对象转换成xml格式的文档,同样可以将json字符串转换成Java对象或是将xml字符串转换成Java对象. 一. 准备工作 ...

  8. js去除字符串空格

    str.replace(/\s+/g,""); str.replace(/\s|\xA0/g,""); empName=empName.replace(/^\s ...

  9. 火狐上的一个post提交工具(主要用于测试接口时候)

    添加的过程 安装完后,就可以在下图上,看到一个poster 点击poster就可以看到下图 图中红线圈好的,是必须要填写的 Url是访问路径 Name是参数名称 Value是参数值 需要注意一点的是: ...

  10. SD卡兼容性问题(转)

    看到一篇关于硬件抗干扰的应用实例,很有参考值.所以,转过来方便查找. 源文:SD卡兼容性问题 最近碰到了一个SD卡兼容性的问题.主芯片SD卡组的信号,经过转接板,长排线,然后再到SD卡子板之后.对多种 ...