多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
有了实体类,也有了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> ```