Hibernate的入门使用
数据在各个层次之间流转,在流转过程中会发生数据类型转换等一系列的交互问题。java与html的交互解决方案是struts2提供的OGNL(对象导航图语言),而java与数据库之间的技术解决方案是ORM(对象关系映射)。
什么是ORM
对象关系映射:Object relation mapping
1.对象:指的是java对象,是实体bean
2.关系:关系只是数据库,sqlserver,mysql,oracle属于关系型数据库,操作关系型数据库用的是sql语言,但是sql有着明显的缺点,一次只能执行一条语句,没有什么基本的逻辑判断
3.映射:java中对象的属性与数据库中的表字段之间一一对应(包含一对一,一对多,多对一,多对多)。
ORM需要满足的条件
有类属性和·表字段一一映射的关系
将关系模型(数据库)的操作转化成对对象模型(pojo)的操作
hibernate的优缺点
好处:不要程序自己编写sql,简化了开发,提高了开发速度,hibernate入门门槛低,上手快。
缺点:由hibernate自动生成的sql是标准的sql,优化难度大,失去了灵活性,对程序员要求较高,要懂一定的O/R映射。
快速入手hibernate案列(maven)
在pom.xml中导入相关的jar’包
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>3.6.5.Final</version>
</dependency>
1
2
3
4
5
6
如果不能正常创建则需要导入其他包
1
<--hibenate核心包-->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>3.6.8.Final</version>
</dependency>
<--单元测试包(可不导入)-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.7</version>
<scope>test</scope>
</dependency>
<-- Javassit其实就是一个二方包,提供了运行时操作Java字节码的方法-->
<dependency>
<groupId>org.javassist</groupId>
<artifactId>javassist</artifactId>
<version>3.13.0-GA</version>
</dependency>
<-- 并发访问处理端口的工具包。-->
<dependency>
<groupId>backport-util-concurrent</groupId>
<artifactId>backport-util-concurrent</artifactId>
<version>2.2</version>
</dependency>
<-- 日志文件包-->
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.1.1</version>
</dependency>
<--纯Java的进程内缓存框架-->
<dependency>
<groupId>net.sf.ehcache</groupId>
<artifactId>ehcache</artifactId>
<version>1.2.3</version>
</dependency>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
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>
<!--Database connection settings -->
<property name="connection.driver_class">oracle.jdbc.driver.OracleDriver</property>
<property name="connection.url">jdbc:oracle:thin:@localhost:1521:orcl</property>
<property name="connection.username">scott</property>
<property name="connection.password">tiger</property>
<property name="javax.persistence.validation.mode">none</property>
<!-- sql dialect方言 -->
<property name="dialect">org.hibernate.dialect.Oracle10gDialect</property>
<!--如果不存在该表,hibernate将自动生成该表 -->
<property name="current_session_context_class">thread</property>
<!--打印sql语句 -->
<property name="show_sql">true</property>
<mapping resource="com/it/bean/Student.hbm.xml"/>
</session-factory>
</hibernate-configuration>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
3.*.xml映射文件
先写一个实体bean
package com.it.bean;
public class Student {
private String stu_id;
private String stu_name;
private String stu_sex;
private String stu_birth;
private String stu_addr;
public String getStu_id() {
return stu_id;
}
public void setStu_id(String stu_id) {
this.stu_id = stu_id;
}
public String getStu_name() {
return stu_name;
}
public void setStu_name(String stu_name) {
this.stu_name = stu_name;
}
public String getStu_sex() {
return stu_sex;
}
public void setStu_sex(String stu_sex) {
this.stu_sex = stu_sex;
}
public String getStu_birth() {
return stu_birth;
}
public void setStu_birth(String stu_birth) {
this.stu_birth = stu_birth;
}
public String getStu_addr() {
return stu_addr;
}
public void setStu_addr(String stu_addr) {
this.stu_addr = stu_addr;
}
public Student(String stu_id, String stu_name, String stu_sex, String stu_birth, String stu_addr) {
super();
this.stu_id = stu_id;
this.stu_name = stu_name;
this.stu_sex = stu_sex;
this.stu_birth = stu_birth;
this.stu_addr = stu_addr;
}
public Student() {
super();
// TODO Auto-generated constructor stub
}
public Student(String stu_id, String stu_name) {
super();
this.stu_id = stu_id;
this.stu_name = stu_name;
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
与之对应的映射文件
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.it.bean">
<class name="Student" table="stuinfo">
<id name="stu_id" column="stu_id">
<!-- 主键生成策略 -->
<generator class="assigned"></generator>
</id>
<property name="stu_name" column="stu_name"></property>
<property name="stu_sex" column="stu_sex"></property>
<property name="stu_birth" column="stu_birth"></property>
<property name="stu_addr" column="stu_addr"></property>
</class>
</hibernate-mapping>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
dao层的书写
BaseDao
package com.it.dao;
import java.util.List;
import org.hibernate.Query;
import org.hibernate.Session;
public class BaseDao<E>{
private Session session;
public BaseDao(Session session){
this.session=session;
}
public void add(E e){
session.save(e);
}
public void delete(E e){
session.delete(e);
}
public void update(E e){
session.update(e);
}
public List<E> finbBySplit(int currentPage,int currentSize,String hql,String...params){
Query query=session.createQuery(hql);
//给问号占位符赋值
for (int i = 0; i < params.length; i++) {
query.setString(i, params[i]);
}
//分页参数
int first=(currentPage-1)*currentSize;
query.setFirstResult(first);
query.setMaxResults(currentSize);
//查询
return query.list();
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
StudentDao层的书写
package com.it.dao;
import java.util.List;
import org.hibernate.Session;
import com.it.bean.Student;
public class StudentDao extends BaseDao<Student>{
public StudentDao(Session session) {
super(session);
// TODO Auto-generated constructor stub
}
public void add(Student stu){
super.add(stu);
}
public void delete(Student stu){
super.delete(stu);
}
public void update(Student stu){
super.update(stu);
}
public List<Student> find(int currentPage,int currentSize,Student stu){
String hql="from Student stu where stu.stu_id like ? and stu.stu_name like ? and stu.stu_sex like ? and stu.stu_birth like ? and stu.stu_addr like ? ";
String []params={"%"+stu.getStu_id()+"%","%"+stu.getStu_name()+"%","%"+stu.getStu_sex()+"%","%"+stu.getStu_birth()+"%","%"+stu.getStu_addr()+"%"};
return super.finbBySplit(currentPage, currentSize, hql, params);
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
此时便可测试了
@Test
public void add(){
SessionFactory sessionFactory=null;
Session session=null;
Transaction tx=null;
try {
//创建sessionfactory
sessionFactory=new Configuration().configure().buildSessionFactory();
//创建session回话---得到线程本身的回话
session=sessionFactory.getCurrentSession();
//开启事务
tx=session.beginTransaction();
//添加数据
Student stu=new Student("0000","沈浪","男","87","北京");
// session.save(stu);
//修改数据
// stu.setStu_name("沈万三");
// session.update(stu);
//删除数据
// session.delete(stu);
//提交事务
//按照id查询一条数据
// Student stu1=(Student)session.get(Student.class, "0000");
// System.out.println(stu1.getStu_name());
//hql的使用
//查询所有信息
/*String hql="from Student where stu_id like '%2%'";
Query query=session.createQuery(hql);
List<Student> list=query.list();
for (Student student : list) {
System.out.println(student.getStu_name());
}*/
//返回vo对象
/*String hql="select new Student(stu_id,stu_name) from Student where stu_id like '%2%'";
Query query=session.createQuery(hql);
List<Student> list=query.list();
for (Student student : list) {
System.out.println(student.getStu_name());
}*/
//返回map类型的参数
/*String hql="select new map(count(*) as ct,max(stu_id) as maxid) from Student";
Query query=session.createQuery(hql);
Map<String,Object> map=(Map<String,Object>)query.uniqueResult();
System.out.println(map.get("ct"));*/
//占位符? :
/*String hql="from Student where stu_id like ?";
Query query=session.createQuery(hql);
query.setString(0, "%2%");
List<Student> list=query.list();
for (Student student : list) {
System.out.println(student.getStu_name()+"=========");
}*/
//:占位符
/*String hql="from Student where stu_sex=:uid";
Map<String,String> params=new HashMap<String,String>();
params.put("uid","1");
Query query=session.createQuery(hql);
//为参数赋值
for(String key:params.keySet()){
System.out.println(key+"==========");
query.setString(key,params.get(key));
}
List<Student> list=query.list();
for (Student student : list) {
System.out.println(student.getStu_name()+"+++++++");
}*/
//返回number类型的参数
/*String hql="select count(*) from Student";
Query query=session.createQuery(hql);
Number ct=(Number)query.uniqueResult();
System.out.println(ct.intValue());*/
//模糊搜素
/*Student stu1=new Student("1","武");
String[] params={"%"+stu1.getStu_id()+"%","%"+stu1.getStu_name()+"%"};
String hql="from Student where stu_id like ? and stu_name like ?";
// String hql="from Student where stu_id like '%1%' and stu_name like '%武%'";
Query query=session.createQuery(hql);
//为?号赋值
for (int i = 0; i < params.length; i++) {
query.setString(i,params[i]);
System.out.println(params[i]);
}
System.out.println(hql);
System.out.println(query.list().size());*/
//hibernate分页
String hql="from Student where stu_id like '%2%'";
Query query=session.createQuery(hql);
int currentPage=1;
int pageSize=4;
int startPage=(currentPage-1)*pageSize;
query.setFirstResult(startPage); //开始显示的位置
query.setMaxResults(pageSize); //显示最大数据数
System.out.println(query.list().size());
tx.commit();
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
//事务回滚
tx.rollback();
}
}
---------------------
Hibernate的入门使用的更多相关文章
- Hibernate从入门到精通(十一)多对多双向关联映射
上次我们在中Hibernate从入门到精通(十)多对多单向关联映射讲解了一下多对多单向关联映射,这次我们讲解一下七种映射中的最后一种多对多双向关联映射. 多对多双向关联映射 按照我们之前的惯例,先看一 ...
- Hibernate从入门到精通(十)多对多单向关联映射
上一篇文章Hibernate从入门到精通(九)一对多双向关联映射中我们讲解了一下关于一对多关联映射的相关内容,这次我们继续多对多单向关联映射. 多对多单向关联映射 在讲解多对多单向关联映射之前,首先看 ...
- Hibernate从入门到精通(九)一对多双向关联映射
上次的博文Hibernate从入门到精通(八)一对多单向关联映射中,我们讲解了一下一对多单向映射的相关内容,这次我们讲解一下一对多双向映射的相关内容. 一对多双向关联映射 一对多双向关联映射,即在一的 ...
- Hibernate从入门到精通(八)一对多单向关联映射
上次的博文Hibernate从入门到精通(七)多对一单向关联映射我们主要讲解了一下多对一单向关联映射,这次我们继续讲解一下一对多单向映射. 一对多单向关联映射 在讲解一对多单向关联之前,按照我们的惯例 ...
- Hibernate从入门到精通(七)多对一单向关联映射
上次的博文Hibernate从入门到精通(六)一对一双向关联映射中我们介绍了一下一对一双向关联映射,本次博文我们讲解一下多对一关联映射 多对一单向关联映射 多对一关联映射与一对一关联映射类似,只是在多 ...
- Hibernate从入门到精通(六)一对一双向关联映射
在上次的博文Hibernate从入门到精通(五)一对一单向关联映射中我们讲解了一下一对一单向关联映射,这次我们继续讲解一下与之对应的一对一双向关联映射. 一对一双向关联 与一对一单向关联映射所不同的的 ...
- Hibernate从入门到精通(五)一对一单向关联映射
上次的博文中Hibernate从入门到精通(四)基本映射我们已经讲解了一下基本映射和相关概念,接下来我们会讲稍微复杂点的映射——关系映射. 关系映射分类 关系映射即在基本映射的基础上处理多个相关对象和 ...
- Hibernate从入门到精通(四)基本映射
映射的概念 在上次的博文Hibernate从入门到精通(三)Hibernate配置文件我们已经讲解了一下Hibernate中的两种配置文件,其中提到了两种配置文件的主要区别就是XML可以配置映射.这里 ...
- Hibernate从入门到精通(三)Hibernate配置文件
在上次的博文Hibernate从入门到精通(二)Hibernate实例演示我们已经通过一个实例的演示对Hibernate的基本使用有了一个简单的认识,这里我们在此简单回顾一下Hibernate框架的使 ...
- Hibernate从入门到精通(二)Hibernate实例演示
上篇Hibernate从入门到精通(一)JDBC简介,我们主要对JDBC进行了简单介绍和使用说明,这次我们做一个Hibernate简单实例,通过这个实例对比Hibernate和JDBC,了解Hiber ...
随机推荐
- ASP.NET Web Pages (Razor) API Quick Reference
ASP.NET Web Pages (Razor) API Quick Reference By Tom FitzMacken|February 10, 2014 Print This page co ...
- WCF Rest post请求
只有遇到问题才能解决问题,这个问题之前也遇到过因为没有及时总结所以这个问题又重新出现困扰了我8个小时. ajax 请示WCF Rest 是一个比较成熟的技术.所以 涉及到了几个技术点 1 jquery ...
- [USACO 2017DEC] Haybale Feast
[题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=5142 [算法] 首先用RMQ预处理S数组的最大值 然后我们枚举右端点 , 通过二分求 ...
- 关于Lucene全文检索相关技术
Lucene技术专门解决海量数据下的模糊搜索问题. Lucene主要完成的是数据预处理.建立倒排索引,及搜索.排名.高亮显示等功能 全文检索相关词语概要: 单词和文档矩阵: 文档(Document): ...
- Jmeter测试接口
文主要针对http接口进行测试,使用Jmeter工具实现. Jmter工具设计之初是用于做性能测试的,它在实现对各种接口的调用方面已经做的比较成熟,因此,本次直接使用Jmeter工具来完成对Http接 ...
- 安装phpwind报错
在安装phpwind时,下面的报错提示是什么原因呢? 答:数据库密码应设置为空
- asp.net 中的事务
ASP.NET开发过程中的事务处理 http://www.cnblogs.com/georgeHeaven/p/3766609.html
- PCB RabbitMQ的安装使用
随着公司加大力度信息化建设,PCB企业各种各样的系统软件越来越多,整个公司订单流状态监控变得越来越不可控,是时候需采用新的方式来收集各系统状态节点状态了,以下记录RabbitMQ安装使用: 一.Rab ...
- 组件-实体-系统 Entiy-Compoent-System ECS架构整理
继承体系的问题,为什么要用ECS 面向对象的问题 当一个新的类型需要多个老类型的不同功能的时候,不能很好的继承出来 游戏开发后期会有非常多的类,很难维护 游戏中子系统很多,它们对一个对象的关注点往往互 ...
- Ocelot(十二)- 请求聚合
Ocelot允许您指定聚合多个普通ReRoutes的Aggregate ReRoutes(聚合路由),并将其响应映射到一个对象中.一般用于当您有一个客户端向服务器发出多个请求,而这些请求可以合并成一个 ...