所需工具:

ide:eclipse or myeclipse

jdk:1.7

jar包:hibernate-distribution-3.6.0.Final 和对应mysql的驱动类(对应jar包如图)

数据库:mysql 要支持事务的版本,命令行下或用navicat生成如图所示表

项目目录结构如下:

其中cn.kiwifly.entity为实体类包,cn.kiwifly.dao为Dao层包,cn.kiwifly.utils为工具包,cn.kiwifly.test为测试包

学习目标:完成hibernate的基础入门

都准备好了,搞起!

第一步:建立hibernate.cfg.xml,这是hibernate的主配置文件,具体配置已在注释上写的很清楚了,

最后一个<mapping />是配置的最后一步,在完成后面两项后再写的!

  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. <!-- 配置数据库的驱动类 -->
  9. <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
  10. <!-- 配置数据库的别名 -->
  11. <!-- 什么是别名?大家都知道hibernate一个重要的优点是可以跨数据库使用,实现这点的原因就在这里,hibernate为每种常见的数据库都
  12. 实现了特定的sql语句,比如就分页来说,mysql就是limit语句,而oracle就是恶心的多个select嵌套在一起,但是hibernate本身不
  13. 能识别数据库的类型,在这里我们通过设置别名来告诉hibernate使用什么数据库的语句来实现
  14. 不同数据库的别名分别是什么?
  15. hibernate的包里有一个是常用配置文件,从这里可以查到
  16. Hiberante开发包__hibernate-distribution-3.6.0.Final-dist\hibernate-distribution-3.6.0.Final\project\etc\hibernate.properties
  17. -->
  18. <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
  19. <!-- 配置数据库的url地址 -->
  20. <property name="hibernate.connection.url">jdbc:mysql:///test</property>
  21. <!-- 配置数据库的用户名 -->
  22. <property name="hibernate.connection.username">root</property>
  23. <!-- 配置数据库的密码 -->
  24. <property name="hibernate.connection.password">root</property>
  25.  
  26. <!-- 非必须配置 -->
  27. <!-- 是否在控制台打印sql语句,建议开发时打开,发布后关闭 -->
  28. <property name="show_sql">true</property>
  29. <!-- 格式化控制台打印的sql语句 -->
  30. <property name="format_sql">true</property>
  31. <!-- hibernate有两种开发流程,一个是先在数据库里建好库,建好表,再写对应的实体类,与对应关系。另一种是按需求直接写实体类与对应关系,再通过hibernate自动
  32. 生成对应的数据库里的表。如果想自动生成表就要配置这个hbm2ddl.auto这个属性了,这个属性有好几个值,一般用update,其余的查文档吧
  33. -->
  34. <property name="hbm2ddl.auto">update</property>
  35.  
  36. <!-- 添加映射文件 -->
  37. <mapping resource="cn/kiwifly/entity/User.hbm.xml"/>
  38. </session-factory>
  39. </hibernate-configuration>

第二步:写与数据库表对应的实体类User.java

  1. package cn.kiwifly.entity;
  2.  
  3. /*
  4. * 写一个与表对应的实体类,类属性与表一一对应
  5. * */
  6. public class User {
  7.  
  8. /*在数据库中id,我们设置的是int类型,在设置实体类属性时,我们也可以设置成int类型
  9. * 但是这里我们要与数据库对应成整型时,最好用Integer类型,因为int是基本
  10. * 类型,它只能为0不能为空,但数据库有些字段是可以为空的,为空用null表示最合适,所以
  11. * 用包装类对应最好
  12. * */
  13. private Integer id;
  14. private String name;
  15. /******参考id类型*****/
  16. private Integer age;
  17. private String sex;
  18.  
  19. /*******实现getter与setter方法*********/
  20. public Integer getId() {
  21. return id;
  22. }
  23.  
  24. public void setId(Integer id) {
  25. this.id = id;
  26. }
  27.  
  28. public String getName() {
  29. return name;
  30. }
  31.  
  32. public void setName(String name) {
  33. this.name = name;
  34. }
  35.  
  36. public Integer getAge() {
  37. return age;
  38. }
  39.  
  40. public void setAge(Integer age) {
  41. this.age = age;
  42. }
  43.  
  44. public String getSex() {
  45. return sex;
  46. }
  47.  
  48. public void setSex(String sex) {
  49. this.sex = sex;
  50. }
  51.  
  52. /**********最好也同时实现toString方法,便于测试********/
  53. public String toString() {
  54. return "User [id=" + id + ", name=" + name + ", age=" + age + ", sex="
  55. + sex + "]";
  56. }
  57.  
  58. }

