前言
ORM框架不是一个新话题,它已经伴随我们很多年了。它提供了概念性的、易于理解的数据模型,将数据库中的表和内存中的对象建立了很好的映射关系。在Java中常用的ORM框架主要有两个:Hibernate和iBatis。本篇文章主要介绍Hibernate的使用方法,后续会出介绍iBatis的文章。
传统的MVC开发模式
❝❞
M:Model
包括pojo、service、dao
。
V:View
包括jsp、html、模块引擎
。
C:Controll
包括我们动态网络资源的技术:Servlet
。
SSH框架在开发中的作用
❝❞
S:Struts/SpringMVC:
实际上解决的是我们的控制器的问题(简单的可以认为是Servlet的封装)。
Spring:
整合其余的第三方框架,就是为Srvice
层提供事务。
Hibernate:
其实就是DAO层的解决方案。
同时可以看下其余框架(SSM、SSS)的含义:
Hibernate是什么
-
Hibernate是一个非侵入式ORMapping框架
❝
非侵入式框架:
我们在使用这个框架的时候,不需要继承或者实现这个框架中的类或者接口,这种类型的框架就叫做非侵入式的框架,非侵入式的框架在使用的时候更好的和原有的框架实现了解耦❞
侵入式框架:
我们在使用这个框架的时候,需要继承或者实现这个框架中的某些类或者接口,这种框架叫做侵入式框架
-
ORMapping解析
❝
O:
Object
R:
Relation
M:
Mapping 映射❞
Hibernate能够将Java对象通过映射的关系映射到数据库
Hibernate能够将数据库的数据通过映射关系映射到Java对象
Hibernate就是能够通过操作Java对象来达到操作数据库的一门技术。
Hibernate能干什么
简单的说:实现数据库的所有操作(CRUD),是原有DAO层的一个解决方案,也是一个替代品。
Hibernate的简单使用
「简单使用:」
-
导包,将下载下来的required+jpa相关的包放到一个文件里面
-
在src下面创建hibernate.cfg.xml配置文件
-
<?xml version=
'1.0' encoding=
'utf-8'?>
-
<!DOCTYPE hibernate-configuration PUBLIC
-
"-//Hibernate/Hibernate Configuration DTD//EN"
-
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
-
-
<hibernate-configuration>
-
<session-factory>
-
<!--驱动程序-->
-
<property name=
"hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
-
<!--访问的URL-->
-
<property name=
"hibernate.connection.url">jdbc:mysql:
///qianyu</property>
-
<!--用户名-->
-
<property name=
"hibernate.connection.username">root</property>
-
<!--密码-->
-
<property name=
"hibernate.connection.password">root</property>
-
<!--方言 表示的是告诉Hibernate框架当前 你要生成那个数据库下的SQL语句-->
-
<property name=
"hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</property>
-
<!--是否自动创建表 create:表示的是每一次 都从新创建 update:表示的是 如果有就不创建 没有就创建-->
-
<property name=
"hibernate.hbm2ddl.auto">update</property>
-
-
-
<!--配置映射文件-->
-
<mapping resource=
"com/qy/helloworld/User.hbm.xml"/>
-
-
</session-factory>
-
-
</hibernate-configuration>
-
-
创建Java的类的对象
-
public class User implements Serializable{
-
-
private static final long serialVersionUID =
-6949433888868762441L;
-
-
private
int uId;
-
-
private String userName;
-
-
private String userPwd;
-
-
public User(
int uId, String userName, String userPwd) {
-
super();
-
this.uId = uId;
-
this.userName = userName;
-
this.userPwd = userPwd;
-
}
-
-
public User() {
-
super();
-
}
-
-
public
int getuId() {
-
return uId;
-
}
-
-
public void setuId(
int uId) {
-
this.uId = uId;
-
}
-
-
public String getUserName() {
-
return userName;
-
}
-
-
public void setUserName(String userName) {
-
this.userName = userName;
-
}
-
-
public String getUserPwd() {
-
return userPwd;
-
}
-
-
public void setUserPwd(String userPwd) {
-
this.userPwd = userPwd;
-
}
-
-
@Override
-
public String toString() {
-
return
"User [uId=" + uId +
", userName=" + userName +
", userPwd=" + userPwd +
"]";
-
}
-
-
}
-
编写测试类
-
@Test
-
public void testHelloWord() throws Exception {
-
//引入配置文件
-
Configuration cfg=
new Configuration().configure(
"hibernate.cfg.xml");
-
//创建SessionFactory对象
-
SessionFactory sf=cfg.buildSessionFactory();
-
//创建会话
-
Session session=sf.openSession();
-
//开启事务
-
session.beginTransaction();
-
//操作对象
-
-
User user=
new User(
1,
"小羽",
"110");
-
-
//开始操作
-
session.save(user);
-
-
//进行事务的提交
-
-
session.getTransaction().commit();
-
-
session.
close();
-
-
}
-
Hibernate中的hibernate.cfg.xml配置文件的详解
-
<?xml version=
'1.0' encoding=
'utf-8'?>
-
<!DOCTYPE hibernate-configuration PUBLIC
-
"-//Hibernate/Hibernate Configuration DTD//EN"
-
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
-
-
<hibernate-configuration>
-
<!--配置我们数据库的连接信息的-->
-
<session-factory>
-
<!--驱动程序-->
-
<property name=
"connection.driver_class">com.mysql.jdbc.Driver</property>
-
<!--访问的URL-->
-
<property name=
"connection.url">jdbc:mysql:
///qianyu</property>
-
<!--用户名-->
-
<property name=
"connection.username">root</property>
-
<!--密码-->
-
<property name=
"connection.password">root</property>
-
-
-
<!--方言 表示的是告诉Hibernate框架当前 你要生成那个数据库下的SQL语句-->
-
<property name=
"dialect">org.hibernate.dialect.MySQL5Dialect</property>
-
<!--是否自动创建表 create:表示的是每一次 都从新创建 update:表示的是 如果有就不创建 没有就创建-->
-
<!--create经常用在测试的环境中-->
-
<property name=
"hbm2ddl.auto">update</property>
-
<!--执行的时候将SQL语句展示出来-->
-
<property name=
"show_sql">
true</property>
-
<!--格式化这个SQL语句-->
-
<property name=
"format_sql">
true</property>
-
-
<!--配置映射文件 配置的是映射文件的-->
-
<mapping resource=
"com/qy/helloworld/User.hbm.xml"/>
-
-
<!--使用注解的时候使用的是这一个-->
-
<!-- <mapping
package=
"com.qy.helloworld"/> -->
-
-
</session-factory>
-
-
</hibernate-configuration>
-
-
Hibernate的xxx.hbm.xml配置文件的详解
-
<?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">
-
-
<!--
package:一般情况下要进行配置 可以不配置 但是 下面你就要写全路径 auto-
import=
"true":如果不配置的话那么在进行查询的时候必须写类的全路径-->
-
<!--
default-lazy:配置整个实体是否支持懒加载 默认就支持懒加载-->
-
<hibernate-mapping
package=
"com.qy.helloworld"
default-lazy=
"true" auto-
import=
"true">
-
-
<!--下面配置的是映射关系 将JAVA对象 直接映射到数据库的表里面去
-
name:表示的是类的名字
-
table:表示的是当前的这个JAVA类 对应的数据库中的表的名字做是什么 这个名字是可以随便写的 但是一般要见名之意
-
lazy:当前这个类在进行查询操作的时候 要进行懒加载
-
-->
-
<class name=
"User" table=
"t_user" lazy=
"true">
-
-
<!--
-
id:表示的是主键的映射
-
name:类中主键的名字
-
column:主键对应的表的字段
-
length:确定当前字段的最大长度
-
type:类型(写的是JAVA中数据类型的全路径)
-
-
注意:类型可以省略:省略之后的类型就和实体中的类型保持一致
-
length:可以省略 默认就是
int的最大范围
-
column:这个也可以省略省略之后 默认和类中保持一致
-
-
-->
-
<id name=
"uId">
-
<!--主键自增长
-
-
上面的重点记住
-
identity:自增长这个表示的意思是:会根据底层的数据库选择自增长的策略
-
assigned:自己设置这个id的值
-
foreign:这个表示的是要将别人的主键来作为自己的主键
-
uuid:通过uuid来生成id主键
-
-
下面的了解
-
increment:递增(这个跟数据库是有关系的)
-
native:是递增(跟底层的数据库的方言有关)
-
sequence:这个表示的是通过表的序列来完成下一个id的生成(Oracle数据库)
-
-
-->
-
<generator class=
"identity"/>
-
</id>
-
-
<!--下面映射的是普通的属性
-
length:字符串的长度
-
not-null:当前字段不能为空
-
type:类型
-
-->
-
<property name=
"userName" column=
"userName" length=
"20" not-null=
"true"/>
-
<property name=
"userPwd" length=
"20" not-null=
"true"
type=
"java.lang.String"/>
-
</class>
-
-
</hibernate-mapping>
-
-
Hibernate中的CRUD的实现
-
添加数据
-
session.save(user);
-
session.persist(user);
-
-
修改数据
-
session.beginTransaction();
-
//查询数据(积极的加载)
-
User user=session.get(User.class,
1);
-
//下面支持的是懒加载
-
user.setUserName(
"xxxxx");
-
user.setUserPwd(
"yyyyy");
-
session.getTransaction().commit();
-
-
数据查询
-
//查询数据(积极的加载)
-
User user=session.get(User.class,
1);
-
//下面支持的是懒加载
-
User user2=session.load(User.class,
1);
-
-
删除数据
-
-
//查询数据(积极的加载)
-
User user=session.get(User.class,
1);
-
session.
delete(user);
-
Hibernate中的帮助类的编写
-
public class HibernateUtils {
-
private static Configuration cfg=null;
-
private static SessionFactory sf=null;
-
private static ThreadLocal<Session> threadLocal=null;
-
static{
-
//初始化线程的局部变量
-
threadLocal=
new ThreadLocal<Session>();
-
//加载配置文件
-
cfg=
new Configuration().configure(
"config/hibernate.cfg.xml");
-
//生成我们的工厂
-
sf=cfg.buildSessionFactory();
-
}
-
-
/**
-
* 获取session的玩法
-
* @Title: getSession
-
* @Description: TODO
-
* @param: @return
-
* @return: Session
-
* @throws
-
*/
-
public static Session getSession(){
-
Session session=threadLocal.get();
-
if(null==session){
-
session=sf.openSession();
-
session.beginTransaction();
-
threadLocal.set(session);
-
}
-
return session;
-
}
-
-
/**
-
* 关闭Session
-
* @Title: close
-
* @Description: TODO
-
* @param:
-
* @return: void
-
* @throws
-
*/
-
public static void
close(){
-
Session session=threadLocal.get();
-
if(null!=session){
-
session.getTransaction().commit();
-
session.
close();
-
threadLocal.remove();
-
}
-
}
-
}
注意事项
❝❞
我们hibernate.cfg.xml配置文件中这个括
hibernate.
是可以省略为什么不开启事务也能查询到数据?是因为
默认Hibernate存在只读事务
,只读事务是可以完成数据的读的操作的,如果是要完成增删改的话那么就需要读写事务,这个时候就需要开启事务
Save和Persist的区别
❝❞
Save在保存数据的时候,如果id是自增长,你给定id和不给定id都是对的。
Persist在保存数据的时候,如果id是自增长的,你给定id是会报错的。
结语
本篇关于Hibernate的介绍就先到这里结束了,后续会出更多关于Hibernate系列更多文章,谢谢大家支持!
往期推荐
Spring Data开发手册|手摸手教你简化持久层开发工作
Spring Data开发手册|Java持久化API(JPA)需要了解到什么程度呢?
尚能饭否|技术越来越新,我对老朋友jQuery还是一如既往热爱
组件必知必会|那些年我们使用过的轮子—Filter和Proxy
玩转Redis|学会这10点让你分分钟拿下Redis,满足你的一切疑问
如果你觉得浅羽的文章对你有帮助的话,请在微信搜索并关注「 浅羽的IT小屋 」微信公众号,我会在这里分享一下计算机信息知识、理论技术、工具资源、软件介绍、后端开发、面试、工作感想以及一些生活随想等一系列文章。所见所领,皆是生活。慢慢来,努力一点,你我共同成长...
点个赞,证明你还爱我
转载:https://blog.csdn.net/weixin_43719843/article/details/110103043