文档章节

Hibernate基础

菰單
 菰單
发布于 2017/08/08 14:32
字数 1716
阅读 14
收藏 2

1. ORM映射:Object Relational Mapping

        * O:面向对象领域的Object(JavaBean对象)

        * R:关系数据库领域的Relational(表的结构)

        * M:映射Mapping(XML的配置文件)

2. 简单一句话:Hibernate使程序员通过操作对象的方式来操作数据库表记录

1. 优点

        * Hibernate对JDBC访问数据库的代码做了封装,大大简化了数据访问(持久层)层繁琐的重复性代码

        * Hibernate是一个基于jdbc的主流持久化框架,是一个优秀的orm实现,它很大程度的简化了dao层编码工作

        * Hibernate的性能非常好,因为它是一个轻量级框架。映射的灵活性很出色。它支持很多关系型数据库,从一对一到多对多的各种复杂关系

 

-- 准备数据库

create database hibernate_day01;

-- 准备用户表

CREATE TABLE `sys_user` (

  `user_id` bigint(32) NOT NULL AUTO_INCREMENT COMMENT '用户id',

  `user_code` varchar(32) NOT NULL COMMENT '用户账号',

  `user_name` varchar(64) NOT NULL COMMENT '用户名称',

  `user_password` varchar(32) NOT NULL COMMENT '用户密码',

  `user_state` char(1) NOT NULL COMMENT '1:正常,0:暂停',

  PRIMARY KEY (`user_id`)

) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

//JavaBean(O)

public class User {

   

   private Long userId; //尽量使用包装类型,因为这个类型可以判空,'用户id

   private String userCode;//用户账号

   private String userName;//用户名称

   private String userPassword;//用户密码

   private String userState;//用户状态

}

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE hibernate-mapping PUBLIC

    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"

    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">

   

<hibernate-mapping>

   <!--

      class标签: 确立 类与表的关系

          name: 写的类的全名

          table:写的是数据库表的名称

    -->

   <class name="cn.itcast.a_helloworld.User" table="sys_user">

      <!-- 主键属性 -->

      <id name="userId" column="user_id">

          <!-- 主键的生成策略 : native:代表数据库的自增长策略-->

          <generator class="native"></generator>

      </id>

      <!-- 普通属性 -->

      <property name="userCode" column="user_code"></property>

      <property name="userName" column="user_name"></property>

      <property name="userPassword" column="user_password"></property>

      <property name="userState" column="user_state"></property>

   

   </class>

</hibernate-mapping>

<?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>

    <!-- 配置一个SessionFactory -->

<session-factory>

    <!-- 1、必须配置

    -->

    <property name="hibernate.connection.driver_class">

         com.mysql.jdbc.Driver

    </property>

    <property name="hibernate.connection.url">

         jdbc:mysql://localhost:3306/hibernate_day01

    </property>

    <property name="hibernate.connection.username">root</property>

    <property name="hibernate.connection.password">passw0rd</property>

    <!-- 方言的配置 -->

    <property name="hibernate.dialect">

         org.hibernate.dialect.MySQL5Dialect

    </property>

    <!-- 2、可选配置 -->

    <!-- 3、映射配置 -->

    <mapping resource="cn/itcast/a_helloworld/User.hbm.xml" />

</session-factory>

</hibernate-configuration>

public class Demo1 {

    

    /**

     * hibernate的入门程序

     */

    @Test

    public void test1(){

         

         /*

          * 1、读取配置文件

          * 2、创建SessionFactory接口

          * 3、打开session

          * 4、开启事务

          * 5、保存对象

          * 6、提交事务

          * 7、关闭资源(释放)

          */

         

         //准备对象

         User u = new User();

//       u.setUserId(userId);//已经配置了自增长策略,不需要我们赋值

         u.setUserCode("h888");

         u.setUserName("小泽");

         u.setUserPassword("123456");

         u.setUserState("0");

         

         //1、读取配置文件

         Configuration config = new Configuration();

         config.configure();//这步不能少,这里才是去读取核心配置文件:hibernate.cfg.xml

         //2、创建SessionFactory接口

         SessionFactory factory = config.buildSessionFactory();

         //3、打开session: 这个跟javaweb中的httpSession不一样,这里的session是完成数据库增删改查的关键

         Session session = factory.openSession();

         //4、开启事务: Transaction 接口完成事务

         Transaction tx = session.beginTransaction();

         //5、保存对象

         session.save(u);

         //6、提交事务

         tx.commit();

         //7、关闭资源(释放)

         session.close();

         factory.close();//这里先关闭,演示的效果,后续的开发中,这个工厂不要关闭

         

         

         System.out.println("用户保存成功......");

    }

}

这个错误是因为我们密码配置写错了: hibernate.cfg.xml

如果没有导入驱动包,会报上述的错误

如果映射文件没有写入hibernate.cfg.xml中就会报这个错

如果映射文件中写错,会报上面错误

<hibernate-configuration>

    <!-- 配置一个SessionFactory -->

<session-factory>

    <!-- 1、必须配置

    -->

    <property name="hibernate.connection.driver_class">

         com.mysql.jdbc.Driver

    </property>

    <property name="hibernate.connection.url">

         jdbc:mysql://localhost:3306/hibernate_day01

    </property>

    <property name="hibernate.connection.username">root</property>

    <property name="hibernate.connection.password">passw0rd</property>

    <!-- 方言的配置 -->

    <property name="hibernate.dialect">

         org.hibernate.dialect.MySQL5Dialect

    </property>

    <!-- 2、可选配置 -->

    <!-- 3、映射配置 -->

    <mapping resource="cn/itcast/a_helloworld/User.hbm.xml" />

</session-factory>

</hibernate-configuration>

