连Hibernate技术都不清楚,你敢说你自己会ORM框架?

前言
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'?> com.mysql.jdbc.Driver jdbc:mysql:///qianyu root root org.hibernate.dialect.MySQL5Dialect update
    <!--配置映射文件-->
    <mapping resource="com/qy/helloworld/User.hbm.xml"/>
    
</session-factory>
创建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'?> com.mysql.jdbc.Driver jdbc:mysql:///qianyu root root
    <!--方言 表示的是告诉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的xxx.hbm.xml配置文件的详解 <?xml version="1.0"?>
<!--下面配置的是映射关系   将JAVA对象 直接映射到数据库的表里面去
     name:表示的是类的名字
     table:表示的是当前的这个JAVA类 对应的数据库中的表的名字做是什么 这个名字是可以随便写的 但是一般要见名之意
     lazy:当前这个类在进行查询操作的时候  要进行懒加载
-->
 <!--
     id:表示的是主键的映射
     name:类中主键的名字
     column:主键对应的表的字段
     length:确定当前字段的最大长度
     type:类型(写的是JAVA中数据类型的全路径)
     
              注意:类型可以省略:省略之后的类型就和实体中的类型保持一致
          length:可以省略  默认就是int的最大范围  
          column:这个也可以省略省略之后 默认和类中保持一致  
     
 -->
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 threadLocal=null;
static{
//初始化线程的局部变量
threadLocal=new ThreadLocal();
//加载配置文件
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是会报错的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值