这篇文章主要介绍“如何理解Hibernate技术”,在日常操作中,相信很多人在如何理解Hibernate技术问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”如何理解Hibernate技术”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!
传统的MVC开发模式
❝M:Model包括pojo、service、dao。
V:View 包括jsp、html、模块引擎。
C:Controll 包括我们动态网络资源的技术:Servlet。❞
SSH框架在开发中的作用
❝S:Struts/SpringMVC: 实际上解决的是我们的控制器的问题(简单的可以认为是Servlet的封装)。
Spring: 整合其余的第三方框架,就是为 Srvice 层提供事务。
Hibernate:其实就是DAO层的解决方案。❞
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(); } } }
注意事项
鸿蒙官方战略合作共建——HarmonyOS技术社区
我们hibernate.cfg.xml配置文件中这个括hibernate.是可以省略
为什么不开启事务也能查询到数据?是因为默认Hibernate存在只读事务,只读事务是可以完成数据的读的操作的,如果是要完成增删改的话那么就需要读写事务,这个时候就需要开启事务
Save和Persist的区别
Save在保存数据的时候,如果id是自增长,你给定id和不给定id都是对的。
Persist在保存数据的时候,如果id是自增长的,你给定id是会报错的。
到此,关于“如何理解Hibernate技术”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注亿速云网站,小编会继续努力为大家带来更多实用的文章!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。