ssh架构之hibernate(一)简单使用hibernate完成CRUD
1.Hibernate简介
Hibernate是一个开放源代码的对象关系映射(ORM)框架,它对JDBC进行了非常轻量级的对象封装,它将POJO与数据库表建立映射关系,是一个全自动的orm框架,hibernate可以自动生成SQL语句,自动执行,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。
为什么要使用Hibernate
这个需要从Hibernate的起源开始分析。 Hibernate之父Gavin发现咱们以前的开发效率太低,特别在Java这种面向对象的语言在与关系型数据库之间的数据交互太麻烦了。于是开发出了hibernate。 我对他当时的思维的理解是,我们是Java程序员,就算我不懂SQL,我认为自己也应该可以来操作数据库。
面试题:为什么要使用Hibernate?
首先简单解释一下hibernate是一个ORM的框架,底层依然使用JDBC。 然后简述一下它与JDBC之间的优缺点.
Hibernate的优缺点
优点与缺点都是相对的,那么讲一个东西的优缺点我们都需要一个参数对比,而咱们要来进行对比的咱们操作数据的原生的JDBC:
JDBC的优缺点
本质:处理Java对象和关系型数据库表之间的转换
优点:
操作数据库最底层,性能最高(需要你是有相应的经验,并且是一个数据库高手)
缺点:
1.使用复杂(重复代码太多)
2.移植数据库很麻烦,改动比较多 主键的生成方式不同(mysql使用自增,oracle使用序列) 分页的sql语句也是不同(mysql使用limit,oracle使用ROWNUM)
3.性能优化得自己处理,没有提供数据的缓存
4.面向sql语句操作,不是面向对象的
hibernate的优缺点
本质:处理Java对象和关系型数据库表之间的转换,只是对JDBC再次做了一层封装
优点:
1.程序员操作很简单,代码简单 session.save(user);
2.直接面向对象操作
3.提供世界级数据缓存(现在几乎所有的ORM框架的缓存都是学的Hibernate) 一级缓存,二级缓存,查询缓存
4.数据库移植性很强,很少的修改 把各种数据库抽取了一个方言接口 不同数据库实现一个方言接口,如果换了数据库,必须修改方言实现,驱动jar文 件,连接数据库信息。
缺点:
1.不能干预sql语句的生成 session.get(User.class,id); 默认查询t_user表的所有字段 自动生成select user0_.id,user0_.name,user0_.age from t_user user0_ where user0_.id=?
2.一个项目中,如果对sql语句的优化要求比较高,不适合用hibernate(不过可以使用 Hibernate对原生sql的支持来解决)
3.如果一张表中有上亿级别的数据量,也不适合用hibernate,其实也不适合用jdbc(可 以使用数据库读写分离,分库分表方案解决)
面试题:查询1千万条数据,怎么才是最快的? 先把数据放到缓存(内存)中?
1000千万条数据 分页显示1000条
执行SQL:查出1000条显示
在查询完之后,偷偷的查询下一页的数据,放到缓存中
Hibernate的历史
Hibernate:之前EJB完成ORM是非常复杂的,Hibernate的作者是Gavin King。
PS:也许Cirrus Technologies的老板做梦也想不到两年以后,这个小伙子开发出的那个产品会成为全世界最流行的O/R Mapping工具,而那个对SQL和数据库一窍不通的小伙子居然会成为全世界J2EE数据库解决方案的领导者。
01年末:hibernate的第一个版本
03 年6月,HIbernate2获得Jolt 2004 大奖,9被JBoss收纳为子项目
PS:2003年9月,Gavin King在他网站上向全世界发起挑战:谁要是能对一段代码用JDBC开发做到效率比hibernate高好多,就给他100美金
05 年3月,Hibernate3正式发布
10 年4月,3.5发布,支持JPA
2.hibernate入门
简单使用hibernate做CRUD
步骤
0.拷贝jar包
1.建立model
2.建立映射文件
3.建立hibernate核心配置文件
4.编辑dao实现类
5.测试
0.拷贝jar包
1.建立model---LoginUser
package com.hibernate.day01.model; /**
* Created by asus on 2017/6/1.
*/ public class LoginUser {
private Integer id;
private String password;
private String userName;
private Integer age;
private Integer salary;
private String createTime; public Integer getSalary() {
return salary;
} public void setSalary(Integer salary) {
this.salary = salary;
} public String getCreateTime() {
return createTime;
} public void setCreateTime(String createTime) {
this.createTime = createTime;
} public Integer getAge() {
return age;
} public void setAge(Integer age) {
this.age = age;
} public Integer getId() {
return id;
} public void setId(Integer id) {
this.id = id;
} public String getPassword() {
return password;
} public void setPassword(String password) {
this.password = password;
} public String getUserName() {
return userName;
} public void setUserName(String userName) {
this.userName = userName;
}
}
LoginUser
2.建立映射文件---loginuser.hbm.xml
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<!-- 映射文件 -->
<!-- 在映射文件出现的name属性都是指的java的类名,属性名 -->
<!-- 在映射文件出现的column属性都是指的数据库表的字段(列)名:也可以不写,使用name属性的值 -->
<!-- 在映射文件出现的type属性是:1.java的全限定类名java.lang.Long 2.也可以是hibernate的类型名称long 3.也可以不写,hibernate会通过反射技术获取java的类型 -->
<hibernate-mapping package="com.hibernate.day01.model">
<!-- class表示一个由hibernate管理的持久对象,对应数据库的一个表 -->
<!-- table数据库的表名 -->
<class name="LoginUser" table="login_user">
<!-- id元素(节点)是必须的,是代表表的主键 -->
<id name="id" column="id">
<!-- generator表示主键的生成方式,多数都是使用native -->
<!-- native自动选择数据库本地的策略: -->
<!-- mysql:AUTO_INCREMENT自增 --><!-- oracle:序列 -->
<generator class="native" />
</id>
<!-- 非主键属性 -->
<property name="userName" column="user_name" />
<property name="password" column="password"/>
<!-- <!– default="25"还必须同时配置一个属性insert="false",表示不出现在insert语句 –>
<property name="age" insert="false">
<column name="age" default="25" />
</property>
<!– update=false:一经保存就不能修改属性:身份证号码,创建时间 –>
<property name="createTime" column="create_time" update="false"/>-->
</class>
</hibernate-mapping>
loginuser.hbm.xml
3.建立hibernate核心配置文件---hibernate2.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>
<!-- Database connection settings
-->
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="connection.url">jdbc:mysql://10.3.2.25:3306/hibernate</property>
<property name="connection.username">root</property>
<property name="connection.password">admin</property>
<!-- JDBC connection pool (use the built -in) JDBC连接池(使用内置) -->
<!-- <property name="connection.pool_size">1</property>-->
<!-- SQL dialect -->
<property name="dialect">org.hibernate.dialect.MySQLDialect</property>
<!-- Enable Hibernate's automatic session context management
hibernate将session从当前线程中释放,并且关闭session
-->
<!-- <property name="current_session_context_class">thread</property>-->
<!-- Disable the second-level cache -->
<!-- <property name="cache.provider_class">org.hibernate.cache.NoCacheProvider</property>-->
<!-- Echo all executed SQL to stdout -->
<property name="show_sql">true</property>
<!-- Drop and re-create the database schema on startup-->
<property name="hbm2ddl.auto">update</property>
<mapping resource="mapper/loginuser.hbm.xml"/>
<!-- <mapping class="com.hibernate.day01.model.LoginUser" />-->
</session-factory>
</hibernate-configuration>
hibernate.cfg.xml
4.编辑dao实现类
package com.hibernate.day01.dao.impl; import com.hibernate.day01.dao.ILoginUserDao;
import com.hibernate.day01.model.LoginUser;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration; import java.util.List; /**
* Created by asus on 2017/6/1.
*/
public class LoginUserDao implements ILoginUserDao {
@Override
public void save(LoginUser loginUser) {
// 读取并且解析配置文件(包含映射文件)
Configuration configuration = new Configuration();
// 加载默认配置文件hibernate.cfg.xml
// configuration.configure();
// 加载非默认配置文件hibernate.cfg.xml
configuration.configure("hibernate2.cfg.xml");
// 生成会话工厂(真正解析配置文件)
SessionFactory sessionFactory = configuration.buildSessionFactory();
// 获取Session对象
Session session = sessionFactory.openSession();
// 开启事务
// 用法1
//Transaction transaction = session.getTransaction();
// transaction.begin();
// 用法2 hibernate默认情况下是没有开启事务的,必须手动开启事务
session.beginTransaction();
// 操作CUD
session.save(loginUser);// 持久状态
// 提交事务
session.getTransaction().commit();
// 关闭资源
session.close();// 游离状态
sessionFactory.close();
}
@Override
public void delete(Integer id) {
//创建读取文件的类
Configuration configuration=new Configuration();
//加载文件
configuration.configure("hibernate2.cfg.xml");
//获得sessionFactory对象
SessionFactory sessionFactory = configuration.buildSessionFactory();
//获得session
Session session = sessionFactory.openSession();
//开启事务
session.beginTransaction();
//执行操作
LoginUser loginUser=new LoginUser();
loginUser.setId(id);
session.delete(loginUser);//删除状态
//关闭事务
session.getTransaction().commit();
//关闭session
session.close();
//关闭sessionFactory
sessionFactory.close(); } @Override
public void update(LoginUser loginUser) {
//创建读取文件的类
Configuration configuration=new Configuration();
//加载文件
configuration.configure("hibernate2.cfg.xml");
//获得sessionFactory对象
SessionFactory sessionFactory = configuration.buildSessionFactory();
//获得session
Session session = sessionFactory.openSession();
//开启事务
session.beginTransaction();
//执行操作
session.update(loginUser);
//关闭事务
session.getTransaction().commit();
//关闭session
session.close();
//关闭sessionFactory
sessionFactory.close();
} @Override
public LoginUser getLoginUser(Integer id) {
//创建读取文件的类
Configuration configuration=new Configuration();
//加载文件
configuration.configure("hibernate2.cfg.xml");
//获得sessionFactory对象
SessionFactory sessionFactory = configuration.buildSessionFactory();
//获得session
Session session = sessionFactory.openSession();
//开启事务
// session.beginTransaction(); 查询操作不需要事务
//执行操作
LoginUser loginUser=(LoginUser) session.get(LoginUser.class,id);
//关闭事务
// session.getTransaction().commit();
//关闭session
session.close();
//关闭sessionFactory
sessionFactory.close();
return loginUser;
} @Override
public List<LoginUser> getList() {
//创建读取文件的类
Configuration configuration=new Configuration();
//加载文件
configuration.configure("hibernate2.cfg.xml");
//获得sessionFactory对象
SessionFactory sessionFactory = configuration.buildSessionFactory();
//获得session
Session session = sessionFactory.openSession();
//开启事务
// session.beginTransaction();
//执行操作
String hql="select o from com.hibernate.day01.model.LoginUser o";
Query query = session.createQuery(hql);
List<LoginUser> list = query.list();
//关闭事务
// session.getTransaction().commit();
//关闭session
session.close();
//关闭sessionFactory
sessionFactory.close();
return list;
} }
LoginUserDao
5.测试
import com.hibernate.day01.dao.impl.LoginUserDao;
import com.hibernate.day01.dao.impl.ProductDao;
import com.hibernate.day01.model.LoginUser;
import com.hibernate.day01.model.Product;
import org.junit.Test; import java.util.List; /**
* Created by asus on 2017/6/1.
*/
public class HibernateTest {
@Test
public void testSave(){
LoginUserDao loginUserDao=new LoginUserDao();
LoginUser loginUser=new LoginUser();
loginUser.setUserName("tesg");
loginUser.setPassword("47894");
loginUser.setAge(58);
loginUserDao.save(loginUser);
}
@Test
public void testDelete(){
LoginUserDao loginUserDao=new LoginUserDao();
loginUserDao.delete(9);
}
@Test
public void testUpdate(){
LoginUserDao loginUserDao=new LoginUserDao();
LoginUser loginUser=new LoginUser();
loginUser.setId(10);
loginUser.setUserName("已经改了2");
loginUserDao.update(loginUser);
}
@Test
public void testGet(){
LoginUserDao loginUserDao=new LoginUserDao();
LoginUser loginUser = loginUserDao.getLoginUser(10);
System.out.println("--------loginUser-----"+loginUser);
}
@Test
public void testList(){
LoginUserDao loginUserDao=new LoginUserDao();
List<LoginUser> list = loginUserDao.getList();
System.out.println("---------list----"+list.size());
}
}
HibernateTest
hibernate简单实现CRUD完成
ssh架构之hibernate(一)简单使用hibernate完成CRUD的更多相关文章
- 菜鸟学SSH(十五)——简单模拟Hibernate实现原理
之前写了Spring的实现原理,今天我们接着聊聊Hibernate的实现原理,这篇文章只是简单的模拟一下Hibernate的原理,主要是模拟了一下Hibernate的Session类.好了,废话不多说 ...
- Hibernate框架简单应用
Hibernate框架简单应用 Hibernate的核心组件在基于MVC设计模式的JAVA WEB应用中,Hibernate可以作为模型层/数据访问层.它通过配置文件(hibernate.proper ...
- WebLogic使用SSH架构部署遇到org.hibernate.hql.internal.ast.HqlTok
其实这个问题在以前就遇到过,当时解决了,但今天在部署一个测试轻应用的时候一直没有想起来,特此记录一下. 这个问题出现在使用WebLogic(我使用的是10.3.5版本)发布SSH架构的应用.在操作数据 ...
- 【SSH三大框架】Hibernate基础第五篇:利用Hibernate完毕简单的CRUD操作
这里利用Hibernate操作数据库完毕简单的CRUD操作. 首先,我们须要先写一个javabean: package cn.itcast.domain; import java.util.Date; ...
- 【SSH】——Hibernate实现简单的自动建表
[与ORM] Object Relational Mapping,对象关系映射,将对象和关系联系了起来.面向对象是从耦合.聚合.封装等的基础上发展起来的,而关系数据库则是从数学理论发展而来的,两套理论 ...
- ssh架构之hibernate(五)hql语句狂练
1.练习题 1.查询所有商品的名称[查询特定属性](只有一个参数的话可以使用List<String>接收数据)2.查询所有商品的名称和供应商[查询特定属性](多个参数可以使用List< ...
- ssh架构之hibernate(四)二级缓存
二级缓存使用步骤: 1.拷贝jar包 2.配置Hibernate.cfg.xml文件 a.#开启二级缓存 hibernate.cache.use_second_level_cache=true b.# ...
- 【SSH进阶之路】Struts + Spring + Hibernate 进阶开端(一)
[SSH进阶之路]Struts + Spring + Hibernate 进阶开端(一) 标签: hibernatespringstrutsssh开源框架 2014-08-29 07:56 9229人 ...
- SSH开发实践part1:Spring与Hibernate整合
1 之前把SSH看完了,现在从头开始进行项目实践.现在讲整个过程中的点滴记录下来,希望对后来者有参考. 2 SSH是一个轻量级的java开发框架,struts负责MVC开发模式中的controller ...
随机推荐
- 下雨天,适合学「Spring Boot」
北方的闷热,让不少小伙伴盼着下雨,前几天北京下了场大雨,杭州也紧跟这下了场雨,就在昨天原本还很闷热的天,突然就飘泼大雨了.今天也断断续续的下着小雨,一觉醒来已经是10点了.有句话说:懒惰是人的天性 ...
- 阅读别人的程序(Java篇)
1.递归求数组最大值 2.转账(事务) 1.递归应用 public class DiGuiDemo3 { public static void main(String[] args) { int[] ...
- 1.cs与bs结构
####CS 与 BS 结构 C/S 结构软件:客户端(Client)服务器(Server)软件,客户端需要单独下载安装之后,才能正常操作的软件 B/S 结构软件:浏览器(Browser)服务器(Se ...
- C# 反射常见用法
定义: 反射是.NET中的重要机制,通过反射,可以在运行时获得程序或程序集中每一个类型(包括类.结构.委托.接口和枚举等)的成员和成员的信息.有了反射,即可对每一个类型了如指掌.另外我还可以直接创建对 ...
- RDD中的cache() persist() checkpoint()
cache只有一个默认的缓存级别MEMORY_ONLY ,而persist可以根据StorageLevel设置其它的缓存级别. cache以及persist都不是action. 被重复使用的(但是)不 ...
- Python基础3 函数、递归、内置函数
本节内容 1. 函数基本语法及特性 2. 参数与局部变量 3. 返回值 嵌套函数 4.递归 5.匿名函数 6.函数式编程介绍 7.高阶函数 8.内置函数 温故知新 1. 集合 主要作用: 去重 关系测 ...
- leetcode1013
class Solution(object): def canThreePartsEqualSum(self, A: 'List[int]') -> bool: n = len(A) sums ...
- SecureCRT显示乱码的解决办法
下面来看看SecureCRT的显示出现乱码这种情况.比如: 现在我们重新设置一下 设置下图中的配置 1.选择字符编码为UTF-8. 2.设置字符集为GB2312后保存好后确认退出. 3.再次测试一下.
- 机器学习-文本数据-文本的相关性矩阵 1.cosing_similarity(用于计算两两特征之间的相关性)
函数说明: 1. cosing_similarity(array) 输入的样本为array格式,为经过词袋模型编码以后的向量化特征,用于计算两两样本之间的相关性 当我们使用词频或者TFidf构造出 ...
- Excel和Word 简易工具类,JEasyPoi 2.1.7 版本发布
JEasyPOI 简介 EasyPOI 功能如同名字easy,追求的就是简易,让一个没接触过poi的人员,可以傻瓜化的快速实现Excel导入导出.Word模板导出,可以仅仅5行代码就可以完成Excel ...