Hibernate笔记(二)

来源:互联网 发布:淘宝一元抢购在哪里 编辑:程序博客网 时间:2024/05/28 05:14

努力是最不值得炫耀的,只要有了渴望和意愿,人人都会。


安装好hibernate tools之后,写个使用hibernate对数据库表实现增删改查的demo(新建项目并导入hibernate、mysql、junit的jar包就不用说了吧)

1. 创建hibernate配置文件(怎么创建就不用说了吧,用hibernate tools自动生成或者在别的地方复制一份过来),即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"><hibernate-configuration>    <session-factory>        <!-- 数据库连接信息 -->        <property name="connection.driver_class">com.mysql.jdbc.Driver</property>        <property name="connection.url">jdbc:mysql:///hibernate?useUnicode=true&amp;characterEncoding=UTF-8</property>        <property name="connection.username">root</property>        <property name="connection.password">123456</property>        <!-- 方言 -->        <property name="dialect">org.hibernate.dialect.MySQLDialect</property>        <!-- 打印SQL语句 -->        <property name="show_sql">true</property>        <!-- 格式化SQL语句 -->        <property name="format_sql">true</property>        <!--ddl语句生成策略  save自动创建数据库并覆盖以前的  update更新不会覆盖以前的-->        <property name="hbm2ddl.auto">update</property>        <!-- 创建数据库时 给表加上前缀 -->        <!-- <property name="default_schema">hibernate</property> -->        <!-- 使用getCurrentSession时的事物配置 thread本地事务(jdbc事务) 全局事务(jta事务)-->        <!-- <property name="current_session_context_class">thread</property> -->        <mapping resource="com/hibernate/bean/Student.hbm.xml"/>    </session-factory></hibernate-configuration>

注意:配置文件中的mapping是在步骤二完成后才写入的
2. 创建数据库表的实体类和对应的hibernate mapping文件
学生类实体:

public class Student {    private int sid;//ID    private String sname;//姓名    private String gender;//性别    private Date birthday;//出生日期    private String address;//地址    private Blob picture;//照片    public Student() {    }    public Student(int sid, String sname, String gender, Date birthday, String address) {        this.sid = sid;        this.sname = sname;        this.gender = gender;        this.birthday = birthday;        this.address = address;    }    public int getSid() {        return sid;    }    public void setSid(int sid) {        this.sid = sid;    }    public String getSname() {        return sname;    }    public void setSname(String sname) {        this.sname = sname;    }    public String getGender() {        return gender;    }    public void setGender(String gender) {        this.gender = gender;    }    public Date getBirthday() {        return birthday;    }    public void setBirthday(Date birthday) {        this.birthday = birthday;    }    public String getAddress() {        return address;    }    public void setAddress(String address) {        this.address = address;    }    public Blob getPicture() {        return picture;    }    public void setPicture(Blob picture) {        this.picture = picture;    }    @Override    public String toString() {        return "Student [sid=" + sid + ", sname=" + sname + ", gender=" + gender + ", birthday=" + birthday                + ", address=" + address + "]";    }}

学生类的hibernate映射文件:

<?xml version="1.0"?><!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN""http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"><!-- Generated 2017-6-23 16:17:40 by Hibernate Tools 3.5.0.Final --><hibernate-mapping>    <class name="com.hibernate.bean.Student" table="STUDENT">        <id name="sid" type="int">            <column name="SID" />            <generator class="assigned" />        </id>        <property name="sname" type="java.lang.String">            <column name="SNAME" />        </property>        <property name="gender" type="java.lang.String">            <column name="GENDER" />        </property>        <property name="birthday" type="java.util.Date">            <column name="BIRTHDAY" />        </property>        <property name="address" type="java.lang.String">            <column name="ADDRESS" />        </property>        <property name="picture" type="java.sql.Blob">            <column name="PICTURE" />        </property>    </class></hibernate-mapping>

3. 写测试类
新建一个StudentTest类,使用junit的三个方法注解@Before、@Test、@After。新建初始化、运行、销毁三个方法(使用hibernate的代码可能根据使用的hibernate版本有些细微差别,这里使用的是hibernate4.2.4的版本,如果你使用最新的hibernate版本创建服务注册对象的代码就会报错,可以根据代码提示进行修改)

public class StudentTest {    private SessionFactory sessionFactory;    private Session session;    private Transaction transaction;    @Before    public void init(){        //创建配置对象  读取配置文档Hibernate.cfg.xml        Configuration config = new Configuration().configure();        //创建服务注册对象        ServiceRegistry serviceRegistry = new ServiceRegistryBuilder().applySettings(config.getProperties()).buildServiceRegistry();        //创建回话工厂对象 创建和注销都比较耗费资源        sessionFactory = config.buildSessionFactory(serviceRegistry);        //打开会话  操作数据库的对象        session = sessionFactory.openSession();        //开启事务        transaction = session.beginTransaction();    }    @Test    public void saveStudentTest(){    }    @After    public void destory(){        transaction.commit();//提交事物        session.close();//关闭会话        sessionFactory.close();//关闭会话工厂    }}

4. 保存对象
编辑一下saveStudentTest()方法的内容

/**     * 保存学生对象     */    @Test    public void saveStudentTest(){        Student stu = new Student(1,"张三","男",new Date(),"武汉");        session.save(stu);    }

执行一下这个方法,可以看到控制台打印了执行的sql语句
这里写图片描述
再看数据库,数据已经成功插入学生表
这里写图片描述
5. 依次加上查询、修改、删除的方法

/**     * 查询     * get在调用之后立即向数据库发出sql语句,返回持久化对象     * 查询数据不存在 返回null     */    @Test    public void testGetStudents(){        Student s= (Student) session.get(Student.class, 1);        System.out.println(s);    }    /**     * 查询     * load方法会在调用后返回一个代理对象     * 该代理对象之保存了实体对象的id,直到使用对象的非主键属性时才会发出sql语句     * 查询数据不存在 抛出异常     */    @Test    public void testLoadStudent(){        Student s = (Student) session.load(Student.class, 1);        System.out.println(s);    }    /**     * 修改     */    @Test    public void testUpdateStudent(){        Student s= (Student) session.get(Student.class, 1);        s.setGender("女");        session.update(s);        System.out.println(s.toString());    }    /**     * 删除     */    @Test    public void testDeleteStudent(){        Student s= (Student) session.get(Student.class, 1);        session.delete(s);    }

查询要注意get和load的区别,另外执行下面方法可能会报错,因为配置文件里面的ddl语句生成策略配置的create,每次都会覆盖原来的表导致表数据总是空的,我们把create换成update就可以了。