Hibernate ORM初始(入门基础)
使用IDEA开发项目
1.Hibernate是一个开发源代码的对象关系映射框架(ORM);
2.对JDBC进行了轻量级的封装,可以将实体类和数据库中的表产生映射关系;
3.是一个全自动的ORM框架;hibernate能自动生成sql语句;
4.程序猿可以完全按照面向对象的编程思想来操作数据库.
本次使用节点 pom.xml
<?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"> <parent> <artifactId>Mybatis</artifactId> <groupId>cn.Study</groupId> <version>1.0-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion> <artifactId>Hib</artifactId> <packaging>war</packaging> <name>Hib Maven Webapp</name> <!-- FIXME change it to the project's website --> <url>http://www.example.com</url> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <maven.compiler.source>1.7</maven.compiler.source> <maven.compiler.target>1.7</maven.compiler.target> </properties> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.11</version> <scope>test</scope> </dependency> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-core</artifactId> <version>5.2.12.Final</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>javax.transaction</groupId> <artifactId>jta</artifactId> <version>1.1</version> </dependency> <!-- mysql数据库的驱动包 --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.26</version> </dependency> </dependencies> <build> <resources> <resource> <directory>src/main/java</directory> <includes> <include>**/*.xml</include> </includes> </resource> </resources> </build> </project>
使用 hibernate 我们连接mysql是数据库
我们首先进行大配置书写 。
以下是我们本次学习hibernate所需要的头文件配置 一大 一笑 大小配置的命名也有特殊要求
1.hibernate.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"> 2.hbm.xml文件需要的头部信息 <?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.cfg.xml 因为我们在真正使用时,我们实用的类中读取的大配置文件名就是 前面的名字
现在 开始 大配置书写
直接上代码 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-configuration> <session-factory> <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property> <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/test</property> <property name="hibernate.connection.username">root</property> <property name="hibernate.connection.password"></property> <property name="hibernate.show_sql">true</property> <property name="hibernate.format_sql">true</property> <property name="hbm2ddl.auto">update</property> <!--加载需要的hbm.xml文件--> <mapping resource="entity/Teacher.hbm.xml"/> </session-factory> </hibernate-configuration>
前面连接数据库的4个属性我就不说了,
show_sql : 在运行时,控制台展示sql语句 。
format_sql : 让sql展示的好看一点,没用这个的话,就是一行展示,使用之后,显得有层次感一点。
hbm2ddl.auto :就是把xx.hbm.xml文件中的配置生成数据库中DDL(数据定义语言)
create: 每次运行都会删除 上次生成的表,还会创建新的!
update: 没有表会自动创建,有表就增加数据!
validate: 如果hbm文件和数据库中的字段对应 就会新增,否则抛出异常!
create-drop: 每次运行都会删除 上次生成的表,前提是sessionFactory关闭
<mapping resource="entity/Teacher.hbm.xml"/> 这个是连接我们小配置文件的节点 mapping
在写小配置之前,我们先写我们想要的属性,实体类
我就简单的写一个老师类吧。
package entity; /** * Created by 维吉的笔记本 on 2018/5/25. */ public class Teacher { private Integer tid; private String tname; public Integer getTid() { return tid; } public void setTid(Integer tid) { this.tid = tid; } public String getTname() { return tname; } public void setTname(String tname) { this.tname = tname; } }
现在开始我们小配置的书写 。
<?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="entity"> <class name="Teacher" table="teacher"> <id name="tid" column="tid"> <!--主键生成策略--> <generator class="identity"/>
</id> <property name="tname" column="tname"></property> </class> </hibernate-mapping>
<hibernate-mapping package="entity"> 这个是个我们实体类的包
<class name="Teacher" table="teacher"> 类名 表名
<id name="tid" column="tid"> <!--主键生成策略--> <generator class="native"/> </id> 主键名 实体和数据库列名最好相同吧。
<property name="tname" column="tname"></property> name属性
<!--主键生成策略--> <generator class="identity"/> 我一般使用这个 自增
现在开始我们的项目测试
先开一个测试类 。
我们先建个表
Session session = null; Transaction transaction = null; Configuration cfg=new Configuration().configure(); SessionFactory factory=cfg.buildSessionFactory(); @Test public void st(){ session.close(); }
走完这个单侧之后,在你大配置里指定的mysql数据库中,表就应该生成好了吧。
全自动,了解一下
现在开始增删改查吧
save 相当于insert update 就是update delete 就是 删除 记得事务提交 get load 都为拿取单条属性 一个是马上查,一个是使用的时候查询
@Test public void up(){ session=factory.openSession(); transaction=session.beginTransaction(); Teacher teacher=new Teacher(); teacher.setTname("lolo"); session.save(teacher); transaction.commit(); session.close(); } @Test public void upda(){ session=factory.openSession(); transaction=session.beginTransaction(); Teacher teacher=new Teacher(); teacher.setTid(2); teacher.setTname("lwj"); session.update(teacher); transaction.commit(); } @Test public void delete(){ session=factory.openSession(); transaction=session.beginTransaction(); Teacher teacher=new Teacher(); teacher.setTid(1); session.delete(teacher); transaction.commit(); } @Test public void getload(){ session=factory.openSession(); transaction=session.beginTransaction(); Teacher teacher = session.get(Teacher.class, 2); System.out.println("******************"); System.out.println(teacher.getTname()); System.out.println("******************"); Teacher load = session.load(Teacher.class, 2); System.out.println("******************"); System.out.println(load.getTname()); System.out.println("******************"); }
‘ 现在我要开始介绍 查询全部的两个方法
* iterator能够利用懒加载和缓存的机制来提高查询效率!
* 第一条语句就是从数据库中获取所有的id,保存在缓存中,
* 便于下次查询! 只有缓存中不存在数据时,才会去查询数据库!
* iterator使用于开启二级缓存的情况!
// @Test // public void list(){ // List<Teacher> query = session.createQuery("from Teacher").list(); // System.out.println("*****************"); // // for(Teacher te:query){ // System.out.println(te.getTname()); // } // System.out.println("**********"); // } // // @Test // public void Itor(){ // String sl="from Teacher"; // Iterator<Teacher> iterate = session.createQuery(sl).iterate(); // while (iterate.hasNext()){ // Teacher next = iterate.next(); // System.out.println(next.getTname()); // System.out.println("*****"); // } // // }