这里使用Idea工具开发,Idea教程:点击打开链接 ,Idea破解:点击打开链接
1.导包(maven)
maven的包从:点击打开链接获取
<!--hibernate--> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-c3p0</artifactId> <version>4.1.12.Final</version> </dependency> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-core</artifactId> <version>4.2.4.Final</version> </dependency> <!--<dependency>--> <!--<groupId>org.hibernate</groupId>--> <!--<artifactId>hibernate-core</artifactId>--> <!--<version>5.2.12.Final</version>--> <!--无ServiceRegistryBuilder方法--> <!--</dependency>--> <dependency> <groupId>org.hibernate.common</groupId> <artifactId>hibernate-commons-annotations</artifactId> <version>4.0.2.Final</version> </dependency> <dependency> <groupId>org.hibernate.javax.persistence</groupId> <artifactId>hibernate-jpa-2.0-api</artifactId> <version>1.0.1.Final</version> </dependency> <!--语法分析器--> <dependency> <groupId>antlr</groupId> <artifactId>antlr</artifactId> <version>2.7.7</version> </dependency> <!--连接池c3p0--> <dependency> <groupId>com.mchange</groupId> <artifactId>c3p0</artifactId> <version>0.9.5.2</version> </dependency> <dependency> <groupId>com.mchange</groupId> <artifactId>mchange-commons-java</artifactId> <version>0.2.11</version> </dependency> <!--dom4j读写xml文件--> <dependency> <groupId>dom4j</groupId> <artifactId>dom4j</artifactId> <version>1.6.1</version> </dependency> <!--Javassist动态字节码生成框架--> <dependency> <groupId>org.javassist</groupId> <artifactId>javassist</artifactId> <version>3.20.0-GA</version> </dependency> <!--日志输出--> <dependency> <groupId>org.jboss.logging</groupId> <artifactId>jboss-logging</artifactId> <version>3.3.0.Final</version> </dependency> <!--事务控制--> <dependency> <groupId>org.jboss.spec.javax.transaction</groupId> <artifactId>jboss-transaction-api_1.2_spec</artifactId> <version>1.0.0.Final</version> </dependency> <!--数据库--> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.38</version> </dependency> <!--测试--> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> </dependency>
2.数据库表NEWS
这里我使用mysql数据库
DROP TABLE IF EXISTS `news`; CREATE TABLE `news` ( `ID` INT (11) NOT NULL AUTO_INCREMENT, `TITLE` VARCHAR (255) DEFAULT NULL, `DATE` date DEFAULT NULL, `AUTHOR` VARCHAR (255) DEFAULT NULL, `CONTENT` text, `PICTURE` LONGBLOB, PRIMARY KEY (`ID`), KEY `news_index` (`TITLE`, `AUTHOR`) ) ENGINE = INNODB AUTO_INCREMENT = 2 DEFAULT CHARSET = utf8;
3.JavaBean类
实体类(对应数据库中的某个表)如:News
package com.hibernate.entity; import java.sql.Blob; import java.util.Date; /** * JavaBean类 * * @author sujinran */ public class News { private Integer id; //编号 private String title;//标题 private String author;//作者 private String desc;//描述 //使用 title + "," + content 可以来描述当前的 News 记录. //即 title + "," + content 可以作为 News 的 desc 属性值 private String content;//内容 private Blob picture;//Blob二进制文件,图片 public Blob getPicture() { return picture; } public void setPicture(Blob picture) { this.picture = picture; } public String getContent() { return content; } public void setContent(String content) { this.content = content; } public String getDesc() { return desc; } public void setDesc(String desc) { this.desc = desc; } private Date date; public Integer getId() { //property return id; } public void setId(Integer id) { this.id = id; } public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } public String getAuthor() { return author; } public void setAuthor(String author) { this.author = author; } public Date getDate() { return date; } public void setDate(Date date) { this.date = date; } public News(String title, String author, Date date) { super(); this.title = title; this.author = author; this.date = date; } public News() { } @Override public String toString() { return "News [id=" + id + ", title=" + title + ", author=" + author + ", date=" + date + "]"; } }
4.映射文件
mapper/News.hbm.xml
Hibernate 配置文件的两个配置项
• hbm2ddl.auto:该属性可帮助程序员实现正向工程, 即由java 代码生成数据库脚本, 进而生成具体的表结构. 。取值create | update | create-drop | validate
– create : 会根据 .hbm.xml 文件来生成数据表, 但是每次运行都会删除上一次的表 ,重新生成表, 哪怕二次没有任何改变
– create-drop : 会根据 .hbm.xml 文件生成表,但是SessionFactory一关闭, 表就自动删除
– update : 最常用的属性值,也会根据 .hbm.xml 文件生成表, 但若 .hbm.xml 文件和数据库中对应的数据表的表结构不同,Hiberante 将更新数据表结构,但不会删除已有的行和列
– validate : 会和数据库中的表进行比较, 若 .hbm.xml 文件中的列在数据表中不存在,则抛出异常
• format_sql:是否将 SQL 转化为格式良好的 SQL . 取值true | false
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <!--对应的javabean包--> <hibernate-mapping package="com.hibernate.entity"> <!--News实体类,NEWS数据库表--> <class name="News" table="NEWS" dynamic-insert="true"> <!--编号--> <id name="id" type="java.lang.Integer"> <column name="ID"/> <!-- 指定主键的生成方式, native: 使用数据库本地方式 --> <generator class="native"/> </id> <!--标题--> <property name="title" not-null="true" unique="true" index="news_index" length="50" type="java.lang.String" column="TITLE"> </property> <!--作者--> <property name="author" type="java.lang.String" index="news_index"> <column name="AUTHOR"/> </property> <!--日期--> <property name="date" type="date"> <column name="DATE"/> </property> <property name="desc" formula="(SELECT concat(title, ',', author) FROM NEWS n WHERE n.id = id)"></property> <!--内容--> <property name="content"> <column name="CONTENT" sql-type="text"></column> </property> <!--图片--> <property name="picture" column="PICTURE" type="blob"></property> </class> </hibernate-mapping>
5.Hibernate 配置
Configuration 类负责管理Hibernate 的配置信息。包括如下内容:
– Hibernate 运行的底层信息:数据库的URL、用户名、密码、 JDBC驱动类,数据库Dialect,数据库连接池等(对应 hibernate.cfg.xml 文件)。
–持久化类与数据表的映射关系( *.hbm.xml 文件)
•创建 Configuration 的两种方式
–属性文件( hibernate.properties) :
• Configuration cfg = new Configuration();
– Xml文件( hibernate.cfg.xml)
• Configuration cfg = new Configuration().configure();
持久化类与 Session 关联起来后就具有了持久化的能力。
• Session 类的方法:
–取得持久化对象的方法: get() load()
–持久化对象都得保存,更新和删除:save(),update(),saveOrUpdate(),delete()
–开启事务: beginTransaction().
–管理 Session 的方法: isOpen(),flush(), clear(), evict(),close()等
代表一次原子操作,它具有数据库事务的概念。所有持久层都应该在事务管理下进行,即使是只读操作。
Transaction tx =session.beginTransaction();
•常用方法:
– commit():提交相关联的session实例
– rollback():撤销事务操作
– wasCommitted():检查事务是否提交
hibernate.cfg.xml
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"> <hibernate-configuration> <session-factory> <!-- 配置连接数据库的基本信息 --> <property name="connection.username">root</property> <property name="connection.password">123456</property> <property name="connection.driver_class">com.mysql.jdbc.Driver</property> <property name="connection.url">jdbc:mysql://127.0.0.1:3306/hibernate</property> <!-- 配置 hibernate 的基本信息 --> <!-- hibernate 所使用的数据库方言不能生成数据库中表 --> <!--<property name="dialect">org.hibernate.dialect.MySQLInnoDBDialect</property>--> <!-- hibernate 所使用的数据库方言,能自动生成数据库表 --> <property name="dialect">org.hibernate.dialect.MySQLDialect</property> <!-- 执行操作时是否在控制台打印 SQL --> <property name="show_sql">true</property> <!-- 是否对 SQL 进行格式化 --> <property name="format_sql">true</property> <!-- 指定自动生成数据表的策略 --> <property name="hbm2ddl.auto">update</property> <!-- 指定关联的 .hbm.xml 文件 --> <mapping resource="mapper/News.hbm.xml"/> </session-factory> </hibernate-configuration>
6.测试
package com.hibernate; import java.sql.Date; import com.hibernate.entity.News; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.Transaction; import org.hibernate.cfg.Configuration; import org.hibernate.service.ServiceRegistry; import org.hibernate.service.ServiceRegistryBuilder; import org.junit.Test; public class HibernateTest { @Test public void test() { System.out.println("test..."); //1. 创建一个 SessionFactory 对象 SessionFactory sessionFactory = null; //1). 创建 Configuration 对象: 对应 hibernate 的基本配置信息和 对象关系映射信息 Configuration configuration = new Configuration().configure(); //2). 创建一个 ServiceRegistry 对象: hibernate 4.x 新添加的对象 //hibernate 的任何配置和服务都需要在该对象中注册后才能有效. ServiceRegistry serviceRegistry = new ServiceRegistryBuilder().applySettings(configuration.getProperties()) .buildServiceRegistry(); //3). sessionFactory = configuration.buildSessionFactory(serviceRegistry); //2. 创建一个 Session 对象 Session session = sessionFactory.openSession(); //3. 开启事务 Transaction transaction = session.beginTransaction(); //4. 执行插入保存操作 News news = new News("Hibernate", "苏大大", new Date(new java.util.Date().getTime())); session.save(news); //5. 提交事务 transaction.commit(); //6. 关闭 Session session.close(); //7. 关闭 SessionFactory 对象 sessionFactory.close(); } }
注:本内容学习了尚硅谷的视频做的笔记