hibernate之小白一
关于hibernate框架,以下是我自己的见解,每个人的理解各不同,希望各位读者根据自己的需要来查询自己想要的。以下我来给你们分享我学习hibernate的一些理论和实践:
- 首先我们来了解一下hibernate的概述:什么是框架,什么是hibernate,什么是ORM
- 其次来了解hibernate入门:开发环境的搭建和一些简单功能的实现
- 然后是hibernate配置文件:映射配置文件和核心配置文件
- 再然后我们看一下hibernate的核心API
- 最后写其代码,一睹其风采。
1.hibernate的概述
对于框架的理解,那是简单而粗暴的,无非就是少些代码,对代码进行整理,将一些主要代码整合起来。举一个简单的例子:就像盖房子你得先搭起整个架子,然后再慢慢写其他的功能。
对于hibernate,是一个标准的ORM框架(也就是对象关系映射),入门门槛高,它的sql语句是不用程序猿写的。sql语句是自动生成,但对sql语句进行优化、修改是比较困难的。
对于ORM,这是一种思想,我理解的是比较浅的,关于ORM你们可查完美资料。在hibernate中ORM思想:使得实体类和数据库中的表相对应,实体类里面的属性和库中的字段对应。下面是ORM思想的一个图。
2.hibernate入门和配置文件
工程示意图:
下面就来剖析上面的工程:
(1)在cn.itcast.entity包下有俩个文件,依次是User实体类,实体类映射配置文件
(2)cn.itcast.hibernatetest下有一个测试类
(3)cn.itcast.util包下是一个工具类
(4)hibernate.cfg.xml是核心配置文件,还有下面的log4.properties文件是一个日志文件。
既然咱说到这里了,咱就一会再说那几个核心API,下面咱开始代码之旅:
先看咱的实体类,非常简单,就几个属性,在生成set,get方法:
package cn.itcast.entity; public class User {
/* Hibernate要求实体类有一个属性值唯一的 */
private int uid;
private String username;
private String password;
private String address; public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
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 getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
@Override
public String toString() {
return "User [uid=" + uid + ", username=" + username + ", password=" + password + ", address=" + address + "]";
}
}
其次,在配置User实体类的映射文件:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<!-- 1.配置类和表对应 。class标签:1).name属性:实体类全路径。2).table属性:数据库表名 -->
<class name="cn.itcast.entity.User" table="t_user">
<!-- 2.配置实体类id和表id对应。hibernate要求实体类有一个属性唯一值 ,hibernate要求表有一个属性唯一值 -->
<id name="uid" column="uid">
<!-- 设置数据库表id增长策略 -->
<generator class="native"></generator>
</id>
<property name="username" column="username"></property>
<property name="password" column="password"></property>
<property name="address" column="address"></property>
</class>
</hibernate-mapping>
在上面代码中,我写的很详细,大家在写配置文件的时候,表头也很重要,一般情况下,你直接复制到你配置文件中去就可以使用,有提示。而非一般情况下,是没有提示的,为了这个问题,小编我可是费了好多功夫,在以后的日子里,我会把这一问题给大家分享出来。
然后再配置我们的核心配置文件:
<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//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>
<property name="hibernate.connection.url">jdbc:mysql:///hibernate</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">root</property> <!-- 第二部分:配置hibernate信息,可选的 -->
<!-- 输出底层sql语句 -->
<property name="hibernate.show_sql">true</property>
<!-- 输出底层sql语句格式 -->
<property name="hibernate.format_sql">true</property> <!-- hibernate帮创建表,需配置之后,update:如果已经有表就更新,没有就创建 -->
<property name="hibernate.hbm2ddl.auto">update</property> <!--配置数据库方言;在mysql中实现分页使用limit,只能在mysql中。让hibernate框架识别不同数据库的自己的语句 -->
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property> <!-- 第三部分:hibernate配置表:需要配置之后 -->
<mapping resource="cn/itcast/entity/User.hbn.xml" />
</session-factory>
</hibernate-configuration>
再然后看工具类
package cn.itcast.utils; import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration; public class HibernateUtils {
static Configuration cfg = null;
static SessionFactory sessionFactory = null;
// 提供静态代码块实现
static {
// 加载核心配置文件
cfg = new Configuration().configure();
sessionFactory = cfg.buildSessionFactory();
}
// 提供方法返回值sessionFactory
public static SessionFactory getSessionFactory() {
return sessionFactory;
}
public static void main(String[] args) {}
//在这里面我们使用了静态代码块,它只执行一次,因为在真实的项目中,咱的SessionFactory只会创建一个,而且不需要关闭。补一句,log4日志文件复制Copy就ok。
}
最后咱们看测试代码:
package cn.itcast.hibernatetest; import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.junit.Test; import cn.itcast.entity.User;
import cn.itcast.utils.HibernateUtils; public class HibernateDemo {
@Test
public void add() {
SessionFactory sessionFactory = HibernateUtils.getSessionFactory();
// 第三步:使用SessionFactory创建session对象
Session session = sessionFactory.openSession();
// 第四步:开启事务
Transaction tx = session.beginTransaction();
// 第五步:写具体逻辑crud操作
User user = new User();
user.setUsername("张圣诞");
user.setAddress("美国");
user.setPassword("5201205");
session.save(user);
// 第六步:提交事务
tx.commit();
// tx.rollback();
// 第七步:关闭事务
session.close();
sessionFactory.close();
}
}
此方法执行之后,hibernate就会给我创建数据库表,并添加数据到数据库中。不过咱这样写终究是有一些问题的,比如说性能啊、代码简洁度啊、规范性啊什么的,那么我会在之后几天,我会给大家补充的。
那么hibernate会给咱生成sql语句:
那么到现在,我们简单的hibernate工程就完结了,你学到了嘛,希望对你有用哦。。
到最后,我们来看看四个重要的API:
1.首先是Configuration,我来写句代码:Configuration cfg = new Configuration().configure();//这是到src下去找名称为hibernate.cfg.xml配置文件,把文件放到对象里面去(也就是加载核心配置文件)
2.SessionFactory(重点),使用Configuration对象创建SessionFactory对象,在创建SessionFactory过程中一般是一个项目就创建一个,具体实现我们使用工具类,用静态方法创建。让其只执行一次
3.Session(重点),session类似于jdbc中的connection.调用session里面不同方法可实现crud操作,如save,get,delete,update等,session对象为单线程对象,不能共用,只能自己用
4.transaction,事务对象,通过session开启事务,提交事务,有异常的话回滚事务。对了,事务还有四个特性:原子性、一致性、隔离性、持久性。
无论你是来自著名或不著名的城市,都欢迎你,因为我们都在砥砺前行!
hibernate之小白一的更多相关文章
- hibernate中.hbm.xml和注解方式自动生成数据表的简单实例(由新手小白编写,仅适用新手小白)
绝逼新手小白,so 请大神指点! 如果真的错的太多,错的太离谱,错的误导了其他小伙伴,还望大神请勿喷,大神请担待,大神请高抬贵嘴......谢谢. 好了,正题 刚接触ssh,今天在搞使用.hbm.xm ...
- Hibernate缓存之初探
数据层的访问效率优化可能第一想到的就是利用缓存,缓存的机能可以简单理解为将从数据库中访问的数据放在内存中,在以后再次使用到这些数据时可以直接从内存中读取而不必要再次访问数据库,尽量减少和数据库的交互提 ...
- 。。。JDBC里面的sql与hibernate里面的hql有关占位符"?"的总结。。。
今天在看Hibernate的时候,似乎又有了一些收获的东东,嘻嘻... 我记得很清楚:以前用JDBC操作数据库的时候是这样的: String sql = "select * from use ...
- hibernate初涉
好久都不曾写写总结一些东西了,惰性真的是令人难以克制!虽然和许多北漂族一样,艰苦而又迷茫,但是我总能找到一些方向,一点期盼,因为你就我的目标.我会坚持下去,重拾青春的热血,既然人生如戏,那我不当猪脚. ...
- maven配置spring mvc+hibernate+spring框架
作为一名刚出茅草屋的新手小白写的框架,仅适合新手小白借鉴,大神勿喷,谢谢...... 前天刚知道spring mvc这个框架现在也很流行,决定用它代替struts2来写我的毕业设计. ...作为一名新 ...
- eclipse环境下基于已构建struts2项目整合spring+hibernate
本文是基于已构建的struts2项目基础上整合 spring+hibernate,若读者还不熟悉struts2项目,请先阅读 eclipse环境下基于tomcat-7.0.82构建struts2项目 ...
- ssh中Hibernate懒加载,session问题的学习与理解
交代本项目中要求获取session的方式如下: public Session getCurrentSession() { // 增删改使用的session,事务必须是开启的(Required,即pro ...
- Hibernate | Spring JPA | MySQL 使用过程遇到的一些问题
1. 使用过程 2. 背景 3. 遇到问题 3.1 不指定Hibernate数据库方言,默认SQL生成方式 3.2 抛出异常Hibernate加入了@Transactional事务不会回滚 3.3 H ...
- spring+springmvc+hibernate 整合
三大框架反反复复搭了很多次,虽然每次都能搭起来,但是效率不高.最近重新搭了一次,理顺了思路,整理了需要注意的地方,分享出来. 工具:Eclipse(jdk 1.7) spring和hibernate版 ...
随机推荐
- 致初学者(二): HDU 2014~ 2032题解
下面继续给出HDU 2014~2032的AC程序,供大家参考.2014~2032这19道题就被归结为“C语言程序设计练习(三) ”~“C语言程序设计练习(五) ”. HDU 2014:青年歌手大奖赛_ ...
- eclipse查看.class文件
要使用jd-gui.exe反编译程序 步骤:window-preferences-general-editors-file associations, 如下图 上面的框选中,*.class witho ...
- Day 1 linux系统的发展史与虚拟机的安装过程
自由软件之父 Richard M. Stallman 1984 发起了GNU组织 copyleft opensourc free GPL copyleft 代表无版权.copyright 代表有版权. ...
- Java8虚拟机(JVM)内存溢出实战
前言 相信很多JAVA中高级的同学在面试的时候会经常碰到一个面试题 你是如何在工作中对JVM调优和排查定位问题的? 事实上,如果用户量不大的情况下,在你的代码还算正常的情况下,在工作中除非真正碰到与J ...
- [C++]类的设计(2)——拷贝控制(拷贝控制和资源管理)
1.类的行为分类:看起来像一个值:看起来想一个指针. 1)类的行为像一个值,意味着他应该有自己的状态.当我们拷贝一个像值的对象时,副本和原对象是完全独立的.改变副本不会对原有对象有任何影响 ...
- C++基础之适配器
什么是容器适配器? ”适配器是使一种事物的行为类似于另外一种事物行为的一种机制”,适配器对容器进行包装,使其表现出另外一种行为.例如,stack<int, vector<int> & ...
- elasticsearch 增删改查底层原理
elasticsearch专栏:https://www.cnblogs.com/hello-shf/category/1550315.html 一.预备知识 在对document的curd进行深度分析 ...
- 让tomcat使用指定JDK
一,前言 我们都知道,tomcat启动前需要配置JDK环境变量,如果没有配置JDK的环境变量,那么tomcat启动的时候就会报错,也就是无法启动. 但是在我们的工作或者学习过程中,有的时候会出现tom ...
- opencv边缘检测-拉普拉斯算子
sobel算子一文说了,索贝尔算子是模拟一阶求导,导数越大的地方说明变换越剧烈,越有可能是边缘. 那如果继续对f'(t)求导呢? 可以发现"边缘处"的二阶导数=0. 我们可以利用这 ...
- python自动化测试三部曲之untitest框架
终于等到十一,有时间写博客了,准备利用十一这几天的假期把这个系列的博客写完 该系列文章本人准备写三篇博客 第一篇:介绍python自动化测试框架unittest 第二篇:介绍django框架+requ ...