之前已经过滤一下hibernate的简单的用法,但是近期有点时间,所以重新看下视频,敲下代码,翻下笔记,写博客与大家分享一下。 

hibernate简介

Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,它将POJO与数据库表建立映射关系,是一个全自动的orm框架,hibernate可以自动生成SQL语句,自动执行,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。

来自百度百科

我对hibernate的看法

其实对于很多的概念,比如什么jpa orm之类的刚刚开始入门的时候可以说是让我自己头晕,天花乱坠的解释触不及防,当我使用了hibernate之后我也就渐渐的了解orm,刚刚入门我就觉得自己先不要太过于深究了,框架就拿来用就行了。

用了之后发觉hibernate真的挺好,节省了我们的很多时间,不用程序员自己编写SQL语句,而是通过对象的形式去操作数据库,当然还有就是一些需要配合HQL的地方,个人感觉蛮好的。

不过以对象的形式去映射表,用对象操作数据库,SQL语言的生成掌握在hibernate的手中也暴露了一些问题,你怎么去控制它生成的SQL等等等

创建项目、搭建环境

现在开始搭建我们的开发环境,这里我使用的是maven项目

项目结构图

如果没有尝试过maven,可以在博客上搜一下,然后配置一下,你会爱上它的

这里我在porm.xml中引入了相关的依赖

<dependencies>
<!-- https://mvnrepository.com/artifact/org.hibernate/hibernate-core -->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>5.2.10.Final</version>
</dependency> <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.43</version>
</dependency> </dependencies>

通过添加了以上的依赖,jar已经就自动的添加到了项目中了,所以现在剩下的就是编码和配置了

生成pojo(java对象)并写映射文件

Customer对象

别问我这是哪里来的,直接拿来用一下就行了

public class Customer {

    /*
* CREATE TABLE `cst_customer` (
`cust_id` BIGINT(32) NOT NULL AUTO_INCREMENT COMMENT '客户编号(主键)',
`cust_name` VARCHAR(32) NOT NULL COMMENT '客户名称(公司名称)',
`cust_source` VARCHAR(32) DEFAULT NULL COMMENT '客户信息来源',
`cust_industry` VARCHAR(32) DEFAULT NULL COMMENT '客户所属行业',
`cust_level` VARCHAR(32) DEFAULT NULL COMMENT '客户级别',
`cust_linkman` VARCHAR(64) DEFAULT NULL COMMENT '联系人',
`cust_phone` VARCHAR(64) DEFAULT NULL COMMENT '固定电话',
`cust_mobile` VARCHAR(16) DEFAULT NULL COMMENT '移动电话',
PRIMARY KEY (`cust_id`)
) ENGINE=INNODB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
*/
private Long cust_id; private String cust_name;
private String cust_source;
private String cust_industry;
private String cust_level;
private String cust_linkman;
private String cust_phone;
private String cust_mobile;
public Long getCust_id() {
return cust_id;
}
public void setCust_id(Long cust_id) {
this.cust_id = cust_id;
}
public String getCust_name() {
return cust_name;
}
public void setCust_name(String cust_name) {
this.cust_name = cust_name;
}
public String getCust_source() {
return cust_source;
}
public void setCust_source(String cust_source) {
this.cust_source = cust_source;
}
public String getCust_industry() {
return cust_industry;
}
public void setCust_industry(String cust_industry) {
this.cust_industry = cust_industry;
}
public String getCust_level() {
return cust_level;
}
public void setCust_level(String cust_level) {
this.cust_level = cust_level;
}
public String getCust_linkman() {
return cust_linkman;
}
public void setCust_linkman(String cust_linkman) {
this.cust_linkman = cust_linkman;
}
public String getCust_phone() {
return cust_phone;
}
public void setCust_phone(String cust_phone) {
this.cust_phone = cust_phone;
}
public String getCust_mobile() {
return cust_mobile;
}
public void setCust_mobile(String cust_mobile) {
this.cust_mobile = cust_mobile;
}
@Override
public String toString() {
return "Customer [cust_id=" + cust_id + ", cust_name=" + cust_name + "]";
} }

customer.hbm.xml是一个关于对象的映射文件,它解释了对象中的一些属性在数据库中的表示方式,文件有一定的命名格式,就是后缀需要使用.hbm.xml

<?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 package="cn.lger.domain">
<!--声明对象Customer和表cst_customer是关联的,当然了这不是必须的-->
<class name="Customer" table="cst_customer">
<!--
声明表中的每一个字段对应的对象中的属性
除了id其他的为非必须的
-->
<id name="cust_id" column="cust_id">
<generator class="increment"/>
</id> <property name="cust_name" column="cust_name" />
<property name="cust_source" column="cust_source" />
<property name="cust_industry" column="cust_industry" />
<property name="cust_level" column="cust_level" />
<property name="cust_linkman" column="cust_linkman" />
<property name="cust_phone" column="cust_phone" />
<property name="cust_mobile" column="cust_mobile" />
</class>
</hibernate-mapping>

配置hibernate.cfg.xml

现在接下来就是配置hibernate的配置文件,这里也是有命名规则的,就是后缀需要用.cfg.xml,并且将hibernate.cfg.xml放置于根目录classpath下(src),至于是为什么这么做,在测试中的注释有解释

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd"> <hibernate-configuration>
<!--一个配置文件中仅有的一个sessionFactory-->
<session-factory>
<!--连接数据库的基本操作-->
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">root</property>
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/hibernate_base</property>
<!--
hibernate.hbm2ddl.auto这个参数配置是在hibernate启动的时候对于表的操作的措施 create 自动建表.每次框架运行都会创建新的表.以前表将会被覆盖,表数据会丢失.(开发环境中测试使用)
create-drop 自动建表.每次框架运行结束都会将所有表删除.(开发环境中测试使用)
update 自动生成表.如果已经存在不会再生成.如果表有变动.自动更新表(不会删除任何数据).
validate 校验.不自动生成表.每次启动会校验数据库中表是否正确.
-->
<property name="hibernate.hbm2ddl.auto">update</property> <!--下列为非必须配置,只是为了开发方便-->
<!--hibernate.show_sql为true的时候可以在控制台打印出sql-->
<property name="hibernate.show_sql">true</property>
<!--hibernate.format_sql为true可以在打印sql的时候格式化,不然sql就是一行,不利于我们观看-->
<property name="hibernate.format_sql">true</property> <!--加入映射文件-->
<mapping resource="customer.hbm.xml"/>
</session-factory>
</hibernate-configuration>

运行测试

接下来我创建了一个测试类,用于测试是否成功运行

public class TestInsertCustomer {

    @Test
public void test01(){ Configuration configuration = new Configuration();
//初始化hibernate的配置,这里默认的是配置根目录下的hibernate.cfg.xml
//如果不想用这个函数,或者说不想将配置文件放于根目录可以使用configure(String resource)或configure(URL url)....
configuration.configure();
//从会话工厂中拿取session
SessionFactory sessionFactory = configuration.buildSessionFactory();
//打开会话
Session session = sessionFactory.openSession();
//开启事务
Transaction transaction = session.beginTransaction();
//操作数据库部分
Customer customer = new Customer();
customer.setCust_name("张三");
customer.setCust_mobile("1231222");
//将customer保存到数据库
session.save(customer); transaction.commit();
session.close();
sessionFactory.close();
}
}

当然了,这里可能会有疑问,就是说我们根本不存在这个cst_customer表,它能将数据放进去吗?答案是可以,这是因为hibernate会根据对象创建表。

完整代码可以上github下载

