zoukankan      html  css  js  c++  java
  • Hibernate(一)——入门

    1. 前言

            Hibernate是一个开放源代码的ORM持久化框架,它对JDBC进行了非常轻量级的对象封装,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。

            所谓ORM,即Object-Relational Mapping,它的作用就是在关系型数据库和对象之间做了一个映射。从对象(Object)映射到关系(Relation),再从关系映射到对象。这样,我们在操作数据库的时候,不需要再去和复杂SQL打交道,只要像操作对象一样操作它就可以了

            持久化,即把数据(如内存中的对象)保存到可永久保存的存储设备中(如磁盘)。持久化的主要应用是将内存中的对象存储在关系型的数据库中,当然也可以存储在磁盘文件中、XML数据文件中等等。

    2. 入门

    (1)jar包引入:

            image

            除了sqljdbc.jar可根据自己的数据库驱动换成其他jar包,其他包都是必须的。下载地址:http://hibernate.org/orm/。因为本例中我们需要使用注解,所以请下载3.0版本以上的包。

    (2)数据表准备

      1 CREATE TABLE tbUser (
      2     userID VARCHAR(50),
      3     loginName VARCHAR(200),
      4     userName VARCHAR(200),
      5     passWord VARCHAR(200)
      6 )

    (3)创建表tbUser对应的对象

            所谓的ORM就是要将关系型数据库的数据表映射为JAVA对象,所以理所应当的我们需要为tbUser表建立一个JAVA对象与其相对应。

      1 package com.luych.hibernate.study.entity;
      2 
      3 import javax.persistence.Entity;
      4 import javax.persistence.Id;
      5 import javax.persistence.Table;
      6 
      7 @Entity
      8 @Table(name="tbUser")
      9 public class UserEntity {
     10 
     11     @Id
     12     private String userID;
     13     private String loginName;
     14     private String userName;
     15     private String passWord;
     16 
     17     public String getUserID() {
     18         return userID;
     19     }
     20     public void setUserID(String userID) {
     21         this.userID = userID;
     22     }
     23     public String getLoginName() {
     24         return loginName;
     25     }
     26     public void setLoginName(String loginName) {
     27         this.loginName = loginName;
     28     }
     29     public String getUserName() {
     30         return userName;
     31     }
     32     public void setUserName(String userName) {
     33         this.userName = userName;
     34     }
     35     public String getPassWord() {
     36         return passWord;
     37     }
     38     public void setPassWord(String passWord) {
     39         this.passWord = passWord;
     40     }
     41     @Override
     42     public String toString() {
     43         return loginName+", "+userName+", "+passWord+", "+userID;
     44     }
     45 
     46 
     47 }

            @Entity: 此注解来通知Hibernate,该对象为ORM对象。

            @Table(name="tbUser"):此注解来通知Hibernate,该对象对应的数据表为tbUser,将来针对此对象的新增、修改、删除、查询等操作都会映射到tbUSer数据表中。

            @id:此注解表示userID为主键,是对象的唯一标识,一般数据库设计时候也会将userID字段设置为主键。Hibernage的对象缓存会根据@id标识的主键来进行处理。

            @Column:此注解在本例中没有出现。当数据库中字段名和JAVA对象属性名称不一致的时候,可以用此注解来描述其对应关系。如下例(数据库字段为LOGIN_NAME,对象属性为loginName):

      1 @Column(name="LOGIN_NAME")
      2 private String loginName;

            @Transient:此注解在本例中也没有出现。如果JAVA对象中的某个属性,并没有数据表的字段与其相对应,那么就用此注解标注该属性。Hibernate针对此对象进行增删改查的时候回忽略此属性。例如:我们要为UserEntity对象增加一个登陆次数(由其他数据表统计而来),那么处理如下:

      1 @Transient
      2 private int loginCnt;

            另外,我们改造了toString方法,后面的测试代码中将要用到。

    (4)配置Hibernate文件

             建立Hibernate的配置文件,路径和文件名任意。本例为:hibernate-config.xml。内容如下:

      1 <?xml version="1.0" encoding="UTF-8"?>
      2 <!DOCTYPE hibernate-configuration PUBLIC
      3     "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
      4     "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
      5 <hibernate-configuration>
      6     <session-factory>
      7         <!-- 设置数据库驱动 -->
      8         <property name="hibernate.connection.driver_class">
      9                 com.microsoft.sqlserver.jdbc.SQLServerDriver
     10         </property>
     11         <!-- 设置数据库URL -->
     12         <property name="hibernate.connection.url">
     13                 jdbc:sqlserver://192.168.9.23:14433;databaseName=tempdb
     14         </property>
     15         <!-- 数据库用户名 -->
     16         <property name="hibernate.connection.username">sa</property>
     17         <!-- 数据库密码 -->
     18         <property name="hibernate.connection.password">123@abcd</property>
     19         <!-- beans -->
     20         <mapping class="com.luych.hibernate.study.entity.UserEntity"/>
     21     </session-factory>
     22 </hibernate-configuration>

            该配置文件中,我们为Hibernate设置了数据库连接信息(驱动、URL、用户名以及密码,这些信息请根据自己实际情况来做相应变更),并通知Hibernate我们刚刚创建的UserEntity对象(mapping class="com.luych.hibernate.study.entity.UserEntity")。

    (5)测试运行

      1 package com.luych.hibernate.study.main;
      2 
      3 import java.util.List;
      4 import java.util.UUID;
      5 
      6 import org.hibernate.Query;
      7 import org.hibernate.Session;
      8 import org.hibernate.SessionFactory;
      9 import org.hibernate.cfg.Configuration;
     10 import org.junit.After;
     11 import org.junit.Before;
     12 import org.junit.Test;
     13 
     14 import com.luych.hibernate.study.entity.UserEntity;
     15 
     16 @SuppressWarnings("unchecked")
     17 public class TestMain {
     18 
     19     private Session session;
     20 
     21     @Before
     22     public void getSession(){
     23         //请根据自己在第三部中创建的xml文件路径及名称调整configure参数值
     24         Configuration config = new Configuration().configure("hibernate-config.xml");
     25         SessionFactory sessionFactory = config.buildSessionFactory();
     26         session = sessionFactory.openSession();
     27     }
     28 
     29     @After
     30     public void freeSession(){
     31         session.close();
     32     }
     33 
     34     public void sel() {
     35         Query query = session.createQuery("FROM UserEntity WHERE 1=1");
     36         List<UserEntity> userList = query.list();
     37         for (UserEntity userEntity : userList) {
     38             System.out.println(userEntity.toString());
     39         }
     40     }
     41 
     42     public void add() {
     43         session.beginTransaction();
     44         UserEntity user  = new UserEntity();
     45         user.setLoginName("luych");
     46         user.setUserName("卢艳超");
     47         user.setPassWord("12333");
     48         user.setUserID(UUID.randomUUID().toString());
     49         session.save(user);
     50         session.getTransaction().commit();
     51     }
     52 
     53     public void edt(){
     54         session.beginTransaction();
     55         Query query = session.createQuery("FROM UserEntity WHERE 1=1");
     56         List<UserEntity> userList = query.list();
     57         for (UserEntity userEntity : userList) {
     58             userEntity.setPassWord("45666");
     59             session.update(userEntity);
     60         }
     61         session.getTransaction().commit();
     62     }
     63 
     64     public void del(){
     65         session.beginTransaction();
     66         Query query = session.createQuery("FROM UserEntity WHERE 1=1");
     67         List<UserEntity> userList = query.list();
     68         for (UserEntity userEntity : userList) {
     69             session.delete(userEntity);
     70         }
     71         session.getTransaction().commit();
     72     }
     73 
     74     @Test
     75     public void test(){
     76         System.out.println("当前已有数据:");
     77         sel();
     78         del();
     79         System.out.println("执行删除后:");
     80         sel();
     81         add();
     82         add();
     83         System.out.println("执行新增后");
     84         sel();
     85         edt();
     86         System.out.println("执行修改后");
     87         sel();
     88     }
     89 }
     90 
             以上代码里,getSession方法用来根据hibernate-config.xml配置文件来获取。freeSession方法用来关闭不再使用的Session。sel方法用来查询当前数据库中的所有数据并打印到控制台;add方法即要新增一条数据;edt方法将所有的passWord都改为45666;del方法将删除所有的数据。大家看一下test方法,然后我们右键,Run As JUnit Test,控制台输出结果为:

      1 当前已有数据:
      2 luych, 卢艳超, 45666, 50420e9c-e751-41c3-a33d-0b6d09924da8
      3 luych, 卢艳超, 45666, 58bd812c-4e43-4248-b0c9-9c3576c6d47c
      4 执行删除后:
      5 执行新增后
      6 luych, 卢艳超, 12333, 9660637e-5447-42c0-bcfb-2b24786bc0e8
      7 luych, 卢艳超, 12333, c0631818-cc91-4691-93fc-159c2cabe37d
      8 执行修改后
      9 luych, 卢艳超, 45666, 9660637e-5447-42c0-bcfb-2b24786bc0e8
     10 luych, 卢艳超, 45666, c0631818-cc91-4691-93fc-159c2cabe37d

            可以看到我们的增删改查操作都成功的完成了。

            以上就是Hibernate的入门基本操作,后续还会有其他探究。本文仅当是抛砖引玉吧,愿大家共勉。

    笔者只是初学者,开此博客的初衷是为了给自己的学习过程留一个痕迹。所以您可能发现笔者措辞不严谨、逻辑不合理,甚至代码有错误、结论很偏颇等等。笔者感激各位的讨论和指正,并在此不胜感激!拜谢!欢迎加QQ群讨论:852410026
  • 相关阅读:
    NCNN优化实时面部关键点检测
    使用 div 标签 contenteditable="true" 实现一个 聊天框,支持 Ctrl + v 粘贴图片
    《精益创业》读书总结
    DATAX使用
    canal增量同步原理以及使用说明
    element rules required 自定义表达式
    JavaScript 数组映射,重新整理
    wangeditor遮挡其他控件
    多个axios按顺序执行
    .NET Core 中基于 IHostedService 实现后台定时任务
  • 原文地址:https://www.cnblogs.com/LOVE0612/p/5435338.html
Copyright © 2011-2022 走看看