第三步:写实体类的映射文件User.hbm.xml(这一步完成就可以在hibernate.cfg.xml中添加映射文件了)

  1. <?xml version="1.0"?>
  2. <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
  3. "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
  4. <!-- 如果这里不加package,下面如果用类就要写全路径 -->
  5. <hibernate-mapping package="cn.kiwifly.entity">
  6. <!-- 把实体类与表对应起来,格式
  7. <class name="实体类" table="对应的表名">
  8. <id name="对应主键的实体类的属性" type="这个属性的类型" column="对应数据库表中的字段">
  9. <generator class="主键的生成策略" />
  10. </id>
  11. <property name="对应普通属性的实体类的属性" type="这个普通属性类型" column="对应数据库表中的字段" />
  12. </class>
  13. -->
  14. <class name="User" table="t_user">
  15. <!-- 这里配置映射表的主键, -->
  16. <id name="id" type="java.lang.Integer" column="id">
  17. <generator class="native" />
  18. </id>
  19. <property name="name" type="java.lang.String" column="name" />
  20. <property name="age" type="java.lang.Integer" column="age" />
  21. <property name="sex" type="java.lang.String" column="sex" />
  22. </class>
  23. </hibernate-mapping>

第四步:写一个封装分页结果的QueryResult类

  1. package cn.kiwifly.entity;
  2.  
  3. import java.util.ArrayList;
  4. import java.util.List;
  5.  
  6. /*
  7. * 这个类是用来封装,分页查询数据的类,不 是实体类
  8. * */
  9. public class QueryResult {
  10.  
  11. private List<User> userList = new ArrayList<>();
  12. private Long total;
  13.  
  14. public List<User> getUserList() {
  15. return userList;
  16. }
  17.  
  18. public void setUserList(List<User> userList) {
  19. this.userList = userList;
  20. }
  21.  
  22. public Long getTotal() {
  23. return total;
  24. }
  25.  
  26. public void setTotal(Long total) {
  27. this.total = total;
  28. }
  29.  
  30. public String toString() {
  31. return "QueryResult [userList=" + userList + ", total=" + total + "]";
  32. }
  33.  
  34. }

第五步:写一个用来获取Session对象的工具类,HibernateUtil.java

  1. package cn.kiwifly.utils;
  2.  
  3. import org.hibernate.Session;
  4. import org.hibernate.SessionFactory;
  5. import org.hibernate.cfg.Configuration;
  6.  
  7. /*
  8. * 一个简单的hibernate工具类,主要作用是,可以返回一个session对象,为什么要用hibernate工具类获取?而不是直接在代码里获取
  9. * 因为SessionFactory是一个重量级的类,如果不停的获得,释放,会很占资源,一个应用一般一个SessionFactory对象就够了
  10. * */
  11. public class HibernateUtil {
  12.  
  13. private static SessionFactory sessionFactory;
  14.  
  15. static {
  16.  
  17. sessionFactory = new Configuration()//
  18. .configure()//
  19. .buildSessionFactory();
  20. }
  21.  
  22. public static Session getSession(){
  23.  
  24. return sessionFactory.openSession();
  25. }
  26. }

