有了实体类,也有了hibernate ,还成功的链接了数据库。本节中,我们共同使用hibernate将实体类的信息更新至数据表。
# 开启自动创建数据表
hibernate.cfg.xml
```
<!-- 启用hibernate自动session上下文管理(现在不需要理解)-->
<property name="current_session_context_class">thread</property>
<!-- hibernate mapping to db define language auto create -->
<!-- validate:只验证;create:每次都自动创建新表, update:自动更新表结构.create-drop:随sessionFactory的关闭删除 -->
<property name="hbm2ddl.auto">create</property>
<!-- 是否在控制台打印sql语句 -->
<property name="show_sql">true</property>
</session-factory>
```
> 当我们只给出部分代码时,表示其它未给出代码的部分保持不变。
# 增加映射
加载实体类文件。
src/hibernate.cfg.xml
```
<!-- 是否在控制台打印sql语句 -->
<property name="show_sql">true</property>
<!-- 加载entity.Teacher实体类映射文件 -->
<mapping class="entity.Teacher" />
</session-factory>
```
# 增加注解
在没有接触到java annotation(注解)以前,我们不曾想到,这个类似于注释的东西,竟然能够起如此大的作用。比如前面我们使用单元测试时,就增加过一个@Test注解,来告诉java,那个方法是一个单元测试的方法。
下面我们用注解的方式,来告诉hibrenate,我们当前类要对应数据库中一个数据表
```
package entity;
import javax.persistence.Entity;
// 声明主体
@Entity
public class Teacher {
```
> 和其它采用命名空间的语言一样,我们可以根据命名空间和类名,来快速的定位到文件的位置。
# 测试:
和验证数据库配置信息一样,只有在开启事务时,才会进行数据表的更新。我们继续使用第6节中的测试方法进行测试
> 所有的测试的文件,都位于test文件夹中。
```
package hibernate;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.hibernate.service.ServiceRegistry;
import org.hibernate.service.ServiceRegistryBuilder;
import org.junit.Test;
import java.util.List;
import java.util.Properties;
public class TestCfgXml {
@Test
public void TestConfig() {
try {
// 实例化
```
测试信息:
```
发生错误:
org.hibernate.AnnotationException: No identifier specified for entity: entity.Teacher
```
上述报错信息的原因,是由于我们并没有为Teacher这个实体类增加主键,而Hibernate中规定:每个数据表最少存在一个主键。
# 增加主键
```
package entity;
import javax.persistence.Entity;
import javax.persistence.Id;
// 声明主体
@Entity
public class Teacher {
// 声明主键
@Id
private int id; // 主键
```
# 测试
```
package hibernate;
import java.util.Properties;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.hibernate.service.ServiceRegistry;
import org.hibernate.service.ServiceRegistryBuilder;
import org.hibernate.tool.hbm2ddl.SchemaExport;
import org.junit.Test;
public class TableTest {
@Test
public void createTable() {
// 实例化并加载数据库配置文件
Configuration configuration = new Configuration().configure();
// 构造服务注册对象
ServiceRegistry serviceRegistry = new ServiceRegistryBuilder().
applySettings(configuration.getProperties()).
buildServiceRegistry();
// 创建会话工厂(session factory))
SessionFactory sessionFactory = configuration
.buildSessionFactory(serviceRegistry);
// 创建会话(这里的session也是会话的意思,我们以前接触的http中的session,处理的是用户与服务器的对话)
Session session = sessionFactory.getCurrentSession();
// 开启事务(使用缓冲池进行数据库的连接)
session.beginTransaction();
// 关闭session
session.close();
}
}
```
控制台信息:
```
Hibernate: drop table if exists Teacher
Hibernate: create table Teacher (id integer not null, email varchar(255), name varchar(255), password varchar(255), sex boolean, username varchar(255), primary key (id))
一月 09, 2017 10:56:18 上午 org.hibernate.tool.hbm2ddl.SchemaExport execute
INFO: HHH000230: Schema export complete
```
navicat查看数据库,发现Teacher表已经为我们自动创建了。
![](https://box.kancloud.cn/2d729c6df2b306812f1ea7cc1f53fadd_427x267.png)
# update
在实际开发中,如果我们将hbm2ddl.auto,则每次都会删除所有的表,然后再重新建立空表。当我们需要一些测试数据时,明显的,这样会破坏我们的测试计划。所以,我们更愿意将hbm2ddl.auto的属性设计为update.
update能完成:1.有表则检查表与实体是否对应,不对应则更新表结构。2.无表则创建一个新表。
最终hibrenate.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配置信息 -->
<hibernate-configuration>
<!-- session 工厂配置信息 -->
<session-factory>
<!-- 数据库连接区动, 位于资源库中的com.mysql.jdbc.Driver -->
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<!-- 数据库连接信息jdbc:数据库类型://地址/数据库名 -->
<property name="connection.url">jdbc:mysql://localhost/javaee</property>
<!-- 用户名 -->
<property name="connection.username">root</property>
<!-- 密码 -->
<property name="connection.password"></property>
<!-- 编码格式 -->
<property name="connection.characterEncoding">utf-8</property>
<!-- SQL 方言(不同的数据库除实现了标准的SQL外,还有一些自己的特性) -->
<property name="dialect">org.hibernate.dialect.MySQLDialect</property>
<!-- 启用hibernate自动session上下文管理(现在不需要理解)-->
<property name="current_session_context_class">thread</property>
<!-- hibernate mapping to db define language auto create -->
<!-- validate:只验证;create:每次都自动创建新表, update:自动更新表结构.create-drop:随sessionFactory的关闭删除 -->
<property name="hbm2ddl.auto">update</property>
<!-- 是否在控制台打印sql语句 -->
<property name="show_sql">true</property>
<!-- 加载entity.Teacher实体类映射文件 -->
<mapping class="entity.Teacher" />
</session-factory>
</hibernate-configuration>
```
- README
- 第一章:准备
- 第二章:Hello World!
- 第一节:查看工程文件
- 第二节:JDK、JRE与环境变量
- 第三节:index.jsp
- 第三章:Hello Struts
- 第一节:Web.xml
- 第二节:单入口
- 第三节:Hello Struts
- 第四节:触发C层
- 第四章:建立数据表
- 第一节:建立实体类
- 第二节:测试一
- 第三节:测试二
- 第四节:引入Hibernate
- 第五节:配置Hibernate
- 第六节:建立连接
- 第七节:实体类映射数据表
- 第八节:完善数据表
- 第五章:教师管理
- 第一节:增加数据--add
- 第二节:增加数据--save
- 1 获取传入数据数据
- 2 数据写入测试
- 3 对接C层
- 第三节:数据列表
- 1 获取数据
- 2 重构代码
- 3 C层对接--初始化
- 4 C层添加数据
- 5 V层显示数据
- 6 获取数据库中数据
- 7 显示性别
- 8 分页
- 9 条件查询
- 第四节:修改数据
- 1 edit
- 2 update
- 第五节:删除数据
- 第六节:总结
- 第六章:重构C层
- 第一节:继承ActionSupport类
- 第二节:数据验证
- 第七章:前台分离(前台)
- 第一节:环境搭建
- 第二节:运行环境
- 第三节:共享开发环境
- 第四节:生产环境
- 第八章:前台开发(前台)
- 第一节:本地化
- 第二节:教师列表
- 1 引入M层
- 2 模拟后台返回数据
- 3 C与M对接
- 4 C与V对接
- 第九章:前后台对接(前后台)
- 第一节:后台输出json(后台)
- 第二节:对接前台(全栈)
- 第二节:对接API(前台)
- 第二节:跨域请求(后台)
- 第三节:重构代码(前台)
- 第十章:重构后台M层
- 第一节:数据访问DAO层
- 第二节:项目整体重构
- 第十一章:用户登陆(前后台)
- 第一节:制定规范
- 第二节:定制测试用例
- 第三节:后台输入测试代码(后台)
- 第四节:postman(后台)
- 第五节:新建用户登陆模块(前台)
- 第六节:代码重构(前台)
- 第十二章:班级管理(前后台)
- 第一节:班级列表
- 1 原型开发
- 2 制定规范
- 3 后台对接开发
- 4 前台对接开发
- 第二节:Add
- 1 原型开发
- 2 制定规范
- 3 后台对接开发
- 4 前台对接开发
- 第三节:Save
- 1 制定规范
- 2 后台对接开发
- 3 前台对接开发
- 第四节:Edit
- 1 原型开发
- 2 制定规范
- 3 后台对接开发
- 4 前台对接开发
- 第五节:Update
- 1 制定规范
- 2 后台对接开发
- 3 前台对接开发
- 第六节:Delete
- 1 制定规范
- 2 后台对接开发
- 3 前台对接开发
- 第七节:小结
- 第十三章:班级管理(API)
- 第一节:ER图
- 第二节:create
- 1 实体层
- 2 dao层
- 3 service(server)层
- 4 action层
- 第三节:ManyToOne
- 第四节:Read
- 1 service(server)层
- 2 action层
- 第五节:update
- 1 service(server)层
- 2 action层
- 第六节:update
- 第十四章:重构服务层