hibernate之数据库操作
hibernate是一种ORM(对象/关系数据库映射)框架,即可以直接通过一个实体对象建立与关系数据库的直接关系,通过这种框架我们在编程的时候可以避免对关系数据库进行直接操作,而是通过对象实例进行操作,间接地对数据库进行一系列操作。这一次先记录实体类与数据库进行映射,并且完成第一次的对数据库表的插入操作。
大体的思路分为以下几个步骤:
(1)导入hibernate必须要用的jar包,将这些jar包添加到应用的类加载路径中。
(2)建立实体类,这个类的属性和表中要生成的列的属性(名称和属性)一致。
(3)建立实体类和关系数据库的映射,而这种映射的配置就需要通过配置文件来配置,可以通过的的.properties属性文件和XML文件来进行配置,不过通常通过XML文件类进行配置。
(4)建立一个执行一系列操作的类,包括执行通过配置文件与数据库建立联系的操作,执行保存对象的操作等等。
那么接下来我将介绍两种类似的但是又是有点区别的方法:
第一种:
(1)导入hibernate包:首先再使用hibernate框架之前必须在官网上面下载hibernate的压缩包,地址为www.hibernate.org,在这个网站中下载最新版的hibernate的压缩包,我下载的是5.3. 6版本的,进行解压,然后在这个文件夹的LIB路径下的所需文件夹下的所有jar包导入项目中,还有的lib \optional\ C3P0文件夹下的三个包导入项目中,注意还有一个重要的jar子包:MySQL的mysql-connector-java的包,这个包是建立的java与MySQL数据库联系必须的包,因此也要导入项目中导入方法:可以在项目中建立一个文件夹,然后将这些jar包复制到这个文件夹中,然后选中所有的jar包,点击右键,选择构建路径,选择添加到本项目中即可。(当然正常情况下只有一个选项嘿嘿)
这些jar包为如下图:
(2)建立一个实体类,这个类的属性是与数据库建立联系的,因此,类的每一个属性即为想要建立的数据库的每一个列名,并且数据类型也是要一致的。然后在这个类中这些属性都是私有类型的,同时也要为这些属性建立设置和获取方法的。
示例如下:
package cn.test.entity;
public class User {
private int id;
private String name;
private String password;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
以上就是建立的实体类。
(3)配置数据库映射的文件。在这个步骤两种方法就有点区别了,一种是直接在配置文件中进行实体类与数据库表中建立一一对应的关系。下面直接上代码
第一个配置文件:hibernate.hbm.xml
<?xml version="1.0" encoding="UTF-8"?>
<!-- 添加dtd约束,代码如下 -->
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<!-- 首先进行数据库表和实体类的映射,实体类为USer类,数据库表为test_one -->
<class name="cn.test.entity.User" table="test_one">
<id name="id" column="id">
<!-- 设置数据库表id增长策略
native:生成表id就是主键自动增长
-->
<generator class="native"></generator>
</id>
<!-- 非主属性就可以直接通过property属性来创建映射 -->
<property name="name" column="name"></property>
<property name="password" column="password"></property>
</class>
</hibernate-mapping>
上面这个文件命名方式没有什么要求,这个配置文件中的代码显而易见,仅仅只是建立了实体类与表,每个属性和表中的每个列名之间一一对应的关系,并没有与数据库的地址,数据库的用户名和密码等等信息。虽然我们的Hibernate的框架可以不用直接对数据库进行操作,但是Java的的对MySQL的的数据库必须是要通过JDBC来建立连接后才能进行操作,因此在这里也是少不了JDBC的那些操作的而这个操作是交给另外一个配置文件来操作的:.hibernate.cfg.xml的这个文件名是默认的,当在操作类中进行操作的时候,调用配置对象的配置方法时,hibernate会自动加载该配置文件,然后建立实体类与数据库的映射该配置文件代码如下:
<?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>
<session-factory>
<!-- 第一部分,配置数据库信息,即数据库加载驱动,数据库地址以及用户名和密码 -->
<!-- 这时必须的,不配置这些数据就无法找到数据库 -->
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<!-- 这里的///三个斜杠就代表本地的意思,即代表本地的数据库 -->
<property name="hibernate.connection.url">jdbc:mysql:///hibernate_one</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在创建表的时候会自动更新表,若没有表则新建一个表 -->
<property name="hbm2ddl.auto">update</property>
<!-- 配置数据库的方言,即适合于指定数据库的数据操作语言,不同的数据库有些数据语言是不一样的 -->
<property name="dialect">org.hibernate.dialect.MySQL5InnoDBDialect</property>
<!-- 第三部分,直接加载已经完成实体类和数据库映射的配置文件-->
<mapping resource="cn/test/entity/hibernate.hbm.xml"/>
<!-- 首先进行数据库表和实体类的映射 -->
</session-factory>
</hibernate-configuration>
(4)第四部分就是建立操作类来进行实际的操作,这里就直接上代码,具体的含义代码的注释中也会有。
package cn.test.Demo;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.junit.Test;
import cn.test.entity.User;
public class hibernateDemo {
public static void main(String []args) throws Exception
{
//第一步 先得加载核心配置文件,利用Configuration对象来封装
Configuration configuration=new Configuration();
//这一步就是通过Configuration对象的configure方法来加载配置文件的,当然这个文件的路径是在src包下的,
//当这个方法中没有参数是默认加载hibernate.cfg.xml文件,当其中有参数时,如参数为"abc",则加载abc.xml文件
configuration.configure();
//加载完成后就要通过configuration实例建立SessionFactory实例
SessionFactory sessionFactory=configuration.buildSessionFactory();
//创建Session实例
Session session=sessionFactory.openSession();
//开始事务
Transaction transaction= session.beginTransaction();
//创建消息对象
User user=new User();
user.setId(1);
user.setName("张三");
user.setPassword("1213213");
//保存消息
session.save(user);
//提交事务
transaction.commit();
//关闭session
session.close();
sessionFactory.close();
}
}
这样直接执行这个代码,就可以发现在数据库中新建了一个表,并且插入了一条数据。
第二种方法:
(1)导包,和第一种一样
(2)建立实体类,这里会和第一种不一样,这里是通过注解来建立联系
package org.crazyit.app.domain;
import javax.persistence.*;
//声明该类是一个Hibernate的持久化类,持久化的概念会在后面讲解
@Entity
//指定该类映射到数据库的表
@Table(name="news_inf")
public class News
{
//id用于指定该类的标识属性,即可以唯一标识该对象的对象,在表中就相当于主键
@Id
//用于指定主键生成的策略,其中stategy属性指定了主键生成策略为IDENTITY策略,也就是采用自动增长的策略
@GeneratedValue(strategy=GenerationType.IDENTITY)
private Integer id;
private String title;
private String content;
public void setId(Integer id)
{
this.id = id;
}
public Integer getId()
{
return this.id;
}
public void setTitle(String title)
{
this.title = title;
}
public String getTitle()
{
return this.title;
}
public void setContent(String content)
{
this.content = content;
}
public String getContent()
{
return this.content;
}
}
这里通过主键就相当于上面的那个hibernate.hbm.xml的功能,直接在里面进行了基本的设置。
(3)配置XML文件,每一部分的代码功能都有解释
<?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>
<session-factory>
<!-- 指定连接数据库所用的驱动 -->
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<!-- 指定连接数据库的url,其中hibernate是本应用连接的数据库名 -->
<property name="connection.url">jdbc:mysql://localhost/hibernate_one?userUnicode=true&characterEncoding=utf-8</property>
<!-- 指定连接数据库的用户名 -->
<property name="connection.username">root</property>
<!-- 指定连接数据库的密码 -->
<property name="connection.password">root</property>
<!-- 指定数据库方言 -->
<property name="dialect">org.hibernate.dialect.MySQL5InnoDBDialect</property>
<!-- 根据需要自动创建数据表 -->
<property name="hbm2ddl.auto">update</property><!--①-->
<!-- 显示Hibernate持久化操作所生成的SQL -->
<property name="show_sql">true</property>
<!-- 将SQL脚本进行格式化后再输出 -->
<property name="hibernate.format_sql">true</property>
<!-- 罗列所有持久化类的类名,即我们刚才建立的实体类 -->
<mapping class="org.crazyit.app.domain.News"/>
</session-factory>
</hibernate-configuration>
(4)进行实际的操作,这个类和第一种的一样,这里就不在阐述。
所以两种方法主要还是在实体类里,第一种是通过配置文件类配置,第二种是直接在实体类通过注解来实现,两种方法最终的实现都是一样的。