第六步:写UserDao.java来实现,增删改查分页等方法

  1. package cn.kiwifly.dao;
  2.  
  3. import java.util.List;
  4.  
  5. import org.hibernate.Query;
  6. import org.hibernate.Session;
  7. import org.hibernate.Transaction;
  8.  
  9. import cn.kiwifly.entity.QueryResult;
  10. import cn.kiwifly.entity.User;
  11. import cn.kiwifly.utils.HibernateUtil;
  12.  
  13. public class UserDao {
  14.  
  15. public void add(User user) {
  16.  
  17. // 首先要获取session对象,它是所有操作的根本
  18. Session session = HibernateUtil.getSession();
  19.  
  20. // 开启事务
  21. Transaction tx = session.beginTransaction();
  22. try {
  23.  
  24. // 调用hibernate封装好save方法把对象存入数据库中,在hibernate中一个类对应数据库库中一张表
  25. // 一个对象对应数据库中表中的一条记录
  26. session.save(user);
  27. // 提交记录
  28. tx.commit();
  29. } catch (Exception e) {
  30.  
  31. // 如果有任何异常就回滚
  32. tx.rollback();
  33. // 这里没有对异常进行处理,一定要抛出去,不然永远不知道,问题出在哪
  34. throw e;
  35. } finally {
  36.  
  37. // 用完session一定要记得释放
  38. session.close();
  39. }
  40. }
  41.  
  42. public void delete(Integer id) {
  43.  
  44. Session session = HibernateUtil.getSession();
  45.  
  46. // 开启事务
  47. Transaction tx = session.beginTransaction();
  48. try {
  49.  
  50. // 首先要通过id获取数据库里对应的记录的对象
  51. User user = (User) session.get(User.class, 1);
  52. // 再通过hibernate封装好的,delete方法,来删除记录
  53. session.delete(user);
  54. // 提交记录
  55. tx.commit();
  56. } catch (Exception e) {
  57.  
  58. // 如果有任何异常就回滚
  59. tx.rollback();
  60. // 这里没有对异常进行处理,一定要抛出去,不然永远不知道,问题出在哪
  61. throw e;
  62. } finally {
  63.  
  64. // 用完session一定要记得释放
  65. session.close();
  66. }
  67. }
  68.  
  69. public void update(User user) {
  70.  
  71. Session session = HibernateUtil.getSession();
  72.  
  73. // 开启事务
  74. Transaction tx = session.beginTransaction();
  75. try {
  76.  
  77. // 首先要通过id获取数据库里对应的记录的对象
  78. User oldUser = (User) session.get(User.class, user.getId());
  79. // 再通过对象的setter方法来修改,对象的值
  80. oldUser.setAge(user.getAge());
  81. oldUser.setName(user.getName());
  82. oldUser.setSex(user.getSex());
  83. // 再通过hibernate封装好的update方法,来修改记录
  84. session.update(oldUser);
  85. // 提交记录
  86. tx.commit();
  87. } catch (Exception e) {
  88.  
  89. // 如果有任何异常就回滚
  90. tx.rollback();
  91. // 这里没有对异常进行处理,一定要抛出去,不然永远不知道,问题出在哪
  92. throw e;
  93. } finally {
  94.  
  95. // 用完session一定要记得释放
  96. session.close();
  97. }
  98. }
  99.  
  100. public User findById(Integer id) {
  101.  
  102. // 直接调用session的get方法就可以了
  103. return (User) HibernateUtil.getSession().get(User.class, 1);
  104. }
  105.  
  106. @SuppressWarnings("unchecked")
  107. public List<User> findAll() {
  108.  
  109. Session session = HibernateUtil.getSession();
  110.  
  111. // 如果要获取全部的记录,那么hibernate封装的方法就没有直接可以使用的了,所以我要创建一个查询
  112. //注意:1、如果前面是SELECT * 可以省略不写2、FROM 后面跟的不是表名,是与表映射的实体类名
  113. Query query = session.createQuery("FROM User");
  114. // 它有一个list()方法可以直接把结果转成list类型,这个真爽
  115. //这里如果用eclipse会警告,不影响使用,我一直没搞清楚这里的警告是为什么?如有大神知道,麻烦告诉一下,谢谢
  116. List<User> userList = query.list();
  117.  
  118. return userList;
  119. }
  120.  
  121. @SuppressWarnings("unchecked")
  122. public QueryResult findAllByPage(int firstResult, int maxResults) {
  123.  
  124. Session session = HibernateUtil.getSession();
  125.  
  126. //创建用于封装结果的QueryResult对象
  127. QueryResult queryResult = new QueryResult();
  128.  
  129. // 复杂的查询就要用自己写sql
  130. // hibernate对分页有封装好的方法,setFirstResult是设置起始页,setMaxResults是设置一页显示的数量
  131. List<User> userList = session.createQuery("FROM User")//
  132. .setFirstResult(firstResult)//
  133. .setMaxResults(maxResults)//
  134. .list();
  135. // 分页还需要知道总的记录数
  136. Long total = (Long) session.createQuery("SELECT COUNT(ID) FROM User").uniqueResult();
  137.  
  138. //装载数据
  139. queryResult.setUserList(userList);
  140. queryResult.setTotal(total);
  141.  
  142. return queryResult;
  143. }
  144. }