<!-- 3、映射配置 -->

<mapping resource="cn/itcast/a_helloworld/User.hbm.xml" />

<hibernate-mapping>

    <!--

         class标签: 确立 类与表的关系

             name: 写的类的全名

             table:写的是数据库表的名称

     -->

    <class name="cn.itcast.a_helloworld.User" table="sys_user">

         <!-- 主键属性 -->

         <id name="userId" column="user_id">

             <!-- 主键的生成策略 : native:代表数据库的自增长策略-->

             <generator class="native"></generator>

         </id>

         <!-- 普通属性 -->

         <property name="userCode" column="user_code"></property>

         <property name="userName" column="user_name"></property>

         <property name="userPassword" column="user_password"></property>

         <property name="userState" column="user_state"></property>

         <!-- 临时字段添加,演示的是维护表结构:update -->

         <property name="tempStr" column="user_temp"></property>

         

    

    </class>

</hibernate-mapping>

<hibernate-mapping>

    <!--

         class标签: 确立 类与表的关系

             name: 写的类的全名

             table:写的是数据库表的名称

     -->

    <class name="cn.itcast.a_helloworld.User"  >

         <!-- 主键属性 -->

         <id name="userId" >

             <!-- 主键的生成策略 : native:代表数据库的自增长策略-->

             <generator class="native"></generator>

         </id>

         <!-- 普通属性 -->

         <property name="userCode" ></property>

         <property name="userName" ></property>

         <property name="userPassword"></property>

         <property name="userState" ></property>

         <!-- 临时字段添加,演示的是维护表结构:update -->

         <property name="tempStr" ></property>

         

    

    </class>

</hibernate-mapping>

如果测试程序中没有写引入核心配置文件的方法,会报上述的错误:

hibernate中配置文件的详解

3.1 hibernate.cfg.xml的讲解

hibernate-configuration: 根标签

       <session-factory : 标签,创建SessionFactory

1)必须的配置

hibernate.connection.driver_class     : 数据库的驱动名

hibernate.connection.url            :数据库的链接

hibernate.connection.username      : 链接数据库的用户名称

hibernate.connection.password       :链接数据库的用户密码

hibernate.dialect                   :数据库的方言,根据不同的数据库发送不同的sql

2)可选的配置

hibernate.show_sql :显示sql语句,默认值false,可以改为true,显示sql语句

hibernate.format_sql:格式化显示的sql语句,默认值false,可以改为true,格式化sql语句

#hibernate.hbm2ddl.auto    :create-drop   : 先创建表,插入数据之后再删除表

#hibernate.hbm2ddl.auto    : create       :每一次都创建表,先删再创,部署上线,第一次启动的时候,先创建表,但是启动之后,就要把这个注释。

#hibernate.hbm2ddl.auto   :update  :如果有表,则只更新表结构;如果没有表,创建表,(推荐这种方式)

#hibernate.hbm2ddl.auto  :validate :验证数据库与JavaBean之间的关系

3)映射的配置

Mapping: 就是映射文件所在的路径

          Resource: 写的是配置文件的路径,相对路径的写法,按ctrl键能够点过去

3.2 User.hbm.xml映射文件的讲解

<Hibernate-mapping: 根标签

<Class标签: 映射JavaBean与数据库表的关系

      Name:写的JavaBean的全名

      Table:写的数据库表的名称(可以省略)

<Id标签:一定要有,主键属性

      Name: 代表这个主键在JavaBean中的属性

      Column: 代表的是数据库表的主键字段(可以省略)

      <Generator:标签,代表主键生成的策略

                Class:主键生成的策略:native,根据数据库选用自增长策略:类似mysql:AUTO_INCREMENT(明天再详细讲)

<property标签:普通属性标签

       Name: 代表JavaBean中的属性

       Column:代表的是数据库中表的字段,(可以省略)

省略的表名与字段名的映射文件如下:

如果省略的话,表名与类名一致,字段名与属性名称一致

                                                                                                                                    

       Type: 数据的类型(一般省略)

            1)java的类型:java.lang.String ,java.lang.Integer

            2)hibernate的类型:string,integer

            3)数据库的类型:varchar

       Length:代表长度

             在没有数据库表的情况下,指定一下,一般也不用写   

 

© 著作权归作者所有

菰單
粉丝 2
博文 3
码字总数 2491
作品 0
深圳
私信 提问

暂无文章

PostgreSQL 11.3 locking

rudi
今天
5
0
Mybatis Plus sql注入器

一、继承AbstractMethod /** * @author beth * @data 2019-10-23 20:39 */public class DeleteAllMethod extends AbstractMethod { @Override public MappedStatement injectMap......

一个yuanbeth
今天
10
1
一次写shell脚本的经历记录——特殊字符惹的祸

本文首发于微信公众号“我的小碗汤”,扫码文末二维码即可关注,欢迎一起交流! redis在容器化的过程中,涉及到纵向扩pod实例cpu、内存以及redis实例的maxmemory值,statefulset管理的pod需要...

码农实战
今天
4
0
为什么阿里巴巴Java开发手册中不建议在循环体中使用+进行字符串拼接?

之前在阅读《阿里巴巴Java开发手册》时,发现有一条是关于循环体中字符串拼接的建议,具体内容如下: 那么我们首先来用例子来看看在循环体中用 + 或者用 StringBuilder 进行字符串拼接的效率...

武培轩
今天
8
0
队列-链式(c/c++实现)

队列是在线性表功能稍作修改形成的,在生活中排队是不能插队的吧,先排队先得到对待,慢来得排在最后面,这样来就形成了”先进先出“的队列。作用就是通过伟大的程序员来实现算法解决现实生活...

白客C
今天
81
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部