Hibernate学习
1. 入门和基本的操作
-
知识点回顾 web 三层架构和 mvc 思想
三层的结构
1. dao层 1. 对于数据库的操作crud 2. service层 3. 控制层(视图层)
mvc的思想
m:代表的是模型
c:代表的是控制器
v:代表的是视图
-
hibernate 的概述
- 什么是框架
- 我们在编写一个程序的时候 我们使用框架可以帮我们简化一部分的操作
- 什么是hibernate
- hibernate是使用在我们三层架构中的层的框架
- 在dao层我们主要实现的是对于数据库的增删改查,我们是使用hibernate的目的,hibernate的底层的代码实际上就是jdbc(封装思想)
- 使用hibernate的好处,需要书写复杂的jdbc的代码,不需要书写很多的sql就可以实现功能(即使有点也是缺点)
- hibernate是一个开源的项目
- 什么是orm
- hibernate使用的是orm思想对于数据库完成crud的操作
- 在javaweb阶段学习的javaBean 他有一种更加正确的叫法 实体类
- orm指的是:对象关系映射
- 让实体类和数据库中的表产生一一对应的关系 实体类中的属性对应数据表中的字段
- 我这个时候就不需要直接操作数据库中的表而是直接操作实体类
- 什么是框架
-
hibernate的入门案例
-
首先我们需要搭建环境
-
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>org.example</groupId> <artifactId>Hibernate_xuexi</artifactId> <version>1.0-SNAPSHOT</version> <dependencies> <dependency> <groupId>org.dom4j</groupId> <artifactId>dom4j</artifactId> <version>2.1.1</version> </dependency> <dependency> <groupId>org.apache.geronimo.specs</groupId> <artifactId>geronimo-jta_1.1_spec</artifactId> <version>1.1.1</version> </dependency> <dependency> <groupId>org.hibernate.common</groupId> <artifactId>hibernate-commons-annotations</artifactId> <version>5.0.4.Final</version> </dependency> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-core</artifactId> <version>5.3.7.Final</version> </dependency> <dependency> <groupId>org.hibernate.javax.persistence</groupId> <artifactId>hibernate-jpa-2.1-api</artifactId> <version>1.0.2</version> </dependency> <dependency> <groupId>org.jboss</groupId> <artifactId>jandex</artifactId> <version>2.0.5.Final</version> </dependency> <dependency> <groupId>org.javassist</groupId> <artifactId>javassist</artifactId> <version>3.23.2-GA</version> </dependency> <dependency> <groupId>org.jboss.logging</groupId> <artifactId>jboss-logging</artifactId> <version>3.3.2.Final</version> </dependency> <dependency> <groupId>antlr</groupId> <artifactId>antlr</artifactId> <version>2.7.7</version> </dependency> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-entitymanager</artifactId> <version>6.0.0.Alpha6</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.45</version> </dependency> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.14</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>1.7.30</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> <version>2.0.0-alpha1</version> </dependency> </dependencies> </project>
-
-
创建实体类
-
package cn.itcast.enpity; public class User { /* Hibernate 要求实体类中有一个唯一的值 (一般是id) */ private int uid; private String userName; private String address; private String password; public int getUid() { return uid; } public String getUserName() { return userName; } public String getAddress() { return address; } public String getPassword() { return password; } public void setUid(int uid) { this.uid = uid; } public void setUserName(String userName) { this.userName = userName; } public void setAddress(String address) { this.address = address; } public void setPassword(String password) { this.password = password; } }
-
-
不需要我们手动的创建数据表hibernate可以帮我们创建数据表
-
需要配置实体类和你的数据表的一一对应的关系(mapping):使用配置文件来实现的
-
创建xml的配置文件
-
创建的位置建议创建在你的实体类的位置创建
-
建议的名字 实体类名称.hbm.xml
-
首先我们需要引入约束
-
配置一对一的关系
-
<?xml version="1.0" encoding="UTF-8" ?> <!-- 引入的是一个公共的基站 名字是"-//Hibernate/Hibernate Mapping DTD 3.0//EN" url地址是:"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> --> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <hibernate-mapping> <!-- name属性值得是:实体类的全路径 table属性:对应的数据表的名字 --> <class name="cn.itcast.enpity.User" table="t_user"> <!-- 配置实体类中的ID和表中的ID相互的对应 hibernate要求实体类中有一个属性作为唯一的一个值 hibernate要求我们表里面的一个字段作为唯一的值 --> <!-- id标签: 属性1 name属性: 实体中id的名字 属性2 column属性: 生成的表中字段的名称 --> <id name="uid" column="uid"> <!-- 需要设置数据库id的增长的策略 native:可以设置为主键和自动增长 --> <generator class="native"></generator> </id> <!-- 配置其他的属性和数据表的对应的关系--> <!-- 属性1 name属性: 实体中id的名字 属性2 column属性: 生成的表中字段的名称 --> <property name="userName" column="user_name"></property> <property name="password" column="password"></property> <property name="address" column="address"></property> </class> </hibernate-mapping>
-
-
-
hibernate的配置文
-
创建Hinernate的核心的配置文件
-
核心配置文件的名称和位置是固定的
-
位置文件的位置必须在src的下面
-
名称必须叫hibernate.cfg.xml
-
hibernate 在加载的过程中只会加载核心的配置文件
-
引入约束
-
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
-
-
主要配置3个方面
- 指定数据库()
- 配置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://49.232.126.85:13306/xzytest</property> <property name="hibernate.connection.username">root</property> <property name="hibernate.connection.password">Devmysql8888!</property> <!-- hibernate的信息(可选)--> <!-- 展示底层的sql语句--> <property name="hibernate.show_sql">true</property> <!-- 对于我们底层的sql语句格式化(知识显示的格式不同)--> <property name="hibernate.format_sql">true</property> <!-- hibernate我们可以配置自动的创建表--> <!-- update 表示的是如果我们已经有了数据表会帮助我们更新数据表 没有数据表他会帮助我们创建数据表 --> <property name="hibernate.hbm2ddl.auto">update</property> <!-- 配置数据库的方言 比如说 limit关键字只可以使用在MySQL中而其他的数据是没有这个关键字的 在oracle中实现分页的关键字是rownumber 让我们hibernate框架识别不同的数据库的特有的语句 --> <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property> <!-- 指定映射文件(必须的)--> <mapping resource="cn/itcast/enpity/User.hbm.xml"></mapping> </session-factory> </hibernate-configuration>
-
测试添加的操作
- 加载核心的配置文件
- 创建一个SessionFactory对象()
- 使用sessionFactory可以创建session对象
- 开启事物(多个操作要不都成功要不都失败)
- 写具体的逻辑实现crud的操作
- 提交事物
- 关闭资源
代码实现:
package cn.itcast.hibernate.test; import cn.itcast.enpity.User; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.Transaction; import org.hibernate.cfg.Configuration; import org.junit.Test; public class HibernateTest { @Test public void test1(){ // 1. 加载核心的配置文件 // 在hibernate中给我们封装了这么一个对象 // 做的事情是这个对象会在src下寻找hibernate.cfg.xml文件 Configuration cfg = new Configuration(); // 调用方法加载配置文件 cfg.configure(); // 2. 创建一个SessionFactory对象() // 读取核心的配置文件,创建sessionFactory对象 // 同时会根据你的映射的关系创建出你的数据表 SessionFactory sessionFactory = cfg.buildSessionFactory(); // 3. 使用sessionFactory可以创建session对象 // 我们可以把这个session对象理解为我们向数据库创建连接 Session session = sessionFactory.openSession(); // 4. 开启事物(多个操作要不都成功要不都失败) Transaction transaction = session.beginTransaction(); // 5. 写具体的逻辑实现crud的操作 //添加的思想 // 创建实体类的对象 User user = new User(); user.setUserName("xxx"); user.setAddress("xxx xxxx"); user.setPassword("zhubajei147258"); // 调用sessio的方法实现添加 session.save(user); // 6. 提交事物 transaction.commit(); // 7. 关闭资源 session.close(); sessionFactory.close(); } }
-
如果插入中文乱码的解决的方法
-
package cn.itcast.dialect; import org.hibernate.dialect.MySQL5Dialect; public class MysqlDialect extends MySQL5Dialect { @Override public String getTableTypeString() { return " ENGINE=InnoDB DEFAULT CHARSET=utf8"; } }
-
-
映射文件需要注意的问题:
1. 文件名和位置没有特殊的要求 2. class标签name属性编写的是全路径 3. id标签和property标签name属性编写的是类的属性 column是可以省略不写的,,默认表的字段=类的属性 4. property标签的type属性表示的是,生成字段的数据类型(这表示你可以手动的指定)
创建实体类的时候hibernate建议我们使用的是包装类 不建议使用基本的数据类型
1. int---Integer 2. cahr--Character 3. 其他的都是首字母大写
为什么使用包装类不用基本数据类型
比如学生什么分数问题 如果我们让分数为0分代表的是个人的考试得到的分数 但是无法表示缺考的 基本数据类型是不可以赋值为null的
-
hibernate的api的使用
创建sessionFactory的过程中是非常的耗费资源的(解决的方法)
-
在hibernate中建议的是在整个项目中只创建1个sessionFactory对象
-
具体的实现
-
创建一个工具类
-
写一个静态的代码块实现
-
静态代码块的特点是类在加载的时候执行(但是只会执行一次)
package cn.itcast.utils; import org.hibernate.SessionFactory; import org.hibernate.cfg.Configuration; public class HibernateSessionFactoryUtils { private static Configuration configure = null; private static SessionFactory sessionFactory =null; //静态代码块实现 static { //加载核心的配置文件 configure = new Configuration().configure(); sessionFactory= configure.buildSessionFactory(); } //提供方法返回sessionFactory public static SessionFactory getSessionFactory() { return sessionFactory; } } ```
-
中文乱码补充解决:
-
<property name="hibernate.dialect">org.hibernate.dialect.MySQL8Dialect</property>
-
session对象
- 类似于jdbc中的connection对象
- 调用session的不同的方法可以实现crud的操作
- 添加的方法(save)
- 修改update
- 删除delete
- 根据id查询 get方法
- …
- session是一个单线程对象(无法共用
-
事物对象中主要有两个操作
- 事物的提交
- 事物的回滚
-
-
-