我的hibernate学习记录(一)的更多相关文章

  1. 我的hibernate学习记录(二)

    通过上一篇文章我的hibernate学习记录(一)基本上的入门了hibernate,但是,里面还有还多东西是通过迷迷糊糊的记忆,或者说copy直接弄进去的,所以这篇文章就需要对上篇的一些文件.对象进行 ...

  2. Quartz 学习记录1

    原因 公司有一些批量定时任务可能需要在夜间执行,用的是quartz和spring batch两个框架.quartz是个定时任务框架,spring batch是个批处理框架. 虽然我自己的小玩意儿平时不 ...

  3. hibernate学习四(关系映射一对一与组件映射)

    一.关系映射简介 在数据库中,表与表的关系,仅有外键.但使用hibernate后,为面向对象的编程,对象与对象的关系多样化:如 一对一,一对多,多对多,并具有单向和双向之分. 开始练习前,复制上一次项 ...

  4. hibernate学习三(使用Annotation,注解)

    一.新建一个工程hibernate_02_HelloWorld_Annotation(复制01工程并重命名); 二.新建一个实体类teacher.java,数据库中新建teacher表; import ...

  5. hibernate学习二(HelloWorld)

    一.建立hibernate配置文件 在工程Hibernate_01_HelloWorld下的src上建立hibernate.cfg.xml,打开hibernate-release-4.3.11.Fin ...

  6. hibernate学习一(hibernate简介与准备)

    一.hibernate简介 Hibernate是一个开放源代码的对象-关系映射(Object/Relational Mapping 即 ORM)框架,它对JDBC进行了非常轻量级的对象封装,它将POJ ...

  7. Hibernate学习笔记(二)

    2016/4/22 23:19:44 Hibernate学习笔记(二) 1.1 Hibernate的持久化类状态 1.1.1 Hibernate的持久化类状态 持久化:就是一个实体类与数据库表建立了映 ...

  8. Hibernate学习笔记(一)

    2016/4/18 19:58:58 Hibernate学习笔记(一) 1.Hibernate框架的概述: 就是一个持久层的ORM框架. ORM:对象关系映射.将Java中实体对象与关系型数据库中表建 ...

  9. Hibernate学习——映射关系

    学习记录 O(∩_∩)O . 如果你恰巧路过,希望你能停下脚步瞧一瞧,不足之处望指出,感激不尽~ 使用工具: 1.eclipse   2.hibernate压缩包(hibernate_4.3.11)  ...

随机推荐

  1. Ext js Grid

    Ext.onReady(function () {                   var proxy = new Ext.data.HttpProxy({                  ur ...

  2. vue指令v-on示例解析

    绑定事件监听器.事件类型由参数指定.表达式可以是一个方法的名字或一个内联语句,如果没有修饰符也可以省略. 1.事件 .click .mouseover .keyup ...... 2.修饰符 .sto ...

  3. MySQL xtrabackup之--databases 勿手贱

    xtrabackup备份单库时,必须指定--databases,但是如果将databases写成了database,那么xtrabackup备份的就是整个数据库,以下是 uuid = 397ae42e ...

  4. Eclipse中的Debug

    一.Debug的基本过程 设置断点(双击待设断点左边行号处) 进入Debug模式(在待调试类上右键>调试方式,根据需求选择) 开始调试 二.Debug中的常用操作 继续执行[F8]:继续运行程序 ...

  5. coder该何去何从

    无论是什么语言的学习,都不是一帆风顺的,如今随着编程大军的壮大,工作越来越难找,各位coder已经把中心偏移到了学历上面,导致技术水平的参差不齐,以及虚假学历的泛滥,这样的恶性循环下,不知前路在何方?

  6. Session获取不到的情况及解决办法(源码解析)

    本博客是自己在学习和工作途中的积累与总结,仅供自己参考,也欢迎大家转载,转载时请注明出处,请尊重他人努力成果,谢谢. 1. 当有连个sessionFactory时,容易产生获取不到session的情况 ...

  7. JS中的变量和输入输出

    一.使用JS的三种方式 1.在HTML标签中,直接内嵌JS(并不提倡使用) <button onclick="alert('点你咋地')">点我</button& ...

  8. decimal扩展方法(转换为字符串,去掉末尾的0)

    /// <summary> /// 转换为字符串,去掉末尾0 /// </summary> /// <param name="target">被 ...

  9. Struts2学习笔记(一)——环境搭建

    1.创建Web项目并导入Struts2的主要jar包 在MyEclipse中新建Web项目,然后在lib目录下添加必须的jar包: 2.创建jsp页面 1).创建test.jsp页面: <bod ...

  10. 在Debian9(linux)上使用 的 python 3 IDLE(已经安装了python 2.7 的情况下)

    在Debian9(Stable)中默认安装了python2.7和pytohon3.5两个版本,但是没有IDLE,本人想用pytihon3.5的IDLE,将本次解决问题在此Mark一下, 首先,执行 s ...