初识Hiberante框架和第一个案例
今天想回顾一下一个月前学的hibernate框架,也让我了解了持久层的概念(访问数据库).
一、ORM概念
首先提的是ORM概念,O表示Object,
R表示Relation(关系),关系型数据库,如mysql,oracle等,M表示mapping,ORM连起来对象关系映射.
Hibernate 实现了ORM,解决了两个问题:一是存储:把对象的数据直接保存到数据库中,二是获取,直接从数据库中拿到一个对象,中间必须通过映射这个概念
二、Hibernate HelloWorld案例
搭建一个Hibernate环境,开发步骤:
1. 下载源码
版本:hibernate-distribution-3.6.0.Final
2. 引入jar文件
hibernate3.jar核心 + required 必须引入的(6个) + jpa 目录 + 数据库驱动包
如下图:
3. 写对象以及对象的映射
Employee.java 对象
Employee.hbm.xml 对象的映射 (映射文件)
4. src/hibernate.cfg.xml 主配置文件
-à 数据库连接配置
-à 加载所用的映射(*.hbm.xml)
5. App.java 测试
Employee.java对象
package cn.itcast.a_hello; import java.util.Date; public class Employee { private int empId; private String empName; public int getEmpId() { return empId; } public void setEmpId(int empId) { this.empId = empId; } public String getEmpName() { return empName; } public void setEmpName(String empName) { this.empName = empName; } public Date getEmpDate() { return empDate; } public void setEmpDate(Date empDate) { this.empDate = empDate; } private Date empDate; public Employee() { // TODO Auto-generated constructor stub } @Override public String toString() { return "Employee [empId=" + empId + ", empName=" + empName + ", empDate=" + empDate + "]"; } }
Employee.hbm.xml配置文件
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping SYSTEM "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="cn.itcast.a_hello"> <class name="Employee" table="employee"> <!-- 主键映射值 --> <id name="empId" column="id"> <generator class="native"> </generator> </id> <!-- 非主键映射 --> <property name="empName" column="empName"></property> <property name="empDate" column="empDate"></property> </class> </hibernate-mapping>
hibernate.cfg.xml主配置文件
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd"> <hibernate-configuration> <session-factory name="foo"> <!-- 数据库连接配置 --> <property name="hibernate.connection.driver_class">com.microsoft.sqlserver.jdbc.SQLServerDriver</property> <property name="hibernate.connection.url">jdbc:sqlserver://localhost:1433;DatabaseName=Employee</property> <property name="hibernate.connection.username">sa</property> <property name="hibernate.connection.password">XXXXXX</property> <property name="hibernate.dialect">org.hibernate.dialect.SQLServer2008Dialect</property> <!-- 2.其它配置设置 --> <!-- 2.1设置运行时是否显示执行的sql语句 --> <property name="show_sql">true</property> <!-- 2.2设置运行的sql语句格式化 --> <property name="hibernate.format_sql">true</property> <!-- 2.3设置是否创建表 1.create不存在表直接创建,存在则先删除表再创建表 2.update如果存在就不会创建表,如果不存在则创建 3.create-drop createSessionFactory()时创建表 sf.close()删除表 --> <property name="hibernate.hbm2ddl.auto">create</property> <!-- 加载所有映射 <mapping resource="cn/itcast/a_hello/Employee.hbm.xml"/>--> </session-factory> </hibernate-configuration>
最后的效果:
最后看到数据库多了一条记录
三、Hibeanate的API
|-- Configuration 配置管理类对象
config.configure(); 加载主配置文件的方法(hibernate.cfg.xml)
默认加载src/hibernate.cfg.xml
config.configure(“cn/config/hibernate.cfg.xml”); 加载指定路径下指定名称的主配置文件
config.buildSessionFactory(); 创建session的工厂对象
|-- SessionFactory session的工厂(或者说代表了这个hibernate.cfg.xml配置文件)
sf.openSession(); 创建一个sesison对象
sf.getCurrentSession(); 创建session或取出session对象
|--Session session对象维护了一个连接(Connection), 代表了与数据库连接的会话。
Hibernate最重要的对象: 只用使用hibernate与数据库操作,都用到这个对象
session.beginTransaction(); 开启一个事务; hibernate要求所有的与数据库的操作必须有事务的环境,否则报错!
更新:
session.save(obj); 保存一个对象
session.update(emp); 更新一个对象
session.saveOrUpdate(emp); 保存或者更新的方法:
à没有设置主键,执行保存;
à有设置主键,执行更新操作;
à如果设置主键不存在报错!
配置SessfionFactory
private static SessionFactory sf; //加载配置文件,只执行一次 static{ /** * 创建SessionFactory对象,指定了class对象后就 * 可以不用在主配置文件中指定<mapping resource=""/> */ sf = new Configuration() .configure() .addClass(Employee.class)//(测试)会自动加载Employee.hbm.xml文件,必须和该类在同一包下 .buildSessionFactory(); }
测试保存:
@Test public void testSave() throws Exception{ // TODO Auto-generated method stub //对象 Employee emp = new Employee(); emp.setEmpName("张三"); emp.setEmpDate(new Date()); Session session = sf.openSession(); //开启事务alt+shift+l快速生成左边的变量,但鼠标要放在放在方法后面 Transaction tx = session.beginTransaction(); //保存到数据库 session.save(emp); // session.createQuery("from cn.itcast.c_hbm_config.Employee").list(); //提交事务 tx.commit(); session.close(); }
测试更新
@Test public void testUpdate() { //对象 Employee emp = new Employee(); emp.setEmpName("李四2"); emp.setEmpId(4); //1.创建session Session session = sf.openSession(); //2.开启事务 Transaction tx = session.beginTransaction(); //3.执行更新操作,必须设置主键 //session.update(emp); //根据主键得到对应的对象 Employee employee = (Employee) session.get(Employee.class, 5); System.out.println(employee); //save或者update,当设置主键时,执行更新操作,当没有设置主键时执行插入操作 session.saveOrUpdate(emp); tx.commit(); session.close(); }
四、三种方式查询
一、主键查询:
session.get(Employee.class, 1); 主键查询
session.load(Employee.class, 1); 主键查询 (支持懒加载)
例如:
@Test public void testGet() { Session session = sf.openSession(); //2.开启事务 Transaction tx = session.beginTransaction(); Employee emp = (Employee) session.get(Employee.class,5); System.out.println(emp); tx.commit(); session.close(); }
二、HQL查询:
HQL查询与SQL查询区别:
SQL: (结构化查询语句)查询的是表以及字段; 不区分大小写。
HQL: hibernate query language 即hibernate提供的面向对象的查询语言
查询的是对象以及对象的属性。
区分大小写。优点跨平台
//HQL查询 @Test public void testSQL() { //1.创建session Session session = sf.openSession(); //2.开启事务 Transaction tx = session.beginTransaction(); Query q = session.createQuery("from Employee where id= 2 or id=5"); List<Employee> list = q.list(); System.out.println(list); tx.commit(); session.close(); }
三、Criteria查询:
完全面向对象的查询。
@Test public void testCRQ() { //1.创建session Session session = sf.openSession(); //2.开启事务 Transaction tx = session.beginTransaction(); Criteria crita = session.createCriteria(Employee.class); //查询条件 crita.add(Restrictions.eq("id", 8)); List<Employee> list = crita.list(); System.out.println(list); tx.commit(); session.close(); }
四、本地SQL查询:
复杂的查询,就要使用原生态的sql查询,也可以,就是本地sql查询的支持!
(缺点: 不能跨数据库平台!)
//本地SQL查询 @Test public void testSQL() { //1.创建session Session session = sf.openSession(); //2.开启事务 Transaction tx = session.beginTransaction(); SQLQuery se = session.createSQLQuery("select * from employee"); //查询条件 List<Employee> list = se.list(); System.out.println(list); tx.commit(); session.close(); }
Hibernate 实现分页查询
//HQL实现分页查询 @Test public void testFenYe() { //1.创建session Session session = sf.openSession(); //2.开启事务 Transaction tx = session.beginTransaction(); Query query = session.createQuery("from Employee"); //设置分页参数.起始从零开始 query.setFirstResult(0);//查询的起始记录 query.setMaxResults(4);//查询的记录数 List<Employee> list = query.list(); System.out.println(list); tx.commit(); session.close(); }
值得注意的问题:
共性问题1:
ClassNotFoundException…., 缺少jar文件!
问题2:
如果程序执行程序,hibernate也有生成sql语句,但数据没有结果影响。
问题一般是事务忘记提交…….
遇到问题,一定看错误提示!