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. 创建git密钥的时候提示 too many arguments

    这个时候只要这样做就ok了, 给邮箱包两层引号,如下: " 'zhangsanfeng@qq.com' " 妥妥的!

  2. 轻量级别的Cache和反向代理软件---Varnish

    1.Varnish描述 1.1 Varnish的结构与特点 Varnish是一个轻量级别的Cache和反向代理软件,先进的设计理念和成熟的设计框架是Varnish的主要特点: 基于内存进行缓存,重启后 ...

  3. VS2012配置Cocos2d-x的问题

    cocos2d-x老是配置不成功,解决方案参考:http://blog.csdn.net/yangjingui/article/details/9408007 完整配置流程: 1 下载,最好通过SVN ...

  4. oc js 交互

    http://blog.csdn.net/lwjok2007/article/details/47058101     iOS调JS http://blog.csdn.net/lwjok2007/ar ...

  5. linux 文件类型识别

    使用 ls -aldrwxr-xr-x. 4 root root 100 Apr 26 15:05 cpulrwxrwxrwx. 1 root root 13 Apr 26 15:05 fd -> ...

  6. MySQL show master / slave status 命令参数

    一.show master status 二.show slave status Slave_IO_State SHOW PROCESSLIST输出的State字段的拷贝.SHOW PROCESSLI ...

  7. (中等) HDU 3265 Posters , 扫描线。

    Problem Description Ted has a new house with a huge window. In this big summer, Ted decides to decor ...

  8. iOS调用相机,相册,上传头像

    一.新建工程 二.拖控件,创建映射 三.在.h中加入delegate @interface ViewController : UIViewController 复制代码 四.实现按钮事件 -(IBAc ...

  9. leetcode--012 single number I

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAA0MAAADGCAIAAACfN8xOAAAZ6UlEQVR4nO3dsZKcurbG8fNOnd1nIv

  10. 【noip】华容道

    描述 小 B 最近迷上了华容道,可是他总是要花很长的时间才能完成一次.于是,他想到用编程来完成华容道:给定一种局面,华容道是否根本就无法完成,如果能完成,最少需要多少时间. 小 B 玩的华容道与经典的 ...