------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥-------------
本笔者使用的是Idea+mysql+maven做Hibernate的博客,本篇及其以后都是如此!
首先写好思路和流水,我说一下会讲什么:
1.pom节点:jar包的引用;
1.1包括如何在不是resource的其他地方编译xml文件
2.核心配置文件hibernate.cfg.xml书写
2.1核心配置文件中的表生成策咯
2.2jdbc的四要素
2.3如何关联小配置文件**.hbm.xml
2.4在控制台展示sql语句与格式化sql语句
3.实体类的创建
4.小配置**.hbm.xml的配置书写
4.1主键生成策咯
4.2实体类和数据表如何映射
5.书写单测增删改
5.1事务环境的运行
话不多少,开始案例:
一,创建maven项目;
1.引入jar包,此处较长,合起来了
<!--单元测试--> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>test</scope> </dependency> <!--Hibernate的核心jar--> <!-- https://mvnrepository.com/artifact/org.hibernate/hibernate-core --> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-core</artifactId> <version>5.2.12.Final</version> </dependency> <!--jta 事务的api--> <!-- https://mvnrepository.com/artifact/javax.transaction/jta --> <dependency> <groupId>javax.transaction</groupId> <artifactId>jta</artifactId> <version>1.1</version> </dependency> <!-- 添加Log4J依赖 --> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.16</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-nop</artifactId> <version>1.6.4</version> </dependency> <!-- 添加javassist --> <dependency> <groupId>javassist</groupId> <artifactId>javassist</artifactId> <version>3.12.0.GA</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>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.39</version> </dependency>
2.使非resource下面的xml参与编译
<build> <resources> <resource> <directory>src/main/java</directory> <includes> <include>**/*.xml</include> </includes> </resource> </resources> </build>
二.核心配置文件hibernate.cfg.xml书写
配置了hbm2ddl.auto的话甚至连数据库的表都无需自己创建,只要一个实体类,自动创建数据库的表
<?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> <!--jdbc连接四要素--> <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property> <property name="hibernate.connection.url">jdbc:mysql:///y2167</property> <property name="hibernate.connection.username">root</property> <property name="hibernate.connection.password"></property> <!--在控制台上展示sql--> <property name="show_sql">true</property> <!--格式化sql--> <property name="format_sql">true</property> <!--====================================================================--> <!--ddl操作生成策咯,每次运行都在原有表上修改,没有的话就创建表--> <!-- <property name="hbm2ddl.auto"></property> key - hbm2ddl.auto:自动生成表结构策略 value - update(使用最多):当数据库不存在表时,hibernate启动后会自动生成表结构。 当数据库表存在时,如果一样,则只会写入数据,不会改变表结构。 当数据库表存在时,如果不一样,则会修改表结构,原有的表结构不会改变。 create(很少):无论表结构是否存在,hibernate启动后都会重新生成表结构。(造成之前的数据丢失) create-drop(极少):无论表结构是否存在,hibernate启动都会重新生成表结构。并且hibernate关闭后,表结构会被删除。来无影去无踪。 validate(很少):不会创建表结构,不会修改表结构。校验与数据库中的表结构是否一样,如果不一样则报异常。 --> <property name="hbm2ddl.auto">update</property> <!--与小配置文件映射--> <mapping resource="cn/dawn/day01/dao/Teacher.hbm.xml"></mapping> </session-factory> </hibernate-configuration>
三,实体类的创建:
此处需要注意的是属性要使用封装类,因为封装类实现了Serializable接口,再举例说明,Interge允许空值,int不行,封装类有更多的功能(方法)
构造也是值得注意的,最好保留一个无参构造,(血泪教训)
package cn.dawn.day01.entity; /** * Created by Dawn on 2018/5/25. */ /*实体*/ public class Teacher { private Integer id; private String name; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public String toString() { return "Teacher{" + "id=" + id + ", name='" + name + '\'' + '}'; } }
四,小配置Teacher.hbm.xml
值得注意的是:1.主键生成策咯,2.导入的包名
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="cn.dawn.day01.entity"> <!--如果上面指定package的话,class的name就不必写全类名--> <!--lazy:是否懒加载(延迟加载) 默认值是true,延迟加载--> <!--<class name="Teacher">--> <!--直接加载--> <class name="Teacher"> <!--主键--> <id name="id" column="tid"> <!--主键生成策咯 assigned程序员自己创建--> <!--identity是mysql里的自增,一会做增加操作不必再给主键赋值--> <!--increment是先查最大的主键列,在下一条给主键加一--> <!--sequence是oracle的主键生成策咯,他一会需要指定序列名字<param name="sequence">序列名</param>--> <generator class="assigned"></generator> </id> <property name="name" column="name"></property> </class> </hibernate-mapping>
五,书写测试类
1.先写@Before的代码,需要在执行单测前创建事务对象和Session对象
package cn.dawn.day01; import cn.dawn.day01.entity.Teacher; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.Transaction; import org.hibernate.cfg.Configuration; import org.junit.After; import org.junit.Before; import org.junit.Test; /** * Created by Dawn on 2018/5/25. */ public class Test0120180525InsertDeleteUpdate { /*事物*/ Transaction tr=null; /*session*/ Session session=null; /*在执行之前加载配置,运行事物*/ @Before public void beforeTest(){ /*加载hibernate核心*/ Configuration cfg=new Configuration().configure(); /*创建session工厂*/ SessionFactory sessionFactory=cfg.buildSessionFactory(); /*创建session*/ session = sessionFactory.openSession(); /*创建事物*/ tr = session.beginTransaction(); } }
2.创建@After的方法,用于单测结束后提交事务和关闭Session对象
/*在执行之后,提交事物,关闭session*/ @After public void afterTest(){ /*提交事物*/ tr.commit(); /*关闭session*/ session.close(); }
3.增:根据不同的主键生成策咯,它的新增写法不同
如果是identity就无需往对象set主键id值
如果是assigned则需要程序员自己创建,必须给set主键值,否者抛异常
/*Demo01最简单的Hibernate例子,做一下添加操作*/ public void t1InsertDemo(){ System.out.println("----------------------------------"); /*创建一个对象*/ Teacher teacher=new Teacher(); teacher.setId(1); teacher.setName("孟六"); /*调用执行*/ session.save(teacher); System.out.println("----------------------------------"); }
4.改:会根据您传进来的主键值改其他属性
@Test /*Demo01最简单的Hibernate例子,做一下添加操作*/ public void t1InsertDemo(){ System.out.println("----------------------------------"); /*创建一个对象*/ Teacher teacher=new Teacher(); teacher.setId(1); teacher.setName("孟六"); /*调用执行*/ session.save(teacher); System.out.println("----------------------------------"); }
5.删除:只需要一个有主键id的对象,就可以删除您表中的对应的记录
@Test /*删除*/ public void t2DeleteDemo(){ System.out.println("----------------------------------"); Teacher teacher=new Teacher(); teacher.setId(1); session.delete(teacher); System.out.println("----------------------------------"); }
作者:晨曦Dawn
转载请注明出处:https://www.cnblogs.com/DawnCHENXI/p/9090482.html
如有错误,请指出,感激不尽!!!!!!!!!!!!!!!!!