Hibernate学习过程-1-创建第一个Hibernate-CURD项目
来源:互联网 发布:下载淘宝旺旺卖家版 编辑:程序博客网 时间:2024/04/25 05:15
Hibernate学习过程-1-创建第一个Hibernate-CURD项目
提笔之际
经过半年间断性地学习JavaSE, 到了本月,刚好系统地学完了JavaSE中的内容,Java是我第二个系统地学习完的编程语言,我的第一门系统地学完的编程语言是PHP;既然 JavaSE基础知识学完了,那么便要开始接触一些流行的Java开发时可能会使用框架了;于是就往图书馆跑,一眼看到Hibernate并喜欢上了它; 于是,弃用Eclipse,装上高大上的MyEclipse 2014,好戏开场了~
Hibernate简介
ORM的概念
O: Object 对象
R: Ralationship 关系
M: Mapping 映射
把一个关系型的数据库描述成一个对象,通过映射的方式
jdbc的缺点
1、代码比较繁琐
2、sql语句平台的移植性不是很强
3、没有data pool(数据缓存)
4、当jdbc调用mysql的存储过程的时候,存储过程本身移植性比较差
5、没有做到面向对象开发
hibernate优点
1、面向对象的编程
2、代码比较简单
3、具有缓存:一级缓存、二级缓存、查询缓存 命中率的概念
4、移植性比较强
hibernate的缺点
1、支持的分布式事务比较弱
2、如果一张表的数据有千万级别,不适合用hibernate来做
3、如果表之间的关系相当复杂,不适合用hibernate来做
导入jar包(可省略)
下图列的是常用包,红点表示必备包;
将工程转换为Hibernate工程
选择Hibernate版本:
可以不Create SessionFactory class,因为后面我们自己写一个
配置数据库连接(或者取消Specify database…前面的勾勾,暂不配置数据库连接)
导入Hibernate常用类库(若前面已导入jar包,则无需再导入,即去除所有勾勾),
这里使用了MySQL数据库,所以还要额外导入mysql-connector-java-5.1.10-bin.jar
finish向导后创建一个数据库
编辑Hibernate配置文件:
如果前面没有配置数据库连接,那么点击Db Driver右侧的new按钮创建一个Driver,勾选上Save password就是记住密码;
在Properties中Add一个property:
到了这里,Hibernate的配置就差不多完成了,接下来对Hibernate的配置文件做个解释
<?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> <!-- 一个sessionFactory就代表一个数据库的描述 --><session-factory> <!-- 链接数据库的用户名 --> <property name="connection.username">hibernate</property> <!-- 链接数据库的密码 --> <property name="connection.password">test</property> <!-- 链接数据库的驱动 --> <property name="connection.driver_class"> com.mysql.jdbc.Driver </property> <!-- 链接数据库的url --> <property name="connection.url"> jdbc:mysql://localhost:3306/hibernate_test </property> <!-- 方言 告诉hibernate用什么样的数据库,将来会生成什么样的sql语句 --> <property name="dialect"> org.hibernate.dialect.MySQLDialect </property> <!-- hibernate对表的策略 validate 在hibernate容器启动的时候,根据映射文件和持久化类校验表 create 每次当hibernate启动的时候,都会根据持久化类和映射文件创建表 create-drop 每次当hibernate启动的时候,都会根据持久化类和映射文件创建表,销毁的时候删除表 update 检查,如果和映射文件不一致,则更新表的结构,如果没有表,则会创建表 --> <property name="hbm2ddl.auto">update</property></session-factory></hibernate-configuration>
编写代码
1、编写取得Session的类HibernateSessionFactory
package com.test.util; import org.hibernate.HibernateException; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.cfg.Configuration; public class HibernateSessionFactory{ //创建常量保存SessionFactory, //Hibernate对数据库的操作是通过Session来实现的, //而Session是从SessionFactory中得到的 //因为SessionFactory是线程安全的,所以将其定义成常量 private static final SessionFactory sessionFactory; //使用静态代码块初始化sessionFactory,因为静态代码块只会执行一次,在类加载时执行, //所以将其放在静态代码块中初始化正符合需求 static{ try{ //这句话访问了Hibernate.cfg.xml文件,然后构建出一个SessionFactory sessionFactory = new Configuration().configure(). buildSessionFactory(); }catch(HibernateException he){ System.err.println("SessionFactory建立失败。" + he.getMessage()); throw new RuntimeException("SessionFactory建立失败。" + he.getMessage(),he); } } /** * 取出一个Session对象的方法 * @return 一个Session对象 */ public static Session currentSession(){ return sessionFactory.openSession(); } /** * 关闭Session的方法 * @param s 要关闭的Session对象 */ public static void closeSession(Session s){ if(null!=s) s.close(); } }
2、编写持久化类Student
Student类中的字段与数据表Student中的字段相对应,字段名可不相同,若不相同,需要在Student.hbm.xml指定。
Student类是一个Bean类,因此只要创建好字段,然后用IDE生成getter和setter方法就完成了。
package model; public class Student { private String id; private String name; private String cardId; private int age; public String getId() { return id; } public void setId(String id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getCardId() { return cardId; } public void setCardId(String cardId) { this.cardId = cardId; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } }
3、为Student类创建一个与数据库表关联起来的映射文件Student.hbm.xml
<?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属性为类的全名 table 表名 默认值:类名 catalog 数据库的名字 --> <class name="model.Student"> <!-- id为主键元素 name 标示符属性对应Student中的字段 length 数据库中pid的长度 column 对应数据库中的字段,若相同可省略 type 类型 --> <id name="id" column="sid"> <!-- 主键的产生器 需要通过什么样的方式产生主键 --> <generator class="uuid.hex"></generator> </id> <!-- 代表一般的属性 --> <property name="cardId" type="java.lang.String"></property> <property name="name" type="java.lang.String"></property> <property name="age" type="java.lang.Integer"></property> </class> </hibernate-mapping>
4、编写操作数据库的类StudentDAOImp
package com.test.util;import java.util.List;import model.Student;import org.hibernate.HibernateException;import org.hibernate.Query;import org.hibernate.Session;import org.hibernate.Transaction;public class StudentDAOImp { static Session session = null; /** * 创建新的学生对象 * @param stu Student对象 */ public static void createStu(Student stu){ try { //开启连接 session = HibernateSessionFactory.currentSession(); //开启事务 Transaction tx =session.beginTransaction(); session.save(stu); //提交事务 tx.commit(); } catch (HibernateException e) { e.printStackTrace(); } finally{ HibernateSessionFactory.closeSession(session); } } /** * 删除指定学生 * @param id 将被删除学生的id */ public static void delStu(String id){ try{ session = HibernateSessionFactory.currentSession(); Transaction tx = session.beginTransaction(); //从数据库中取出该学生对象 Student stu = (Student)session.get(Student.class, id); //删除此学生 session.delete(stu); //提交事务 tx.commit(); } catch(HibernateException e){ e.printStackTrace(); } finally{ HibernateSessionFactory.closeSession(session); } } /** * 修改学生对象 * @param stu 修改后的学生对象 */ public static void mdfUpdate(Student stu){ try{ session = HibernateSessionFactory.currentSession(); Transaction tx = session.beginTransaction(); session.update(stu); tx.commit(); } catch(HibernateException e){ e.printStackTrace(); }finally{ HibernateSessionFactory.closeSession(session); } } @SuppressWarnings("unchecked") public static List<Student> getAllStu(){ List<Student> list =null; try { session = HibernateSessionFactory.currentSession(); Transaction tx = session.beginTransaction(); Query q = session.createQuery("from Student"); list = q.list(); tx.commit(); } catch (HibernateException e) { e.printStackTrace(); } finally{ HibernateSessionFactory.closeSession(session); } return list; }}
5、将Hibernate.hbm.xml声明在Hibernate.cfg.xml中
产生的代码:
<mapping resource="model/Student.hbm.xml" />
6、编写业务逻辑处理类BM
package BusinessManager;import java.util.List;import model.Student;import org.junit.Test;import com.test.util.StudentDAOImp;public class BM { @Test public void addStuTest(){ //创建新的学生对象 Student stu = new Student(); stu.setName("TC"); stu.setAge(21); stu.setCardId("1411302103008"); StudentDAOImp.createStu(stu); } @Test public void mdfStuTest(){ List<Student> list = StudentDAOImp.getAllStu(); Student stu = list.get(0); stu.setName("newName"); stu.setCardId("jsdlkf"); if(stu.getAge()<50)//进行业务处理 stu.setAge(18); StudentDAOImp.mdfUpdate(stu); } @Test public void delStuTest(){ List<Student> list = StudentDAOImp.getAllStu(); Student stu = list.get(0); StudentDAOImp.delStu(stu.getId()); }}
7、使用Junit测试BM类中的方法
常见错误解决方案
1、在测试过程中如果出现下图的情况,则是MySQL驱动包没导入,应该将mysql-connector-java-5.1.10-bin.jar导入工程中:
第一、二行警告是因为没有配置log4j产生的,暂且不管。
导入包方法如下:
2、如果控制台输出如下异常
原因是没有设置hibernate对表的策略,解决方案,在hibernate.cfg.xml文件中进行如下操作
或者在<session-factory>
节点内添加如下代码
<property name="hbm2ddl.auto">update</property>
测试前的准备
1、为了能看到Hibernate操作数据库时产生的SQL语句,我们在hibernate.cfg.xml中添加如下Property:
2、打开MyEclipseDatabaseExplorer视图,若左边DB Browser没有一个数据库Driver,则是之前没创建,此时创建一个Driver
测试添加数据
右键点击方法名:
其余方法同样测试。
若进度条为绿色,且控制台输出如下:
则很可能成功了,此时我们打开数据库查看
进行如下操作
直接点击执行按钮
在SQL Result中有如下显示便是成功了
测试修改数据:
测试删除数据:
结尾
到这里,一个能成Hibernate的CURD的工程就实现了,在学习的过程中,虽然有书本的指导,但我任然遇到了各种的麻烦,幸亏Java基础还行, 仔细分析了下就逐个解决了,总的来说还是挺顺利的。这是我学习Hibernate的开始,此博客也是我的第一篇博客。写完博客之后发现对 Hibernate的一些基础更加理解了,这里也只是记录了一个基本的操作过程,并没有写下一些概念性的文字,很多细节只能依靠读者自己去了解了。
- Hibernate学习过程-1-创建第一个Hibernate-CURD项目
- 第一个hibernate创建的基本过程
- Hibernate-----第一个hibernate项目
- 创建第一个hibernate
- 第一个hibernate项目
- 第一个hibernate项目
- 第一个hibernate项目
- 第一个hibernate项目
- Hibernate学习笔记之手工创建第一个Hibernate应用
- 创建第一个hibernate程序
- 创建第一个hibernate程序
- Hibernate第一节:第一个Hibernate项目
- 2. 第一个hibernate项目
- Hibernate配置第一个项目
- 《精通Hibernate》学习(1)——第一个Hibernate应用
- Hibernate学习笔记1:第一个Hibernate程序
- Hibernate学习2 -- 第一个Hibernate程序
- Hibernate学习(第一天)--CURD
- 我的爬虫史
- 以道德经来开始我的博客吧
- 黑马程序员——OC学习——block
- iOS系列UI篇——自定义UIButton
- Android最新动画框架完全解析(二)——Transitions Framework(Transitions 框架)
- Hibernate学习过程-1-创建第一个Hibernate-CURD项目
- POJ2352 线状数组与超时
- 【SDOI2013】费用流
- 程序员面试金典算法题
- 常见的Web开发者15条编码原则
- Java_31-40
- 笨小熊
- JS拖拽组件开发
- QEMU简介(三)