一、框架是什么
1、框架是用来提高开发效率的
2、封装好了一些功能,我们需要使用这些功能时,调用即可,不需要手动实现
3、框架可以理解成一个半成品的项目,只要懂得如何驾驭这些功能即可
二、hibernate框架是什么
三、hibernate
1、操作数据库的时候,可以以面向对象的方式来完成,不需要书写SQL语句
2、hibernate是一款orm框架
1)orm:object relating mapping.对象关系映射
2)
3)orm分4级
hibernate属于4级:完全面向对象操作数据库
mybatis属于2级
dbutils属于1级
四、hibernate框架的搭建
1、下载Hibernate5
https://sourceforge.net/projects/hibernate/files/hibernate-orm/5.0.7.Final/
下载之后解压目录结构如下:
documentation文件夹:存放Hibernate的相关文档,包括参考文档的API文档
lib文件夹:存放Hibernate编译和运行所依赖的Jar包,其中required子目录下包含了运行Hibernate5项目必须的jar包
project文件夹:存放Hibernate各种相关的源代码
2、创建数据库和表
3、引入Hibernate的开发包
数据库安装包:
Hibernate/lib/required/*.jar:
日志记录的包:
4、创建实体(持久化类)
Hibernate使用普通Java对象(Plain Old Java Object),即POJO的编程模式来进行持久化,POJO类中包含的是与数据库表相对应的各个属性,这些属性通过getter和setter方法来访问,对外部隐藏了内部的实现细节。
1 package cn.itheima.domain; 2 3 public class Customer { 4 private Long cust_id; 5 private String cust_name; 6 private String cust_source; 7 private String cust_industry; 8 private String cust_level; 9 private String cust_linkman; 10 private String cust_phone; 11 private String cust_mobile; 12 ...... 13 }
5、创建映射文件
实体类Customer目前不具备持久化操作的能力,而Hibernate需要知道实体类Customer映射到数据库Hibernate中的哪个表,以及类中的哪个属性对应数据库的表中的哪个字段,这些都需要在映射文件中配置。
先导入约束(window--->Preferences--->XML--->XML Catalog--->User Specified Entries窗口,点击Add按钮)
在实体类Customer所在的包中,创建一个名称为Customer.hbm.xml的映射文件,在该文件中定义了实体类Customer的属性是如何映射到cst_customer表的列上的。
1 <?xml version="1.0" encoding="UTF-8"?> 2 <!DOCTYPE hibernate-mapping PUBLIC 3 "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 4 "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> 5 <hibernate-mapping> 6 <!-- 建立类和表的一个映射关系 --> 7 <!-- 8 class标签:用来建立类和表的映射 9 *name属性:类中的全路径 10 *table属性:表名(如果类名和表名一致,那么table属性可以省略) 11 *catalog属性:数据库名称,可以省略 12 --> 13 <class name="cn.itheima.domain.Customer" table="cst_customer"> 14 15 <!-- 建立类中的属性与表中的主键的映射 --> 16 <!-- 17 id标签:用来建立类中的属性与表中的主键字段对应 18 *name属性:类中的属性名 19 *column属性:表中字段名(如果类中的属性名和表中字段名一致,那么column属性可以省略) 20 *length属性:字段的长度 21 *type属性:类型。写Java数据类型,Hibernate数据类型(默认),SQL类型 22 --> 23 24 <id name="cust_id" column="cust_id"> 25 <!-- 主键生成策略 --> 26 <generator class="native"></generator> 27 </id> 28 29 <!-- 建立类中普通属性与表中的字段的映射 --> 30 <!-- 31 property标签:用来建立类中的普通属性与表中的字段的对应 32 *name属性:类中的属性名 33 *column属性:表中字段名(如果类中的属性名和表中字段名一致,那么column属性可以省略) 34 *length属性:字段的长度 35 *type属性:类型。写Java数据类型,Hibernate数据类型(默认),SQL类型 36 --> 37 38 <property name="cust_name" column="cust_name"></property> 39 <property name="cust_source" column="cust_source"></property> 40 <property name="cust_industry" column="cust_industry"></property> 41 <property name="cust_level" column="cust_level"></property> 42 <property name="cust_linkman" column="cust_linkman"></property> 43 <property name="cust_phone" column="cust_phone"></property> 44 <property name="cust_mobile" column="cust_mobile"></property> 45 </class> 46 </hibernate-mapping>
6、创建Hibernate的核心配置文件
Hibernate的配置文件主要用来配置数据库连接以及Hibernate运行时所需要的各个属性的值。在src下创建一个名称为hibernate.cfg.xml文件。
在解压过后的Hibernate5目录下,点击project,选择etc文件,打开hibernate.properties,分别查找(Ctrl+f)MYSQL,show,hbm2
1 <?xml version="1.0" encoding="UTF-8"?> 2 <!DOCTYPE hibernate-configuration PUBLIC 3 "-//Hibernate/Hibernate Configuration DTD 3.0//EN" 4 "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd"> 5 <hibernate-configuration> 6 <session-factory> 7 <!-- 8 #hibernate.dialect org.hibernate.dialect.MySQLDialect 9 #hibernate.dialect org.hibernate.dialect.MySQLInnoDBDialect 10 #hibernate.dialect org.hibernate.dialect.MySQLMyISAMDialect 11 #hibernate.connection.driver_class com.mysql.jdbc.Driver 12 #hibernate.connection.url jdbc:mysql:///test 13 #hibernate.connection.username gavin 14 #hibernate.connection.password 15 --> 16 <!-- 数据库驱动 --> 17 <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property> 18 <!-- 数据库URL --> 19 <property name="hibernate.connection.url">jdbc:mysql:///hibernate_day01</property> 20 <!-- 数据库连接用户名 --> 21 <property name="hibernate.connection.username">root</property> 22 <!-- 数据库连接密码 --> 23 <property name="hibernate.connection.password">123456</property> 24 <!-- 数据库方言 25 不同的数据库中,sql语法略有区别. 指定方言可以让hibernate框架在生成sql语句时.针对数据库的方言生成. 26 sql99标准: DDL 定义语言 库表的增删改查 27 DCL 控制语言 事务 权限 28 DML 操纵语言 增删改查 29 注意: MYSQL在选择方言时,请选择最短的方言. 30 --> 31 <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property> 32 33 <!-- #hibernate.show_sql true 34 #hibernate.format_sql true 35 --> 36 <!-- 将hibernate生成的sql语句打印到控制台 --> 37 <property name="#hibernate.show_sql">true</property> 38 <!-- 将hibernate生成的sql语句格式化(语法缩进) --> 39 <property name="#hibernate.format_sql">true</property> 40 41 <!-- 42 ## auto schema export 自动导出表结构. 自动建表 43 #hibernate.hbm2ddl.auto create 自动建表.每次框架运行都会创建新的表.以前表将会被覆盖,表数据会丢失.(开发环境中测试使用) 44 #hibernate.hbm2ddl.auto create-drop 自动建表.每次框架运行结束都会将所有表删除.(开发环境中测试使用) 45 #hibernate.hbm2ddl.auto update(推荐使用) 自动生成表.如果已经存在不会再生成.如果表有变动.自动更新表(不会删除任何数据). 46 #hibernate.hbm2ddl.auto validate 校验.不自动生成表.每次启动会校验数据库中表是否正确.校验失败. 47 --> 48 <property name="hibernate.hbm2ddl.auto">update</property> 49 <!-- 引入orm元数据 50 路径书写: 填写src下的路径 51 --> 52 <mapping resource="cn/itheima/domain/Customer.hbm.xml"/> 53 </session-factory> 54 </hibernate-configuration>
7、书写测试代码
1 package cn.itheima.a_hello; 2 3 import org.hibernate.Transaction; 4 import org.hibernate.Session; 5 import org.hibernate.SessionFactory; 6 import org.hibernate.cfg.Configuration; 7 import org.junit.Test; 8 9 import cn.itheima.domain.Customer; 10 11 //测试Hibernate框架 12 public class Demo { 13 14 @Test 15 //保存客户 16 public void fun1(){ 17 Configuration conf=new Configuration().configure(); 18 19 SessionFactory sessionFactory=conf.buildSessionFactory(); 20 Session session=sessionFactory.openSession(); 21 Transaction tx=session.beginTransaction(); 22 //=============================== 23 Customer c=new Customer(); 24 c.setCust_name("百度公司"); 25 26 session.save(c);//执行保存 27 //=============================== 28 tx.commit(); 29 session.close(); 30 sessionFactory.close(); 31 } 32 }
遇到的问题:
1)报错org.hibernate.boot.MappingNotFoundException: Mapping (RESOURCE) not found : cn.itheima.domain.Custom
该异常为:hibernate的映射找不到异常,即映射资源找不到
修改配置文件的路径(hibernate.cfg.xml中的Customer.hbm.xml文件),这样就可以加载到映射配置文件。
2)报错org.hibernate.exception.GenericJDBCException: could not execute statement
数据库中的表的id属性,设置了主键,但是忘记了将自动递增选项勾上
3)hibernate写入mysql中文乱码
在项目的hibernate的配置文件hibernate.cfg.xml里修改name为“hibernate.connection.url"的property的值为:
运行成功后,表cst_customer中多了一条记录,如下: