美文网首页
hibernate学习(一)

hibernate学习(一)

作者: 咻咻咻i | 来源:发表于2017-08-17 13:37 被阅读0次

    javaWeb学习已经有一段时间了,最开始接触的mvc框架是struts2,不过也并没有系统化的学过这个框架,只是跟着老师过了一遍流程,会简单的使用。现在已经使用struts2配合DBUtils写了两个小小的项目。ssh既然放在一起肯定还是一起用的比较方便,现在开始学习hibernate。额,可能是有点老了,但还是要学学,听说要简单基础点、、、

    hibernate入门

    • 建立工程,导入jar包。
      在hibernate包中的lib文件夹里都是jar包,很多还没接触,不过required文件夹下的是必须的,我用的最新5.2的版本,直接将这些jar和jdbc那个连接数据库的包导入就能用了。还有些包log4j-api-*.jar slf4j-api-*.jar slf4j-log4j12-*.jar这几个是用来提供日志输出的。导入完毕开始写配置敲代码。我滴个,一共十几个包,实话真麻烦。
    • 核心配置
      就是设置各种各样的参数啥的也是麻烦的很。以下是份基础的配置,必须放在src下面,文件名必须是hibernate.cfg.xml
    <?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>
            <!-- 必须属性 -->
            <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
            <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/hiber</property>
            <property name="hibernate.connection.username">root</property>
            <property name="hibernate.connection.password">root</property>
            <!-- hibernate信息 可选属性 -->
            <property name="hibernate.dialect">org.hibernate.dialect.MySQL5InnoDBDialect</property> <!-- 兼容不同数据库的特殊语句 -->
            <property name="hibernate.hbm2ddl.auto">update</property> <!-- 自动创建数据表 常用update -->
            <property name="hibernate.show_sql">true</property> <!-- 显示sql语句日志 -->
            <property name="hibernate.format_sql">true</property> <!-- 格式化sql语句日志 -->
            <!-- 映射文件所在的位置 -->
            <!-- mapping class="cn.lkangle.entity.User"/--> <!-- 使用注释配置 -->
            <mapping resource="cn/lkangle/entity/user.hbm.xml"/>
        </session-factory>
    
    </hibernate-configuration>
    
    • 映射配置
    1. 第一种
      将创建的数据类逐一的和数据库映射起来
      先是数据类
    package cn.lkangle.entity;
    
    public class User {
        private int uid;
        private String name;
        private String pass;
        public int getUid() {
            return uid;
        }
        public void setUid(int uid) {
            this.uid = uid;
        }
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        public String getPass() {
            return pass;
        }
        public void setPass(String pass) {
            this.pass = pass;
        }
    }
    

    hibernate的映射配置文件,这个位置没要求,但一般和类放在一起

    <?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="cn.lkangle.entity.User" table="user">
            <id name="uid" column="id"> <!-- 唯一的id键 -->
                <generator class="native"></generator>  <!-- 常用属性 设置自动增长 -->
            </id>
            <property name="name" column="name"></property>  <!-- name是类中变量名 column是要建立的字段名 一般和变量名一样 -->
            <property name="pass" column="pass"></property>
        </class>
    </hibernate-mapping>
    
    1. 使用注释进行映射配置
    package cn.lkangle.entity;
    
    import javax.persistence.Column;
    import javax.persistence.Entity;
    import javax.persistence.GeneratedValue;
    import javax.persistence.Id;
    import javax.persistence.Table;
    
    @Entity
    @Table(name="user")  // 与数据库表名映射
    public class User {
        @Id@GeneratedValue  // 规定主键 设置主键规则为默认规则 自动增长
        int uid;
        @Column  // 设置字段与属性映射 默认字段与属性名相同
        String name;
        @Column(name="upass") // 自定义设置字段名
        String pass;
        
        public int getUid() {
            return uid;
        }
        public void setUid(int uid) {
            this.uid = uid;
        }
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        public String getPass() {
            return pass;
        }
        public void setPass(String pass) {
            this.pass = pass;
        }
    }
    

    注解配置中主键设置为自动增长规则并非真的自增,而是通过添加新字段记录下一个值实现自增。别的规则没试过...

    • 写代码测试
      终于可以写代码了,配置了一圈的xml文件真是麻烦,没办法想学还就是要一点点配置,还要弄懂才好。以下是一份简单的测试代码,七步走~~
    package cn.lkangle.dao;
    
    import org.hibernate.Session;
    import org.hibernate.SessionFactory;
    import org.hibernate.Transaction;
    import org.hibernate.cfg.Configuration;
    import org.junit.Test;
    
    import cn.lkangle.entity.User;
    
    public class HbmDao {
        @Test
        public void hbmTest() {
            // 1、 加载hibernate.cfg.xml配置文件
            Configuration cfg = new Configuration();
            cfg.configure();
            // 2、 创建SessionFactory对象 在这里会根据配置文件映射关系自动创建数据表
            SessionFactory sf = cfg.buildSessionFactory();
            // 3、 使用SessionFactory创建Session对象
            Session session = sf.openSession();
            // 4、 手动开启事务
            Transaction ts = session.beginTransaction();
            // 5、 具体逻辑 crud操作
            User user = new User();
            user.setName("lee");
            user.setPass("123456");
            session.save(user);
            // 6、 提交事务
            ts.commit();
            // 7、 关闭资源
            session.close();
            sf.close();
        }
    }
    
    • 单元测试
      运行,这是控制台输出这样一串信息就说明成功了~~~
    Hibernate: 
        
        create table user (
           id integer not null auto_increment,
            name varchar(255),
            pass varchar(255),
            primary key (id)
        ) engine=InnoDB
    Hibernate: 
        insert 
        into
            user
            (name, pass) 
        values
            (?, ?)
    
    

    先创建了表,又插入了值,方便。

    • 所遇问题
      第一次用并没有真的成功,不能自动创建表,百度一圈后找到原因。核心配置里的数据库方言选择错误。
      我使用的是mysql5.3的版本,而mysql 5.0之前和之后是不一样的。

      5.0以前的Hibernate 方言是: org.hibernate.dialect.HSQLDialect
      5.0以后的Hibernate 方言是: org.hibernate.dialect.MySQL5InnoDBDialect
      还可以根据版本自动设置:<property name="hibernate.dialect">${dialect}</property>

      5.0之前的我没有测试,后两个是了确实没问题

    刚刚接触hibernate 简单记录下

    相关文章

      网友评论

          本文标题:hibernate学习(一)

          本文链接:https://www.haomeiwen.com/subject/ltxgrxtx.html