01搭建hibernate框架
目錄
4.1編寫javabean配置文件(一個javabean對應一個)
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();
}
}