第七步:测试UserDao

  1. package cn.kiwifly.test;
  2.  
  3. import java.util.Iterator;
  4. import java.util.List;
  5.  
  6. import org.junit.Test;
  7.  
  8. import cn.kiwifly.dao.UserDao;
  9. import cn.kiwifly.entity.QueryResult;
  10. import cn.kiwifly.entity.User;
  11.  
  12. public class UserDaoTest {
  13.  
  14. @Test
  15. public void testAdd() {
  16.  
  17. User user = new User();
  18. user.setName("小明");
  19. user.setAge(88);
  20. user.setSex("男");
  21.  
  22. UserDao userDao = new UserDao();
  23. userDao.add(user);
  24. }
  25.  
  26. @Test
  27. public void testDelete() {
  28.  
  29. new UserDao().delete(1);
  30. }
  31.  
  32. @Test
  33. public void testUpdate() {
  34.  
  35. User user = new User();
  36. user.setId(1);
  37. user.setName("小红");
  38. user.setAge(99);
  39. user.setSex("女");
  40.  
  41. new UserDao().update(user);
  42. }
  43.  
  44. @Test
  45. public void testFindById() {
  46.  
  47. User user = new UserDao().findById(1);
  48.  
  49. System.out.println(user);
  50. }
  51.  
  52. @Test
  53. public void testFindAll() {
  54.  
  55. List<User> userList = new UserDao().findAll();
  56.  
  57. for (Iterator<User> iterator = userList.iterator(); iterator.hasNext();) {
  58. User user = (User) iterator.next();
  59.  
  60. System.out.println(user.getName());
  61. }
  62. }
  63.  
  64. @Test
  65. public void testFindAllByPage() {
  66.  
  67. QueryResult queryResult = new UserDao().findAllByPage(10, 10);
  68. List<User> userList = queryResult.getUserList();
  69. Long total = queryResult.getTotal();
  70.  
  71. System.out.println("总共有"+total+"条记录");
  72. for (User user : userList) {
  73.  
  74. System.out.println(user.getName());
  75. }
  76. }
  77.  
  78. @Test
  79. public void testAddUses(){
  80.  
  81. UserDao userDao = new UserDao();
  82.  
  83. for(int i = 0; i < 30; i++){
  84.  
  85. User user = new User();
  86. user.setName("张"+i);
  87.  
  88. userDao.add(user);
  89. }
  90. }
  91.  
  92. }

谢谢观看!

