Hibernate笔记一(Hibernate简单配置和操作)

Hibernate


1.什么是Hibernate?

  • Hibernate是一个ORM(Object/Relationship Mapping)框架,即对象关系映射。就是将对象中的属性和数据库中的字段通过映射的关系一一对应起来。它的设计目标是将软件开发人员从大量相同的数据持久层相关编程工作中解放出来。无论是从设计草案还是从一个遗留数据库开始,开发人员都可以采用Hibernate。Hibernate不仅负责从Java类到数据库表的映射(还包括从Java数据类型到SQL数据类型的映射),还提供了面向对象的数据查询检索机制,从而极大地缩短的手动处理SQL和JDBC上的开发时间。

2.Hibernate配置

  • Hibernate核心配置文件
    官方推荐将Hibernate核心配置文件命名为hibernate.cfg.xml,直接放到项目的src目录之下。核心配置文件配置如下:
<?xml version="1.0" encoding="UTF-8"?>
<!--引入xml的约束-->
<!DOCTYPE hibernate-configuration PUBLIC
        "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<!--必须!!!配置session-factory元素,用于在程序中解析该xml-->
<hibernate-configuration>
    <session-factory>
        <!--必须!!!配置数据库的用户名-->
        <property name="connection.username">root</property>
        <!--必须!!!配置数据库的密码-->
        <property name="connection.password">root</property>
        <!--必须!!!配置数据库的url地址-->
        <property name="connection.url">jdbc:mysql:///hibernate?characterEncoding=utf-8</property>
        <!--必须!!!配置连接数据库的驱动-->
        <property name="connection.driver_class">com.mysql.jdbc.Driver</property>
        <!--必须!!!配置方言,让Hibernate在解析该xml文件时知道我们所需操作的数据库类型-->
        <property name="dialect">org.hibernate.dialect.MySQLDialect</property>
        <!--非必须 是否在控制台显示sql语句,默认为false-->
        <property name="show_sql">true</property>
        <!--非必须 是否格式化sql语句,使sql语句更易阅读,默认为false-->
        <property name="format_sql">true</property>
        <!--非必须 是否自动创建数据表,不配置此项表示不自动创建数据表
        update:在程序运行时检测是否有表,若果没有则创建
        create:当程序运行时先删除表,再创建表
        create-drop:当程序运行时创建表,当程序结束时删除表
        validate:当程序运行时检测表字段是否有变化,如果有变化对字段做修改
        -->
        <property name="hbm2ddl.auto">update</property>

        <!--必须!!! 将实体类的映射的xml配置到该xml中,在程序运行时对映射文件进行解析-->
        <mapping resource="com/walter/vo/Student.hbm.xml"/>
    </session-factory>
</hibernate-configuration>
  • 实体类:在使用Hibernate时,实体类推荐的定义方法是:
    • 1.属性私有化;
    • 2.显现定义出无参构造
    • 3.要有标准的getter和setter方法
public class Student {

    private int id;
    private int age;
    private String name;
    private String address;
    private Date birthday;
    public Student() {
        super();
        // TODO Auto-generated constructor stub
    }
    public Student(int age, String name, String address, Date birthday) {
        super();
        this.age = age;
        this.name = name;
        this.address = address;
        this.birthday = birthday;
    }

    public Student(int id, int age, String name, String address, Date birthday) {
        super();
        this.id = id;
        this.age = age;
        this.name = name;
        this.address = address;
        this.birthday = birthday;
    }
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getAddress() {
        return address;
    }
    public void setAddress(String address) {
        this.address = address;
    }
    public Date getBirthday() {
        return birthday;
    }
    public void setBirthday(Date birthday) {
        this.birthday = birthday;
    }   
}
  • 实体类的映射文件:实体类的映射文件命名格式推荐是Person.hbm.xml,即 实体类的类名+.hbm+.xml
<?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-5-17 12:59:18 by Hibernate Tools 3.5.0.Final -->
<!--必须
    可以有package属性,其属性值是准备映射的实体类所在的包名
