Hibernate通过对象关系映射,使用持久化类代替传统的sql语句对数据库进行操作(通俗说就是把数据表变成一个实体类来看待和操作)。其中,持久化类可以使用
1.配置对应的hbm.xml(关系映射配置文件)来映射持久化实体类。
2.直接在持久化实体类以注解方式配置。
前期工作:
一、导入Hibernate相关依赖包(包括本人使用的mysql驱动包和c3p0连接池依赖包):
二、创建事例表与数据:
xml配置持久化类:
一、首先,先在Hibernate.cfg.xml配置Hibernate启动相关配置项:
<?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 > <!-- mysql数据库驱动 --> <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property> <!-- mysql数据库名称 --> <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/world</property> <!-- 数据库的登陆用户名 --> <property name="hibernate.connection.username">root</property> <!-- 数据库的登陆密码 --> <property name="hibernate.connection.password">1988419</property> <!-- 配置方言为每一种数据库提供特殊sql适配--> <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property> <!-- c3p0连接池配置 --> <property name="hibernate.connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</property> <!-- 连接池最大连接 --> <property name="hibernate.c3p0.max_size">10</property> <!-- 连接池最小连接 --> <property name="hibernate.c3p0.min_size">1</property> <!-- 连接池超时时长(毫秒) --> <property name="hibernate.c3p0.timeout">5000</property> <!-- 指定连接池最大缓存多少Statment对象 --> <property name="hibernate.c3p0.max_statment">50</property> <!-- 空闲检测周期(毫秒) --> <property name="hibernate.c3p0.idle_test_period">3000</property> <!-- 连接池一次增加的连接数 --> <property name="hibernate.c3p0.acquire_increment">5</property> <!-- 每次都验证连接是否可用 --> <property name="hibernate.c3p0.validate">true</property> <!-- 是否在控制台输出sql语句 --> <property name="hibernate.show_sql">true</property> <!-- 使用xml配置时,指定持久化类xml的路径 --> <mapping resource="org/lcwben/Student.hbm.xml"></mapping> <!-- 使用注解持久化类配置时,指定持久化类.java文件配置 --> <!-- <mapping class="org.lcwben.Student" /> --> </session-factory> </hibernate-configuration>
二、创建持久化实体类:
public class Student { private Integer uid; private String uname; private Date regtime; private Integer status; private Integer score; private Integer classes; //所有成员变量的getter与setter public Integer getUid() { return uid; } public void setUid(Integer uid) { this.uid = uid; } public String getUname() { return uname; } public void setUname(String uname) { this.uname = uname; } public Date getRegtime() { return regtime; } public void setRegtime(Date regtime) { this.regtime = regtime; } public Integer getStatus() { return status; } public void setStatus(Integer status) { this.status = status; } public Integer getScore() { return score; } public void setScore(Integer score) { this.score = score; } public Integer getClasses() { return classes; } public void setClasses(Integer classes) { this.classes = classes; } //。。。。。。。。。。。。。。。。。。。。。。。 }
三、配置关联映射xml
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping> <class name="org.lcwben.Student" table="test_stu"> <!-- 主键使用自增(increment)选项 --> <id name="uid" column="uid"> <generator class="increment"/> </id> <property name="uname"/> <property name="regtime"/> <property name="status"/> <property name="score"/> <property name="classes"/> </class> </hibernate-mapping> 四、JUnit测试 public class Client { private static SessionFactory sf; //利用静态块初始化连接池 static { //用Configuration类初始化hibernate.cfg.xml的配置项 Configuration cfg = new Configuration().configure(); ServiceRegistry sr = new ServiceRegistryBuilder().applySettings(cfg.getProperties()).buildServiceRegistry(); sf = cfg.buildSessionFactory(sr); } //增 @Test public void testCreate() { Session session = null; try { //开启session session = sf.openSession(); //开启事务管理器 session.beginTransaction(); Student stu1 = new Student(); stu1.setUname("hib1"); stu1.setRegtime(new Date()); stu1.setStatus(1); stu1.setScore(75); stu1.setClasses(4); session.save(stu1); //从session对象取出事务管理器,提交事务; session.getTransaction().commit(); } catch (Exception e) { e.printStackTrace(); //出异常时对事务进行事务回滚 session.getTransaction().rollback(); } finally { if(session!=null){ session.close(); } } } //删 @Test public void delete() { Session session = null; try { session = sf.openSession(); session.beginTransaction(); Student stu1 = new Student(); stu1.setUid(12); stu1.setUname("hib1"); stu1.setRegtime(new Date()); stu1.setStatus(1); stu1.setScore(75); stu1.setClasses(4); session.delete(stu1); session.getTransaction().commit(); } catch (Exception e) { e.printStackTrace(); session.getTransaction().rollback(); } finally { if(session!=null) { session.close(); } } } //全量查询 @Test public void selectAll() { Session session = null; List<Student> stus = null; try { session = sf.openSession(); session.beginTransaction(); //注意:HQL中的表名并非数据库中的表名,而是对应映射对象类的类名!!! Query query1 = session.createQuery("from Student"); stus = query1.list(); for (Student stu : stus) { System.out.println(stu.getUid()+" "+stu.getUname()+" "+stu.getRegtime()+" "+stu.getStatus()+" "+stu.getScore()+" "+stu.getClasses()); } } catch (Exception e) { e.printStackTrace(); } finally { if(session!=null) { session.close(); } } } //条件查询 @Test public void selectOne() { Session session = null; try { session = sf.openSession(); Query query = session.createQuery("from Student where uid=:id"); query.setInteger("id", 3); Student stu = (Student)query.uniqueResult(); System.out.println(stu.getUid()+" "+stu.getUname()+" "+stu.getRegtime()+" "+stu.getStatus()+" "+stu.getScore()+" "+stu.getClasses()); } catch (Exception e) { e.printStackTrace(); } finally { if(session!=null) { session.close(); } } } //改 @Test public void update () { Session session = null; try { session = sf.openSession(); session.beginTransaction(); String hql = "update Student set uname=:name where uid=:id"; Query qry = session.createQuery(hql); qry.setString("name", "lcwhbm1"); qry.setInteger("id", 4); qry.executeUpdate(); session.getTransaction().commit(); } catch (Exception e) { e.printStackTrace(); session.getTransaction().rollback(); } finally { if (session!=null) { session.close(); } } } //改 @Test public void update2 () { Session session = null; try { session = sf.openSession(); session.beginTransaction(); /*使用load(持久化类对象, 主键值)的方式直接获得条件所指的对象, * 代替了select... where pk=...的形式,不需要写sql语句就可以实现条件查询的功能。 */ Student stu = (Student)session.load(Student.class, 4); //然后使用持久化类的setter可以对该条数据进行修改! stu.setUname("benhbm2"); session.getTransaction().commit(); } catch (Exception e) { e.printStackTrace(); session.getTransaction().rollback(); } finally { if (session!=null) { session.close(); } } } 以下给出的是selectAll()的查询结果: 三月 08, 2017 2:35:48 下午 org.hibernate.engine.transaction.internal.TransactionFactoryInitiator initiateService INFO: HHH000399: Using default transaction strategy (direct JDBC transactions) 三月 08, 2017 2:35:48 下午 org.hibernate.hql.internal.ast.ASTQueryTranslatorFactory <init> INFO: HHH000397: Using ASTQueryTranslatorFactory Hibernate: select student0_.uid as uid1_0_, student0_.uname as uname2_0_, student0_.regtime as regtime3_0_, student0_.status as status4_0_, student0_.score as score5_0_, student0_.classes as classes6_0_ from test_stu student0_ 1 lcwben1 2017-01-18 00:00:00.0 0 60 1 2 lcwben2 2017-01-18 00:00:00.0 1 67 1 3 lcwben3 2017-01-19 00:00:00.0 1 51 3 4 benhbm2 2017-01-19 00:00:00.0 0 78 3 5 lcwben5 2017-01-19 00:00:00.0 0 80 3 6 lcwben6 2017-01-22 00:00:00.0 1 97 2 7 lcwben7 2017-01-23 00:00:00.0 0 73 1 8 lcwben8 2017-01-25 00:00:00.0 1 48 2 9 lcwben9 2017-01-28 00:00:00.0 1 100 3 10 lcwben10 2017-01-31 00:00:00.0 0 92 3 至于注解式配置持久化类,由于篇幅所限,另开一篇文章( 点击打开链接)。