【hibernate】<第一节>hibernate简单入门的更多相关文章

  1. 第一节 Hibernate 基本配置

    1 新建maven工程 1)打开eclipse,依次点击File---->New---->Maven Project. 2)选择org.apache.maven.archetypes ma ...

  2. 第一节:简单的请求(Requests)和响应(Responses)

    目录 创建项目 开发服务器 创建名称为Polls的应用 编写你的第一个视图 创建项目 在命令行中,使用cd命令进入到你想要存储你的项目的目录,然后运行下面的命令: $ django-admin sta ...

  3. 第一节:mybatis入门

    1.新建数据表 本次测试使用mysql数据,数据库名称为mybatis,新建一张表person,建表语句如下: CREATE TABLE `person` ( `id` ) PRIMARY KEY a ...

  4. 安全测试6_Web安全工具第一节(浏览器入门及扩展)

    今天来学习下浏览器的功能,浏览器是我们经常用到但是功能却很强大的一个东东,我们经常用到的无非是三种(谷歌.火狐.IE) 1.浏览器功能介绍: 下面以谷歌浏览器(Chrome版本为56)为例,介绍下,懂 ...

  5. 第一节:Vuejs入门之各种指令

    一. 简介 Vue (读音 /vjuː/,类似于 view) 是一套用于构建用户界面的渐进式框架.与其它大型框架不同的是,Vue 被设计为可以自底向上逐层应用.Vue 的核心库只关注视图层,不仅易于上 ...

  6. hibernate多对多 一对多 及简单入门 主键生成策略

    Hibernate简单使用 入门 通过hibernate的 一对多 多对多轻松看懂hibernate配置 (不使用注解) hibernate对jdbc访问数据库的代码进行轻量级封装,简化重复代码 减少 ...

  7. 框架之 hibernate简单入门

    hibernate框架的搭建 Hibernate框架的概述 1. Hibernate框架的概述 * Hibernate称为 * Hibernate是一个开放源代码的对象关系映射(ORM)框架,它对JD ...

  8. Hibernate第一篇【介绍Hibernate,简述ORM,快速入门】

    前言 前面已经学过了Struts2框架了,紧接着就是学习Hibernate框架了-本博文主要讲解介绍Hibernate框架,ORM的概念和Hibernate入门 什么是Hibernate框架? Hib ...

  9. Hibernate第一天——入门和基本操作

    第一个接触的框架就是这个Hibernate框架了,Hibernate本意是 冬眠 ,这里有必要引用CSDN上某位网友某个帖子的评论先引出框架的概念: 框架:一个软件半成品,帮你做了一些基础工作,你就可 ...

随机推荐

  1. html-制作导航菜单

    导航菜单nav: 1.使用列表标签<ul> 2.使用浮动布局float 3.使用超链接标签<a>:要使用<a>标签的margin外边距,需要让<a>标签 ...

  2. asp.net webform 与mvc 共享session

    公司内部系统最早是用.net webform模式开发的,现新项目用.net mvc 开发,现存在的问题就是如何保持原有.net webform的登录状态不变,而在mvc中能够验证用户的登录状态,也就是 ...

  3. 一个H5的3D滑动组件实现(兼容2D模式)

    起由 原始需求来源于一个项目的某个功能,要求实现3D图片轮播效果,而已有的组件大多是普通的2D图片轮播,于是重新造了一个轮子,实现了一个既支持2D,又支持3D的滑动.轮播组件. 实现思路 刚一开始肯定 ...

  4. Oracle数据库中创建表空间语句

    1:创建临时表空间 create temporary tablespace user_temp tempfile 'Q:\oracle\product\10.2.0\oradata\Test\xyrj ...

  5. Sharepoint学习笔记—习题系列--70-573习题解析 -(Q94-Q96)

    Question 94You need to create a custom application that provides users with the ability to create a ...

  6. 如何启动或关闭oracle的归档(ARCHIVELOG)模式

    参考文献: http://www.eygle.com/archives/2004/10/oracle_howtoeci.html 1.管理员身份连接数据库 C:\Users\Administrator ...

  7. android 内存泄露调试

    一.概述 1 二.Android(Java)中常见的容易引起内存泄漏的不良代码 1 (一) 查询数据库没有关闭游标 2 (二) 构造Adapter时,没有使用缓存的 convertView 3 (三) ...

  8. DownloadManager 的使用

    一.基本概念    1.DownloadManager是Android 2.3A (API level 9) 引入的,基于http协议,用于处理长时间下载. 2.DownloadManager对于断点 ...

  9. Android动画translate坐标图

    X坐标图示: Y坐标图示:

  10. 深入理解java虚拟机(3)---类的结构

    计算机在开始的时候,只认识0和1,所以汇编语言是和机器结构或者说CPU绑定的.ARM体系结构就是这样一种体现,指令集的概念. 随着高级语言的出现,从字编码发展到了字节编码,计算机的先驱希望能够让语言能 ...