Hibernate笔记(二)

本文介绍了一个使用Hibernate框架进行数据库操作的示例项目,包括配置文件的设置、实体类及映射文件的创建,并通过JUnit测试类实现了对学生表的增删改查功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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


安装好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就可以了。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值