-->
<hibernate-mapping>
    <!--
        class指定实体类:
            name:如果 hibernate-mapping 标签中定义了package属性,则这里的那么只需填写实体类的类名;如果hibernate-mapping标签总没有定义package,则这里的name要是实体类的包名+类名
            table:可省略。如果不写,则以实体类的类名生成数据库的表名;如果写了,则生成的表名是table的属性值
    -->
    <class name="com.walter.vo.Student" table="STUDENT">
        <!--
            id标签中定义表的主键
            name:指定表的主键是实体类中的那个属性,其值必须为实体类的属性
            type:可省略。指定该字段在数据库中的类型,如果不写,Hibernate自动判断类型。注意该类型指的是在Java中的数据类型而不是数据库中的数据类型
            column:可省略。定义该属性在数据库表中的字段名,如果不写以该属性名作为其在表中的字段名
            generator:主键生成策略。此时的主键生成策略是自增长
        -->
        <id name="id" type="int" >
            <column name="ID" />
            <generator class="native" />
        </id>
        <property name="age" type="int">
            <column name="AGE" />
        </property>
        <!--
            not-null:可省略。非空约束;默认为false,可以为空;当为true时,不能为空
            unique:可省略。唯一约束;默认为false,不唯一;当为true时,唯一,不能重复
        -->
        <property name="name" type="java.lang.String" not-null="true">
            <column name="NAME" />
        </property>
        <property name="address" type="java.lang.String">
            <column name="ADDRESS" />
        </property>
        <!--
            对于时间格式的属性,type默认是datetime
        -->
        <property name="birthday" type="date">
            <column name="BIRTHDAY" />
        </property>
    </class>
</hibernate-mapping>

3.Hibernate的简单使用

  • 定义工具类
    public class HibernateUtil {

    private static SessionFactory sessionFactory;
    static {
        Configuration configuration = new Configuration();
        // 加载Hibernate核心配置文件并解析
        configuration.configure();
        //获取session工厂对象
        sessionFactory = configuration.buildSessionFactory();
    }
    /**
     * 获取工厂对象
     * @return
     */
    public static SessionFactory getSessionFactory() {
        return sessionFactory;
    }
    /**
     * 获取session对象
     * @return
     */
    public static Session getSession() {
        return sessionFactory.openSession();
    }
    /**
     * 关闭session对象
     * @param s
     */
    public static void close(Session s) {
        if (s != null)
            s.close();
    }
  • 测试
public class StudentTest {

    private Session session;
    private Transaction transaction;

    /**
     * 创建session对象,开启事务
     */
    @Before
    public void init() {
        session = HibernateUtil.getSession();
        transaction = session.beginTransaction();
    }
    /**
     * 提交事务,关闭session对象
     */
    @After
    public void distroy() {
        transaction.commit();
        HibernateUtil.close(session);
    }
    /**
     * 添加学生
     */
    @Test
    public void testSaveStudent() {
        Student student = new Student(10, "李四", "北京", new Date());
        session.save(student);

    }
    /**
     * 查询所有学生信息
     */
    @Test
    public void testQueryAll(){
        List<Student> students = session.createQuery("from Student").list();
        System.out.println(students);
    }
    /**
     * 根据id查询学生信息
     */
    @Test
    public void testQueryById(){
        System.out.println(session.get(Student.class, 1));
    }
    /**
     * 根据id修改学生信息
     */
    @Test
    public void testUpdate(){
        Student student = new Student(1,10, "王五", "上海", new Date());
        session.update(student);
    }
    @Test
    /**
     * 根据id删除学生信息
     */
    public void testDelById(){
        Student student = new Student(2);
        session.delete(student);
    }
}

从测试的情况我们可以看出,Hibernate使我们的开发不用再书写繁琐的sql语句,而是针对对象进行编程。从这也可以看出Hibernate确实减轻了我们开发人员不少工作量。以上只是对Hibernate基本的介绍和操作。针对Hibernate对表与表之间的关联在以后的笔记中进行讲解。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

记忆旅途

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值