01搭建hibernate框架
02多表关联关系映射
03hibernate各种查询方式
目录
一、准备好jar包文件
二、新建web项目,导入jar包
三、写javabean和建立数据库表
3.1写javabean
3.2建立数据库和表
四、编写配置文件
4.1编写javabean配置文件(一个javabean对应一个)
4.2编写核心配置文件(一个项目一个)
五、编写测试代码
5.1封装工具类
5.2编写测试代码
5.3 运行测试
六、增删改查api:
6.1 HibernateTest.java(day01一半的重点)
6.2 两个查询接口Query和Criteria简介(day02接口简介)
一、准备好jar包文件
所有文件下载地址:直接下载hibernate01.zip 网盘备份下载
二、新建web项目,导入jar包
ctrl+V复制
三、写javabean和建立数据库表
3.1写javabean
package cn.ahpu.domain; /** * 学生的javabean * @author wwwha * */ public class Student { private Long id; private String name; private Integer age; public Long getId() { return id; } public void setId(Long 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; } }
3.2建立数据库和表
(后期会写配置文件了,就不用建立表了,hibernate根据javabean帮你生成)
win+r->cmd进入命令行
mysql -uroot -proot Create database hibernate01; Use hibernate01; CREATE TABLE student ( `id` bigint(32) NOT NULL AUTO_INCREMENT COMMENT '学生编号(主键)', `name` varchar(32) NOT NULL COMMENT '客户名称(公司名称)', `age` int DEFAULT NULL COMMENT '客户级别', PRIMARY KEY (`id`) );
四、编写配置文件
4.1编写javabean配置文件(一个javabean对应一个)
新建xml,命名为Student.hbm.xml
内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<!-- 约束 使有提示 -->
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="cn.ahpu.domain.Student" table="student">
<!-- java主键属性与表的主键列名对应 -->
<id name="id" column="id">
<generator class="native"/>
</id>
<!-- 其他非主键属性对应的配置 name为类属性名 column为表列名-->
<property name="name" column="name"/>
<property name="age" column="age"/>
</class>
</hibernate-mapping>
4.2编写核心配置文件(一个项目一个)
src根目录下新建xml,命名为hibernate.cfg.xml
内容为:
<?xml version="1.0" encoding="UTF-8"?>
<!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>
<!-- 开发必备四大配置 -->
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:mysql:///hibernate01</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">root</property>
<!-- mysql数据库方言 -->
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
<!-- 打印sql语句以及自动更新表 -->
<property name="hibernate.show_sql">true</property>
<property name="hibernate.format_sql">true</property>
<property name="hibernate.hbm2ddl.auto">update</property>
<!-- 映射配置文件,需要引入映射的配置文件 -->
<mapping resource="cn/ahpu/domain/Student.hbm.xml"/>
</session-factory>
</hibernate-configuration>
五、编写测试代码
5.1封装工具类
新建类HibernateUtils.java
package cn.ahpu.utils;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
public class HibernateUtils {
public static final Configuration CONFIG;
public static final SessionFactory SESSION;
static {
CONFIG = new Configuration().configure();// 别忘记.configure()加载核心xml配置文件
SESSION = CONFIG.buildSessionFactory();// 构造工厂
}
/**
* 从工厂获取session对象
*/
public static Session getSession() {
return SESSION.openSession();
}
}
5.2编写测试代码
package cn.ahpu.test;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.junit.Test;
import cn.ahpu.domain.Student;
import cn.ahpu.utils.HibernateUtils;
public class HibernateTest {
@Test
public void testsave(){
Session session = HibernateUtils.getSession();//获取能操控数据库表的session
Transaction tr = session.beginTransaction();//开启事务
try {
//封装数据
Student stu = new Student();
stu.setName("张三");
stu.setAge(18);//id自动递增千万不要自己设置
//一行代码实现保存
session.save(stu);
tr.commit();//提交事务
} catch (Exception e) {
tr.rollback();
System.out.println("访问数据库失败,已经回滚!");
e.printStackTrace();
}finally{
session.close();
}
}
}
5.3 运行测试
运行结果
若出现乱码:将my.ini里的utf8全部改为gbk,然后重启mysql服务。因为dos窗口默认gbk,
或者利用chcp 65001将dos窗口的编码改为utf8也行 改回来是chcp 936
成功利用hibernate读取了数据库
下面是session的一些具体的增删改查的代码
六、增删改查api:
6.1 HibernateTest.java(day01一半的重点)
package cn.ahpu.test;
import java.util.List;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.junit.Test;
import cn.ahpu.domain.Student;
import cn.ahpu.utils.HibernateUtils;
public class HibernateTest {
/**
* 添加记录
*/
@Test
public void testSave() {
Session session = HibernateUtils.getSession();// 获取能操控数据库表的session
Transaction tr = session.beginTransaction();// 开启事务
try {
Student stu = new Student();
stu.setName("张三");
stu.setAge(18);//id自增 千万别自己set
// 一行代码实现添加
session.save(stu);
tr.commit();// 提交事务
} catch (Exception e) {
tr.rollback();
System.out.println("访问数据库失败,已经回滚!");
e.printStackTrace();
} finally {
session.close();
}
}
/**
* 测试简单查询 通过主键查询一条记录用get就够了
*/
@Test
public void testGet() {
Session session = HibernateUtils.getSession();// 获取能操控数据库表的session
Transaction tr = session.beginTransaction();// 开启事务 查询不需要啥事务的。。。
Student stu = session.get(Student.class, 1L);
System.out.println(stu.getName()+"||"+stu.getAge());
tr.commit();// 提交事务
session.close();
}
/**
* 测试删除 注意hibernate删除前必然先查询
*/
@Test
public void testDel() {
Session session = HibernateUtils.getSession();// 获取能操控数据库表的session
Transaction tr = session.beginTransaction();// 开启事务
try {
//删除id为1的学生记录
Student stu = session.get(Student.class, 1L);
System.out.println("查询到:"+stu.getName());
// 一行代码实现删除
session.delete(stu);
tr.commit();// 提交事务
} catch (Exception e) {
tr.rollback();
System.out.println("访问数据库失败,已经回滚!");
e.printStackTrace();
} finally {
session.close();
}
}
/**
* 测试更新 先插询到javabean 修改javabean的值 再update更新
*/
@Test
public void testUpdate() {
Session session = HibernateUtils.getSession();// 获取能操控数据库表的session
Transaction tr = session.beginTransaction();// 开启事务
try {
//修改id为2的学生记录
Student stu = session.get(Student.class, 2L);
System.out.println("查询到:"+stu.getName());
//修改内容
stu.setAge(20);
// 一行代码实现更新
session.update(stu);
tr.commit();// 提交事务
} catch (Exception e) {
tr.rollback();
System.out.println("访问数据库失败,已经回滚!");
e.printStackTrace();
} finally {
session.close();
}
}
/**
* 保存或修改
* 有则修改 没有添加
*/
@Test
public void testSaveOrUpdate(){
Session session = HibernateUtils.getSession();
Transaction tr = session.beginTransaction();
//添加
/*Student stu = new Student();
stu.setName("李四");//id千万不能自己set
session.saveOrUpdate(stu);*/
//修改
Student stu2 = session.get(Student.class, 3L);//前提已经有3L id的记录 于是可以修改3号学生年龄
stu2.setAge(21);
session.saveOrUpdate(stu2);
tr.commit();
session.close();
}
/**
* 测试查询方法 (get只能简单通过id查询)
* createQuery() -- HQL语句的查询的方式
*
* 后面详细讲解查询
*/
@Test
public void testQuery(){
Session session = HibernateUtils.getSession();
Transaction tr = session.getTransaction();
//创建查询接口 (最简单的一种)
Query query = session.createQuery("from Student");
//查询所有
List<Student> list = query.list();
for (Student stu : list) {
System.out.println(stu.getName()+"\t"+stu.getAge());
}
tr.commit();
session.close();
}
}
6.2 两个查询接口Query和Criteria简介(day02接口简介)
TestQuerySimple.java
package cn.ahpu.test;
import java.util.List;
import org.hibernate.Criteria;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.criterion.Restrictions;
import org.junit.Test;
import cn.ahpu.domain.Student;
import cn.ahpu.utils.HibernateUtils;
/**
* 第二天查询接口的简介 记录一下 最后一天会详细讲解
* query查询接口和Criteria查询接口简介
*/
public class TestQuerySimple {
//TODO query查询接口
/****************************query查询接口***************************/
//1.查询所有记录 query查询接口
@Test
public void TestQuery1(){
Session session = HibernateUtils.getSession();
Transaction tr = session.beginTransaction();
Query query = session.createQuery("from Student");
List<Student> list = query.list();
for (Student stu : list) {
System.out.println(stu.getName()+"\t"+stu.getAge());
}
tr.commit();
session.close();
}
//2.条件查询1 query查询接口
@Test
public void TestQuery2(){
Session session = HibernateUtils.getSession();
Transaction tr = session.beginTransaction();
Query query = session.createQuery("from Student where name=?");
query.setString(0, "张三");//设置第0个?号值为"张三"
List<Student> list = query.list();
for (Student stu : list) {
System.out.println(stu.getName()+"\t"+stu.getAge());
}
tr.commit();
session.close();
}
//3.条件查询2 query查询接口
@Test
public void TestQuery3(){
Session session = HibernateUtils.getSession();
Transaction tr = session.beginTransaction();
Query query = session.createQuery("from Student where name=:aa and age=:bb");
query.setString("aa", "张三");//设置:aa值为"张三"
query.setInteger("bb", 100);//设置:bb值为100
List<Student> list = query.list();
for (Student stu : list) {
System.out.println(stu.getName()+"\t"+stu.getAge());
}
tr.commit();
session.close();
}
//TODO query查询接口
/********************Criteria查询接口(做条件查询非常合适 完全屏蔽了sql语句 各种查询条件都封装了api)****************/
//1.查询所有 Criteria查询接口
@Test
public void testQuery1(){
Session session = HibernateUtils.getSession();
Transaction tr = session.beginTransaction();
Criteria criteria = session.createCriteria(Student.class);
List<Student> list = criteria.list();
for (Student stu : list) {
System.out.println(stu.getName()+"\t"+stu.getAge());
}
tr.commit();
session.close();
}
//2.条件查询1(where name=?) Criteria查询接口
@Test
public void testQuery2(){
Session session = HibernateUtils.getSession();
Transaction tr = session.beginTransaction();
Criteria criteria = session.createCriteria(Student.class);
criteria.add(Restrictions.eq("name", "张三"));
List<Student> list = criteria.list();
for (Student stu : list) {
System.out.println(stu.getName()+"\t"+stu.getAge());
}
tr.commit();
session.close();
}
//2.条件查询2(where name=? and age=?) Criteria查询接口
@Test
public void testQuery3(){
Session session = HibernateUtils.getSession();
Transaction tr = session.beginTransaction();
Criteria criteria = session.createCriteria(Student.class);
criteria.add(Restrictions.eq("name", "张三"));
criteria.add(Restrictions.eq("age", 100));//注意属性名都加""
List<Student> list = criteria.list();
for (Student stu : list) {
System.out.println(stu.getName()+"\t"+stu.getAge());
}
tr.commit();
session.close();
}
//2.条件查询3(其他各种查询条件) Criteria查询接口
@Test
public void testQuery4(){
Session session = HibernateUtils.getSession();
Transaction tr = session.beginTransaction();
Criteria criteria = session.createCriteria(Student.class);
criteria.add(Restrictions.eq("age", 100));
criteria.add(Restrictions.like("name", "张%"));
List<Student> list = criteria.list();
for (Student stu : list) {
System.out.println(stu.getName()+"\t"+stu.getAge());
}
tr.commit();
session.close();
}
}