Hibernate学习2—Hibernate4 CRUD体验初步
接着上一节,工程结构:
jar包没有变化;
一、HibernateUtil 封装:
com.cy.util.HibernateUtil.java:
package com.cy.util; import org.hibernate.SessionFactory; import org.hibernate.boot.registry.StandardServiceRegistry; import org.hibernate.boot.registry.StandardServiceRegistryBuilder; import org.hibernate.cfg.Configuration; public class HibernateUtil { private static final SessionFactory sessionFactory = buildSessionFactory(); private static SessionFactory buildSessionFactory(){ Configuration configuration = new Configuration().configure(); //实例化配置文件,默认指定的就是hibernate.cfg.xml StandardServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder().applySettings(configuration.getProperties()).build();//实例化服务登记,服务注册 return configuration.buildSessionFactory(serviceRegistry); //获取session工厂 } //获取sessionFactory,是单例的 public static SessionFactory getSessionFactory(){ return sessionFactory; } }
二、XML 版CRUD 实现:
对Student类进行xml配置,crud操作;
com.cy.model.student.java:
package com.cy.model; public class Student { private long id; private String name; public long getId() { return id; } public void setId(long id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public String toString() { return "Student [id=" + id + ", name=" + name + "]"; } }
Student.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-mapping package="com.cy.model"> <class name="Student" table="t_student"> <!-- <id>代表主键 类的属性名是id,对应表中列名是stuId --> <id name="id" column="stuId"> <!-- 主键生成策略,这里采用mysql的native,自增 --> <generator class="native"></generator> </id> <!-- 普通属性采用property 不写column,那么数据库table的列名也叫name --> <property name="name"></property> </class> </hibernate-mapping>
com.cy.service.StudentTest.java:--这里是测试类,对Student进行CRUD:
package com.cy.service; import java.util.List; import org.hibernate.Query; import org.hibernate.Session; import org.hibernate.SessionFactory; import com.cy.model.Student; import com.cy.util.HibernateUtil; public class StudentTest { private static SessionFactory sessionFactory = HibernateUtil.getSessionFactory(); //添加学生 private void add(){ Session session = sessionFactory.openSession(); //生成一个session session.beginTransaction(); //开启事务 Student s = new Student(); s.setName("张三"); session.save(s); session.getTransaction().commit(); //提交事务 session.close(); //关闭session } //删除学生 private void delete(){ Session session = sessionFactory.openSession(); session.beginTransaction(); Student student = (Student) session.get(Student.class, 1L); session.delete(student); session.getTransaction().commit(); session.close(); } //更新学生 private void update(){ Session session = sessionFactory.openSession(); session.beginTransaction(); Student student = (Student) session.get(Student.class, 6L); student.setName("张三22"); session.save(student); session.getTransaction().commit(); session.close(); } //查找所有学生 private void getAllStudents(){ Session session = sessionFactory.openSession(); session.beginTransaction(); String hql = "from Student"; Query query = session.createQuery(hql); List<Student> studentList = query.list(); for(Student student : studentList){ System.out.println(student); } session.getTransaction().commit(); session.close(); } public static void main(String[] args) { StudentTest studentTest = new StudentTest(); // studentTest.add(); // studentTest.delete(); // studentTest.update(); studentTest.getAllStudents(); } }
hibernate.cfg.xml中加入Student映射(为了方便后面,也加入了Teacher):
<?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="connection.driver_class">com.mysql.jdbc.Driver</property> <property name="connection.url">jdbc:mysql://localhost:3306/hibernate</property> <property name="connection.username">root</property> <property name="connection.password">root</property> <!-- 方言 --> <property name="dialect">org.hibernate.dialect.MySQL5Dialect</property> <!-- 控制台显示SQL --> <property name="show_sql">true</property> <!-- 自动更新表结构 --> <property name="hbm2ddl.auto">update</property> <mapping resource="com/cy/model/Student.hbm.xml"/> <mapping class="com.cy.model.Teacher"/> </session-factory> </hibernate-configuration>
StudentTest.java运行main函数,结果:
删除:
修改:
查询所有:
三、注解版CRUD 实现
1.注解版CRUD:注解版的很方便,官方也推荐使用;
2.运行测试程序,hibernate会根据映射关系,如有没有表的话,自动创建表。(如果配置了hbm2ddl.auto为update);
这里是对Teacher类进行注解的配置,然后进行CRUD操作:
com.cy.model.Teacher.java:
package com.cy.model; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; import javax.persistence.Table; import org.hibernate.annotations.GenericGenerator; //@Entity代表Teacher是一个映射实体 @Entity @Table(name="t_teacher") public class Teacher { private long id; private String name; //@Id代表id是一个主键 //@GenericGenerator配置主键生成策略 name是起个名字,strategy是具体的策略; //@GeneratedValue配置生成策略为@GenericGenerator的名字 @Id @GeneratedValue(generator="_native") @GenericGenerator(name="_native",strategy="native") public long getId() { return id; } public void setId(long 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类加入hibernate.cfg.xml:
<mapping class="com.cy.model.Teacher"/>
com.cy.service.TeacherTest.java测试代码:
package com.cy.service; import java.util.List; import org.hibernate.Query; import org.hibernate.Session; import org.hibernate.SessionFactory; import com.cy.model.Teacher; import com.cy.util.HibernateUtil; public class TeacherTest { private static SessionFactory sessionFactory = HibernateUtil.getSessionFactory(); //添加老师 private void add(){ Session session = sessionFactory.openSession(); //生成一个session session.beginTransaction(); //开启事务 Teacher s = new Teacher(); s.setName("张三"); session.save(s); session.getTransaction().commit(); //提交事务 session.close(); //关闭session } //删除老师 private void delete(){ Session session = sessionFactory.openSession(); session.beginTransaction(); Teacher Teacher = (Teacher) session.get(Teacher.class, 1L); session.delete(Teacher); session.getTransaction().commit(); session.close(); } //更新老师 private void update(){ Session session = sessionFactory.openSession(); session.beginTransaction(); Teacher Teacher = (Teacher) session.get(Teacher.class, 4L); Teacher.setName("张老师22"); session.save(Teacher); session.getTransaction().commit(); session.close(); } //查找所有老师 private void getAllTeachers(){ Session session = sessionFactory.openSession(); session.beginTransaction(); String hql = "from Teacher"; Query query = session.createQuery(hql); List<Teacher> TeacherList = query.list(); for(Teacher Teacher : TeacherList){ System.out.println(Teacher); } session.getTransaction().commit(); session.close(); } public static void main(String[] args) { TeacherTest TeacherTest = new TeacherTest(); // TeacherTest.add(); // TeacherTest.delete(); // TeacherTest.update(); TeacherTest.getAllTeachers(); } }
测试结果和StudentTest结果差不多,不再说明了。打印出来的语句也基本一样的。