【hibernate】<第一节>hibernate简单入门
所需工具:
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 />是配置的最后一步,在完成后面两项后再写的!
<?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>
<!-- 配置数据库的别名 -->
<!-- 什么是别名?大家都知道hibernate一个重要的优点是可以跨数据库使用,实现这点的原因就在这里,hibernate为每种常见的数据库都
实现了特定的sql语句,比如就分页来说,mysql就是limit语句,而oracle就是恶心的多个select嵌套在一起,但是hibernate本身不
能识别数据库的类型,在这里我们通过设置别名来告诉hibernate使用什么数据库的语句来实现
不同数据库的别名分别是什么?
hibernate的包里有一个是常用配置文件,从这里可以查到
Hiberante开发包__hibernate-distribution-3.6.0.Final-dist\hibernate-distribution-3.6.0.Final\project\etc\hibernate.properties
-->
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
<!-- 配置数据库的url地址 -->
<property name="hibernate.connection.url">jdbc:mysql:///test</property>
<!-- 配置数据库的用户名 -->
<property name="hibernate.connection.username">root</property>
<!-- 配置数据库的密码 -->
<property name="hibernate.connection.password">root</property> <!-- 非必须配置 -->
<!-- 是否在控制台打印sql语句,建议开发时打开,发布后关闭 -->
<property name="show_sql">true</property>
<!-- 格式化控制台打印的sql语句 -->
<property name="format_sql">true</property>
<!-- hibernate有两种开发流程,一个是先在数据库里建好库,建好表,再写对应的实体类,与对应关系。另一种是按需求直接写实体类与对应关系,再通过hibernate自动
生成对应的数据库里的表。如果想自动生成表就要配置这个hbm2ddl.auto这个属性了,这个属性有好几个值,一般用update,其余的查文档吧
-->
<property name="hbm2ddl.auto">update</property> <!-- 添加映射文件 -->
<mapping resource="cn/kiwifly/entity/User.hbm.xml"/>
</session-factory>
</hibernate-configuration>
第二步:写与数据库表对应的实体类User.java
package cn.kiwifly.entity; /*
* 写一个与表对应的实体类,类属性与表一一对应
* */
public class User { /*在数据库中id,我们设置的是int类型,在设置实体类属性时,我们也可以设置成int类型
* 但是这里我们要与数据库对应成整型时,最好用Integer类型,因为int是基本
* 类型,它只能为0不能为空,但数据库有些字段是可以为空的,为空用null表示最合适,所以
* 用包装类对应最好
* */
private Integer id;
private String name;
/******参考id类型*****/
private Integer age;
private String sex; /*******实现getter与setter方法*********/
public Integer getId() {
return id;
} public void setId(Integer id) {
this.id = id;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public Integer getAge() {
return age;
} public void setAge(Integer age) {
this.age = age;
} public String getSex() {
return sex;
} public void setSex(String sex) {
this.sex = sex;
} /**********最好也同时实现toString方法,便于测试********/
public String toString() {
return "User [id=" + id + ", name=" + name + ", age=" + age + ", sex="
+ sex + "]";
} }
第三步:写实体类的映射文件User.hbm.xml(这一步完成就可以在hibernate.cfg.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">
<!-- 如果这里不加package,下面如果用类就要写全路径 -->
<hibernate-mapping package="cn.kiwifly.entity">
<!-- 把实体类与表对应起来,格式
<class name="实体类" table="对应的表名">
<id name="对应主键的实体类的属性" type="这个属性的类型" column="对应数据库表中的字段">
<generator class="主键的生成策略" />
</id>
<property name="对应普通属性的实体类的属性" type="这个普通属性类型" column="对应数据库表中的字段" />
</class>
-->
<class name="User" table="t_user">
<!-- 这里配置映射表的主键, -->
<id name="id" type="java.lang.Integer" column="id">
<generator class="native" />
</id>
<property name="name" type="java.lang.String" column="name" />
<property name="age" type="java.lang.Integer" column="age" />
<property name="sex" type="java.lang.String" column="sex" />
</class>
</hibernate-mapping>
第四步:写一个封装分页结果的QueryResult类
package cn.kiwifly.entity; import java.util.ArrayList;
import java.util.List; /*
* 这个类是用来封装,分页查询数据的类,不 是实体类
* */
public class QueryResult { private List<User> userList = new ArrayList<>();
private Long total; public List<User> getUserList() {
return userList;
} public void setUserList(List<User> userList) {
this.userList = userList;
} public Long getTotal() {
return total;
} public void setTotal(Long total) {
this.total = total;
} public String toString() {
return "QueryResult [userList=" + userList + ", total=" + total + "]";
} }
第五步:写一个用来获取Session对象的工具类,HibernateUtil.java
package cn.kiwifly.utils; import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration; /*
* 一个简单的hibernate工具类,主要作用是,可以返回一个session对象,为什么要用hibernate工具类获取?而不是直接在代码里获取
* 因为SessionFactory是一个重量级的类,如果不停的获得,释放,会很占资源,一个应用一般一个SessionFactory对象就够了
* */
public class HibernateUtil { private static SessionFactory sessionFactory; static { sessionFactory = new Configuration()//
.configure()//
.buildSessionFactory();
} public static Session getSession(){ return sessionFactory.openSession();
}
}
第六步:写UserDao.java来实现,增删改查分页等方法
package cn.kiwifly.dao; import java.util.List; import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction; import cn.kiwifly.entity.QueryResult;
import cn.kiwifly.entity.User;
import cn.kiwifly.utils.HibernateUtil; public class UserDao { public void add(User user) { // 首先要获取session对象,它是所有操作的根本
Session session = HibernateUtil.getSession(); // 开启事务
Transaction tx = session.beginTransaction();
try { // 调用hibernate封装好save方法把对象存入数据库中,在hibernate中一个类对应数据库库中一张表
// 一个对象对应数据库中表中的一条记录
session.save(user);
// 提交记录
tx.commit();
} catch (Exception e) { // 如果有任何异常就回滚
tx.rollback();
// 这里没有对异常进行处理,一定要抛出去,不然永远不知道,问题出在哪
throw e;
} finally { // 用完session一定要记得释放
session.close();
}
} public void delete(Integer id) { Session session = HibernateUtil.getSession(); // 开启事务
Transaction tx = session.beginTransaction();
try { // 首先要通过id获取数据库里对应的记录的对象
User user = (User) session.get(User.class, 1);
// 再通过hibernate封装好的,delete方法,来删除记录
session.delete(user);
// 提交记录
tx.commit();
} catch (Exception e) { // 如果有任何异常就回滚
tx.rollback();
// 这里没有对异常进行处理,一定要抛出去,不然永远不知道,问题出在哪
throw e;
} finally { // 用完session一定要记得释放
session.close();
}
} public void update(User user) { Session session = HibernateUtil.getSession(); // 开启事务
Transaction tx = session.beginTransaction();
try { // 首先要通过id获取数据库里对应的记录的对象
User oldUser = (User) session.get(User.class, user.getId());
// 再通过对象的setter方法来修改,对象的值
oldUser.setAge(user.getAge());
oldUser.setName(user.getName());
oldUser.setSex(user.getSex());
// 再通过hibernate封装好的update方法,来修改记录
session.update(oldUser);
// 提交记录
tx.commit();
} catch (Exception e) { // 如果有任何异常就回滚
tx.rollback();
// 这里没有对异常进行处理,一定要抛出去,不然永远不知道,问题出在哪
throw e;
} finally { // 用完session一定要记得释放
session.close();
}
} public User findById(Integer id) { // 直接调用session的get方法就可以了
return (User) HibernateUtil.getSession().get(User.class, 1);
} @SuppressWarnings("unchecked")
public List<User> findAll() { Session session = HibernateUtil.getSession(); // 如果要获取全部的记录,那么hibernate封装的方法就没有直接可以使用的了,所以我要创建一个查询
//注意:1、如果前面是SELECT * 可以省略不写2、FROM 后面跟的不是表名,是与表映射的实体类名
Query query = session.createQuery("FROM User");
// 它有一个list()方法可以直接把结果转成list类型,这个真爽
//这里如果用eclipse会警告,不影响使用,我一直没搞清楚这里的警告是为什么?如有大神知道,麻烦告诉一下,谢谢
List<User> userList = query.list(); return userList;
} @SuppressWarnings("unchecked")
public QueryResult findAllByPage(int firstResult, int maxResults) { Session session = HibernateUtil.getSession(); //创建用于封装结果的QueryResult对象
QueryResult queryResult = new QueryResult(); // 复杂的查询就要用自己写sql
// hibernate对分页有封装好的方法,setFirstResult是设置起始页,setMaxResults是设置一页显示的数量
List<User> userList = session.createQuery("FROM User")//
.setFirstResult(firstResult)//
.setMaxResults(maxResults)//
.list();
// 分页还需要知道总的记录数
Long total = (Long) session.createQuery("SELECT COUNT(ID) FROM User").uniqueResult(); //装载数据
queryResult.setUserList(userList);
queryResult.setTotal(total); return queryResult;
}
}
第七步:测试UserDao
package cn.kiwifly.test; import java.util.Iterator;
import java.util.List; import org.junit.Test; import cn.kiwifly.dao.UserDao;
import cn.kiwifly.entity.QueryResult;
import cn.kiwifly.entity.User; public class UserDaoTest { @Test
public void testAdd() { User user = new User();
user.setName("小明");
user.setAge(88);
user.setSex("男"); UserDao userDao = new UserDao();
userDao.add(user);
} @Test
public void testDelete() { new UserDao().delete(1);
} @Test
public void testUpdate() { User user = new User();
user.setId(1);
user.setName("小红");
user.setAge(99);
user.setSex("女"); new UserDao().update(user);
} @Test
public void testFindById() { User user = new UserDao().findById(1); System.out.println(user);
} @Test
public void testFindAll() { List<User> userList = new UserDao().findAll(); for (Iterator<User> iterator = userList.iterator(); iterator.hasNext();) {
User user = (User) iterator.next(); System.out.println(user.getName());
}
} @Test
public void testFindAllByPage() { QueryResult queryResult = new UserDao().findAllByPage(10, 10);
List<User> userList = queryResult.getUserList();
Long total = queryResult.getTotal(); System.out.println("总共有"+total+"条记录");
for (User user : userList) { System.out.println(user.getName());
}
} @Test
public void testAddUses(){ UserDao userDao = new UserDao(); for(int i = 0; i < 30; i++){ User user = new User();
user.setName("张"+i); userDao.add(user);
}
} }
谢谢观看!
【hibernate】<第一节>hibernate简单入门的更多相关文章
- 第一节 Hibernate 基本配置
1 新建maven工程 1)打开eclipse,依次点击File---->New---->Maven Project. 2)选择org.apache.maven.archetypes ma ...
- 第一节:简单的请求(Requests)和响应(Responses)
目录 创建项目 开发服务器 创建名称为Polls的应用 编写你的第一个视图 创建项目 在命令行中,使用cd命令进入到你想要存储你的项目的目录,然后运行下面的命令: $ django-admin sta ...
- 第一节:mybatis入门
1.新建数据表 本次测试使用mysql数据,数据库名称为mybatis,新建一张表person,建表语句如下: CREATE TABLE `person` ( `id` ) PRIMARY KEY a ...
- 安全测试6_Web安全工具第一节(浏览器入门及扩展)
今天来学习下浏览器的功能,浏览器是我们经常用到但是功能却很强大的一个东东,我们经常用到的无非是三种(谷歌.火狐.IE) 1.浏览器功能介绍: 下面以谷歌浏览器(Chrome版本为56)为例,介绍下,懂 ...
- 第一节:Vuejs入门之各种指令
一. 简介 Vue (读音 /vjuː/,类似于 view) 是一套用于构建用户界面的渐进式框架.与其它大型框架不同的是,Vue 被设计为可以自底向上逐层应用.Vue 的核心库只关注视图层,不仅易于上 ...
- hibernate多对多 一对多 及简单入门 主键生成策略
Hibernate简单使用 入门 通过hibernate的 一对多 多对多轻松看懂hibernate配置 (不使用注解) hibernate对jdbc访问数据库的代码进行轻量级封装,简化重复代码 减少 ...
- 框架之 hibernate简单入门
hibernate框架的搭建 Hibernate框架的概述 1. Hibernate框架的概述 * Hibernate称为 * Hibernate是一个开放源代码的对象关系映射(ORM)框架,它对JD ...
- Hibernate第一篇【介绍Hibernate,简述ORM,快速入门】
前言 前面已经学过了Struts2框架了,紧接着就是学习Hibernate框架了-本博文主要讲解介绍Hibernate框架,ORM的概念和Hibernate入门 什么是Hibernate框架? Hib ...
- Hibernate第一天——入门和基本操作
第一个接触的框架就是这个Hibernate框架了,Hibernate本意是 冬眠 ,这里有必要引用CSDN上某位网友某个帖子的评论先引出框架的概念: 框架:一个软件半成品,帮你做了一些基础工作,你就可 ...
随机推荐
- (九)play之yabe项目【发表博文】
(九)play之yabe项目[发表博文] 博客分类: 框架@play framework 发表一篇博文 填充管理页面 从主页链接到管理页面时,只简单显示了登陆用户的名称 现在对显示的内容加以丰富 ...
- javascript-this,call,apply,bind简述2
上节我们一起研究了this这个小兄弟,得出一个结论,this指向调用this所在函数(或作用域)的那个对象或作用域.不太理解的朋友可以看看上节的内容,这次我们主要探讨一下call(),apply(), ...
- HTML <!--...--> 注释 、CSS/JS //注释 和 /*.....*/ 注释
<!-- -->是HTML的注释标签,使用<和>是符合HTML标签语法规则的. /* */(注释代码块).//(注释单行)是CSS和JS的注释标签. 两种注释有各自的使用环境, ...
- SharePoint Server 2010 & WorkFlow related Limits
Today, I have come across different workflow related limits for SharePoint Server 2010. Limit Maximu ...
- Python基础(2)--对象类型
Python使用对象模型来存储数据.构造任何类型的值都是一个对象 所有的Python对象都拥有三个特性:身份.类型.值 身份: 每一个对象都有一个唯一的身份来标志自己,任何对象的身份可以使用内建函数i ...
- 主程序底部TabBar功能跟登录页面布局
1:主程序底部TabBar的功能实现 效果图: 主要代码如下: - (UITabBarController*)setRootVC:(BOOL)bShowCart { //创建一个子控制器 用于显示当前 ...
- IOS 网络浅析-(十三 SDWebImage 实用技巧)
IOS 网络浅析-(十三 SDWebImage 实用技巧) 首先让我描述一下为了什么而产生的实用技巧.(在TableView.CollectionView中)当用户所处环境WiFi网速不够快(不能立即 ...
- 干货-iOS、mac开源项目及库,以后我也会持续更新。
昨晚在网上看的干货,直接分享给大家了,觉得有用的,直接fork吧. https://github.com/Brances/TimLiu-iOS
- android 进程/线程管理(四)----消息机制的思考(自定义消息机制)
关于android消息机制 已经写了3篇文章了,想要结束这个系列,总觉得少了点什么? 于是我就在想,android为什么要这个设计消息机制,使用消息机制是现在操作系统基本都会有的特点. 可是andro ...
- bsearch的溢出问题
在java中为了避免 low+high溢出,可以用无符号右移:正数高位补0,负数高位补1 int mid = (low + high) >>> 1; 如果是在c++中,那么需要先转换 ...