2017-01-27-hibernate环境搭建
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环境搭建的更多相关文章
- Hibernate之Hibernate环境搭建
Hibernate之Hibernate环境搭建 一.Hibernate环境搭建的步骤 1.添加Hibernate && SQLServer 的Jar antlr-2.7.7.jar d ...
- Hibernate学习之——Hibernate环境搭建
之前在写关于安卓闹钟的教程,写了一半就没后一半了,其实自己也没做好,在校外实习,校内毕业实习又有任务,只能先放放了,等毕业实习结束之后,在继续安卓闹钟开发之旅,相信这个时间不会很久的.现在毕业实习用到 ...
- Hibernate环境搭建超详细
前言 环境搭建其实可以简单到导入相关jar包即可. 但是对于学习来说,这个环境搭建的内容还是挺多的,目的是提供一个让我们如何快速学习和掌握类库的学习环境.作为程序猿,学习和使用类库是必须掌握的技能.如 ...
- SSH环境搭建之Hibernate环境搭建篇
SSH环境搭建之Hibernate环境搭建篇 搭建有两种方式: 1.使用IntelliJ IDEA或者MyEclipse的逆向工程(关系模型 -> 对象模型),我使用的是IntelliJ IDE ...
- 一、hibernate环境搭建
hibernate环境搭建 下载hibernate hibernate的jar 连接数据库的jar 解压hibernate,解压后目录结构 documentation :对应hibernate开发文档 ...
- 黑马程序员_java基础笔记(01)...java的环境搭建
—————————— ASP.Net+Android+IOS开发..Net培训.期待与您交流!—————————— JavaSE(Java Standard Edtion java标准版)技术概况 ...
- Hibernate环境搭建+struts整合
说明:本文档,是和struts2+hibernate的整合示例. lib下还有struts2的jar包,本示例没有显示.struts2的搭建参考struts2的环境搭建 一下载hibernate的ja ...
- Hibernate环境搭建
Hibernate的环境搭建,主要步骤分为一下四步: 首先创建一个工程,在工程里创建一个实体类User,在这个实体类中必须包含无参的构造器,和这个类对属性的存取方法(getter and setter ...
- springmvc+spring-data-jpa+hibernate环境搭建与配置
1.JPA诞生的缘由是为了整合第三方ORM框架,建立一种标准的方式,百度百科说是JDK为了实现ORM的天下归一,目前也是在按照这个方向发展,但是还没能完全实现.在ORM框架中,Hibernate是一支 ...
- [01] cocos2d-x开发环境搭建
cocos2d-x 是跨平台的游戏开发引擎,支持的平台有 ios , android , windows phone , web , tizen,windows等. 先来搭建开发环境,一般我们开发游戏 ...
随机推荐
- 想要学习Linux技术,先好好的读一本Linux书籍吧
忘记你在使用windows时的使用习惯和使用思维.学习Linux,一定要适应Linux的命令行界面,因为命令行才是Linux的真正魅力所在,而X-window或着说桌面环境也只是运行在命令行模式下的一 ...
- head和tail命令-----得到头尾N行或者这去掉尾头N/N-1行
[algo@localhost tmp]$ cat test 1 2 3 4 5 head得到头部2行,删掉尾部2行 [algo@localhost tmp]$ head -n +2 test 1 ...
- JAVA基础--正则表达式
. any character \d A digit 0-9 \D a non-digit [^0-9] \s a whitespace character, 空白字符 \S a non-w ...
- ZOJ 3941 Kpop Music Party
先把能合并的区间都合并起来. 考虑最裸的贪心策略,从左到右一段一段的取. 但是,这样会有错,错在没有考虑每段区间选取最后一个点. 因为N只有10,所以枚举一下哪些区间最后一个点会被选择,然后按照最裸的 ...
- Spring--注入类型--setter
setter注入: package com.bjsxt.service; import com.bjsxt.dao.UserDAO; import com.bjsxt.model.User; publ ...
- LWIP_STM32_ENC28J60_NETCONN_UDP(3)
前面移植了lwip之后只是简单地做了一个dhcp的程序,但是实际工作中经常要用来通讯,那今天就来讲一讲怎么用lwip来进行UDP通讯 要使用数据通信首先第一步得知道lwip是怎么样保存数据的,在使用n ...
- iOS开发——获取本设备IP
不说废话,直接上代码. #import <ifaddrs.h> #import <arpa/inet.h> - (NSString *)getIPAddress { NSStr ...
- 百度api集合!
百度 api集市免费接口 IP地址查询 http://apistore.baidu.com/apiworks/servicedetail/114.html 频道新闻API_易源 http://apis ...
- jQuery源码学习(2):选择器初窥
选择器初窥 代码架构: jQuery选择器可以依照传入数据的类型分为五大类: 传入字符串:$("div"), $("#id"), $(".div1&q ...
- 递归添加 另一个ds 里的DataRow 时 报错:该行已经属于另一个表。
public void create_tree(DataSet ds, int parentid) { DataSet newds = new DataSet(); ...