现在Hibernate使用的是越来越少了,但是Hibernate任然是一个非常棒的框架
今天用Hibernate实现简单的增删改查
配置文件
Hibernate的配置文件主要有两个,一个是hibernate.cfg.xml .默认放在src下(也可以放在其他位置,但是要在加载配置文件时填写路径信息).另一个(种)是 mappername.hbm.xml .mappername是你实体类的类名.放到实体包中(没试过放到其他地方,有兴趣可以试试).
首先书写hibernate.cfg.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="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<!-- 数据库url -->
<property name="hibernate.connection.url">jdbc:mysql:///information?useUnicode=true&characterEncoding=utf-8&useSSL=true</property>
<!-- 数据库连接用户名 -->
<property name="hibernate.connection.username">root</property>
<!-- 数据库连接密码 -->
<property name="hibernate.connection.password">123456</property>
<!-- 数据库方言
不同的数据库中,sql语法略有区别. 指定方言可以让hibernate框架在生成sql语句时.针对数据库的方言生成.
-->
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
<!-- 将hibernate生成的sql语句打印到控制台 -->
<property name="hibernate.show_sql">true</property>
<!-- 将hibernate生成的sql语句格式化(语法缩进) -->
<property name="hibernate.format_sql">true</property>
<!-- 设置隔离级别 值为1,2,4,8 mysql默认为4(可重复读) -->
<property name="hibernate.connection.isolation">4</property>
<!-- 设置线程绑定-->
<property name="hibernate.current_session_context_class">thread</property>
<!--
##自动导出表结构. 自动建表
#create 自动建表.每次框架运行都会创建新的表.以前表将会被覆盖,表数据会丢失.
#create-drop 自动建表.每次框架运行结束都会将所有表删除.
#update 自动生成表.如果已经存在不会再生成.如果表有变动.自动更新表(不会删除任何数据).
#validate 校验.不自动生成表.每次启动会校验数据库中表是否正确.校验失败.
-->
<property name="hibernate.hbm2ddl.auto">update</property>
<!-- 引入orm元数据
路径书写: 填写src下的路径
-->
<mapping resource="domain/Customer.hbm.xml" />
<mapping resource="domain/Fathers.hbm.xml" />
<mapping resource="domain/Sons.hbm.xml" />
<mapping resource="domain/Teacher.hbm.xml" />
<mapping resource="domain/Student.hbm.xml" />
</session-factory>
</hibernate-configuration>
Hibernate的特点之一就是我们可以不用建表,它可以根据我们的实体类自动生成相应的数据表,hibernate.cfg.xml中的hibernate.hbm2ddl.auto这个配置就可以选择自动建表的策略.
所以剩下的mappername.hbm.xml的配置文件的意义就是声明实体类与数据表的关系以及建表的一些细节问题.最后在hibernate.cfg.xml文件的mapping中配置路径就可以了.下面是Customer类的配置信息Customer.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">
<!-- 配置表与实体对象的关系 -->
<!-- package属性:填写一个包名.在元素内部凡是需要书写完整类名的属性,可以直接写简答类名了. -->
<hibernate-mapping package="domain" >
<!--
class元素: 配置实体与表的对应关系的
name: 完整类名
table:数据库表名
-->
<class name="Customer" table="customer" >
<!-- id元素:配置主键映射的属性
name: 填写主键对应属性名
column(可选): 填写表中的主键列名.默认值:列名会默认使用属性名
type(可选):填写列(属性)的类型.hibernate会自动检测实体的属性类型.
每个类型有三种填法: java类型|hibernate类型|数据库类型
not-null(可选):配置该属性(列)是否不能为空. 默认值:false
length(可选):配置数据库中列的长度. 默认值:使用数据库类型的最大长度
-->
<id name="userid" column="userid">
<!-- generator:主键生成策略
native: long型的自增主键
uuid: String型的32位字符串
-->
<generator class="native"></generator>
</id>
<!-- property元素:除id之外的普通属性映射
name: 填写属性名
column(可选): 填写列名
type(可选):填写列(属性)的类型.hibernate会自动检测实体的属性类型.
每个类型有三种填法: java类型|hibernate类型|数据库类型
not-null(可选):配置该属性(列)是否不能为空. 默认值:false
length(可选):配置数据库中列的长度. 默认值:使用数据库类型的最大长度
-->
<property name="username" column="username" ></property>
<property name="password" column="password" >
<!-- <column name="cust_name" sql-type="varchar" ></column> -->
</property>
</class>
</hibernate-mapping>
测试方法的书写
@Test
public void test1(){
// 读取配置文件(默认查找src文件夹下的hibernate.cfg.xml文件)
// 如果配置文件在其他位置,需要在为configure添加一个路径的参数
Configuration cf = new Configuration().configure();
// 获取一个回话工厂,我们每一个与数据库交互的connection都可以看做是一个会话
SessionFactory sf = cf.buildSessionFactory();
// 打开一个会话
Session session = sf.openSession();
// 开启事物并得到一个指向它的引用
Transaction transaction = session.beginTransaction();
// 添加信息----------------------------------------------------------
// 创建一个实体类并填写相应信息(主键不用写,根据主键生成策略自动生成)
Customer c1 = new Customer();
c1.setUsername("小李");
c1.setPassword("123456");
// 调用save方法添加信息
session.save(c1);
// -----------------------------------------------------------------
// 查询信息----------------------------------------------------------
// 根据主键查询,调用get方法,第一个参数是查询的表对应的实体类,第二个主键信息
Customer customer = session.get(Customer.class, 2l);
System.out.println(customer);
// -----------------------------------------------------------------
// 修改信息----------------------------------------------------------
// 先查询到具体的信息
Customer customer1 = session.get(Customer.class, 2l);
customer.setUsername("小白");
// 把修改后的实体对象传入update方法即可
session.update(customer1);
// -----------------------------------------------------------------
// 删除信息----------------------------------------------------------
// 先查询到具体的信息
Customer customer2 = session.get(Customer.class, 2l);
// 把要删除的的实体对象传入update方法即可
session.delete(customer2);
// -----------------------------------------------------------------
// 提交事务
transaction.commit();
// 关闭会话
session.close();
}