Java web开发(9)Hibernate使用_a
建立一个Hibernate工程。
普通工程
复制如下jar包,粘贴到工程的一个文件夹下,比如叫lib,然后选中所有jar包,右键,build path-->add to build path
或者建立一个Maven工程,在依赖中添加
<dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-core</artifactId> <version>5.2.17.Final</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.38</version> </dependency>
2关键配置
在src下建立hibernate.cfg.xml文件,里面内容包含连接,可选sql配置,实体类的映射文件
<?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:///数据库名</property> <property name="hibernate.connection.username">root</property> <property name="hibernate.connection.password">123</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> <!-- 配置数据库方言 在mysql里面实现分页 关键字 limit,只能使用mysql里面 在oracle数据库,实现分页rownum 让hibernate框架识别不同数据库的自己特有的语句 --> <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property> <!-- 在hibernate核心配置文件中配置 --> <property name="hibernate.current_session_context_class">thread</property> <!-- 第三部分: 把映射文件放到核心配置文件中 必须的--> <mapping resource="com/entity/User.hbm.xml"/> </session-factory> </hibernate-configuration>
实体类的配置
比如一个实体类,包名com.entity
package com.entity; public class User { private int uid; private String username; private String password; private String address; ...... //getter and setter }
在该包下同时有User.hbm.xml文件
该配置文件制定了类和表,成员变量和数据表列的对应关系。
如何指定主键生成策略。
对于uid类型为String的,使用
<generator class="uuid"></generator>
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <hibernate-mapping> <class name="com.entity.User" table="t_user"> <id name="uid" column="uid"> <generator class="native"></generator> </id> <property name="username" column="username"></property> <property name="password" column="password"></property> <property name="address" column="address"></property> </class> </hibernate-mapping>
简单示例
一个插入操作的所有代码
@Test public void test() { 第一步 加载hibernate核心配置文件 // 到src下面找到名称是hibernate.cfg.xml //在hibernate里面封装对象 Configuration cfg = new Configuration(); cfg.configure(); // 第二步 创建SessionFactory对象 //读取hibernate核心配置文件内容,创建sessionFactory //在过程中,根据映射关系,在配置数据库里面把表创建 SessionFactory sessionFactory = cfg.buildSessionFactory(); // 第三步 使用SessionFactory创建session对象 // 类似于连接 Session session = sessionFactory.openSession(); // 第四步 开启事务 Transaction tx = session.beginTransaction(); // 第五步 写具体逻辑 crud操作 //添加功能 User user = new User(); user.setUsername("Jack"); user.setPassword("123456"); user.setAddress("myaddress"); //调用session的方法实现添加 session.save(user); // 第六步 提交事务 tx.commit(); // 第七步 关闭资源 session.close(); sessionFactory.close(); }
封装和框架
对于SessionFactory,一个项目适宜只有一个对象。Session对象只可以本线程使用。可以如下封装
此时配置中需要设置
<property name="hibernate.current_session_context_class">thread</property>
public class HibernateUtils { static Configuration cfg = null; static SessionFactory sessionFactory = null; //静态代码块实现 static { //加载核心配置文件 cfg = new Configuration(); cfg.configure(); sessionFactory = cfg.buildSessionFactory(); } //提供返回与本地线程绑定的session的方法 public static Session getSessionobject() { return sessionFactory.getCurrentSession(); } //提供方法返回sessionFactory public static SessionFactory getSessionFactory() { return sessionFactory; } }
对于事务的操作框架,代码如下
try { 开启事务 提交事务 }catch() { 回滚事务 }finally { 关闭 }
SessionFactory sf=HibernateUtils.getSessionFactory(); Session session=sf.openSession(); Transaction tx=session.beginTransaction(); try { //具体操作 tx.commit(); }catch(Exception ex) { tx.rollback(); }finally { session.close(); }
基于实体类对象的增删改查
有错误都会抛出异常
//获取session对象,事务对象 //增加(插入) User u=new User(); u.setUsername("jack"); u.setPassword("123"); .. session.save(u); //查询 //使用session的get方法,第一参数是实体类的class,第二个是id User u=session.get(User.class,3); //修改,关键先查询再修改 User u=session.get(User.class,3); u.setName("Tom"); session.update(u); //删除,先查询,再删除 User u=session.get(User.class,3); session.delete(u);
Hibernate相关API操作入门
目标:查询表中所有数据
1.HQL语句
Query query =session.createQuery("from User");
List<User> list=query.list();
2.Criteria对象
Criteria c=session.createCriteria(User.class); List<User> list=c.list();
3.SQLQuery对象
SQLQuery q=session.createSQLQuery("select * from t_user"); q.addEntity(User.class); List<User> list=q.list();