前言
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是什么
1.Hibernate是一个非侵入式ORMapping框架
- 非侵入式框架:我们在使用这个框架的时候,不需要继承或者实现这个框架中的类或者接口,这种类型的框架就叫做非侵入式的框架,非侵入式的框架在使用的时候更好的和原有的框架实现了解耦
- 侵入式框架:我们在使用这个框架的时候,需要继承或者实现这个框架中的某些类或者接口,这种框架叫做侵入式框架
2.ORMapping解析
- O:Object
- R:Relation
- M:Mapping 映射
- a.Hibernate能够将Java对象通过映射的关系映射到数据库
- b.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系列更多文章,谢谢大家支持!