Hibernate三種常用查詢API:標准,HQL,SQL
使用工具:
-
- hibernate的核心jar包及配置文件和映射文件
-
- log4j打印日志文件及jar及配置文件
- 3.eclipse開發,navicat數據庫可視化工具,mysql
- 4.連接數據庫的jar包
- 注:詳細信息頁面最下面(本篇只是初略起稿,不足之處,望幫忙指出,謝謝)
1.標准的查詢:使用hibernate封裝好的方法,完成查詢所需:
1.1查詢所有數據:
public void SelectLike() {
// 獲取session
Session session = HibernateUtil.openSession();
// 查詢主表信息:
Criteria criteria = session.createCriteria(ZJ.class);
//返回查詢結果並返回給集合
List list = criteria.list();
//打印信息
System.out.println(list);
}
1.2精准條件查詢:
@Test
public void SelectLike() {
// 獲取session
Session session = HibernateUtil.openSession();
// 查詢主表信息:
Criteria criteria = session.createCriteria(ZJ.class);
//設置查詢條件:查詢姓名中含有‘張’字的記錄
criteria.add(Restrictions.eq("name" ,"趙小花"));
//返回查詢結果並返回給集合
List list = criteria.list();
//打印信息
System.out.println(list);
}
注:criteria.add()去添加一個標准查詢的限制 ,Restrictions.eq(類的屬性[從查詢類的屬性開始書寫],值):精准查詢{相當於 字段 = 值};
1.2模糊條件查詢:
@Test
public void SelectLike() {
// 獲取session
Session session = HibernateUtil.openSession();
// 查詢主表信息:
Criteria criteria = session.createCriteria(ZJ.class);
//設置查詢條件:查詢姓名中含有‘張’字的記錄
criteria.add(Restrictions.like("name" ,"%張%"));
//返回查詢結果並返回給集合
List list = criteria.list();
//打印信息
System.out.println(list);
}
注:Restrictions.like(類的屬性[從查詢類的屬性開始書寫],值):模糊查詢{相當於 字段 like 值};
1.3分頁查詢:
@Test
public void SelectLimit() {
// 獲取session
Session session = HibernateUtil.openSession();
// 查詢主表信息:
Criteria criteria = session.createCriteria(ZJ.class);
// 放置分頁查詢的起始坐標
criteria.setFirstResult(0);
// 放置每頁查詢記錄記錄數
criteria.setMaxResults(3);
// 返回查詢結果並返回給集合
List list = criteria.list();
}
注:hibernate 的分頁 只能調用查詢的setFirstResult()和setMaxResults()方法
1.4添加大於查詢條件:
@Test
public void SelectByLtId() {
//獲取session
Session session = HibernateUtil.openSession();
//查詢主表信息:
Criteria criteria = session.createCriteria(ZJ.class);
//設置查詢條件:id小於3的記錄
criteria.add(Restrictions.gt("id" ,3));
//返回查詢結果並返回給集合
List list = criteria.list();
}
1.5添加大於查詢條件:
@Test
public void SelectByLtId() {
//獲取session
Session session = HibernateUtil.openSession();
//查詢主表信息:
Criteria criteria = session.createCriteria(ZJ.class);
//設置查詢條件:id小於3的記錄
criteria.add(Restrictions.lt("id" ,3));
//返回查詢結果並返回給集合
List list = criteria.list();
}
1.6范圍條件查詢條件:
@Test
public void SelectById() {
//獲取session
Session session = HibernateUtil.openSession();
//查詢主表信息:
Criteria criteria = session.createCriteria(ZJ.class);
//設置查詢條件:id在2-6的記錄
criteria.add(Restrictions.between("id" ,2,6));
//返回查詢結果並返回給集合
List list = criteria.list();
}
1.7保存信息:
@Test
public void SelectLike() {
// 獲取session
Session session = HibernateUtil.openSession();
//開啟事務
Transaction transaction = session.beginTransaction();
//實例一個存儲的類
ZJ zj = new ZJ();
//設置屬性
zj.setName("趙小花");
//保存
session.save(zj);
//提交事務
transaction.commit();
}
注:如果調用的是sessionFactory.openSession(),操作增刪改時需要開啟事務和提交事務,如果需要持久狀態的對象可以直接提交利用session的一級緩存完成修改操作
1.8:保存信息:
public void SelectLike() {
// 獲取session
Session session = HibernateUtil.openSession();
//開啟事務
Transaction transaction = session.beginTransaction();
//實例一個存儲的類
ZJ zj = new ZJ();
//設置屬性
zj.setId(1);
zj.setName("蘭花指");
//修改
session.update(zj);
//提交事務
transaction.commit();
}
1.9:保存或修改操作:
public void SelectLike() {
// 獲取session
Session session = HibernateUtil.openSession();
//開啟事務
Transaction transaction = session.beginTransaction();
//實例一個存儲的類
ZJ zj = new ZJ();
//設置屬性
zj.setId(1);
zj.setName("蘭花指");
//修改
session.saveOrUpdate(zj);
//提交事務
transaction.commit();
}
注:先判斷時否存在id是否存在,如果在就修改,如果不一樣就添加;
1.10:通過id獲取對應信息:
//方法1:通過get獲取(立即加載)
Session session = HibernateUtil.openSession();
ZJ zj = (ZJ)session.get(ZJ.class,1);
//方法2:通過load獲取(延遲加載)
Session session = HibernateUtil.openSession();
ZJ zj = (ZJ)session.load(ZJ.class,1);
區別:
1.get是立即加載,查詢結果不存在是返回的值為null。load是延遲加載,當查詢結構不存在是會報錯
2.get返回的是一個該類的實例,load返回的是一個代理對象。
1.11:刪除記錄:
@Test
public void deleteAUser() {
// 獲取session
Session session = HibernateUtil.openSession();
//開啟事務
Transaction transaction = session.beginTransaction();
//實例一個存儲的類
User user = new User();
//設置屬性
user.setId(3);
//執行刪除
session.delete(user);
//提交事務並保存到數據庫
transaction.commit();
}
1.12:通過條件查詢獲取唯一結果:
public void SelectLike() {
// 獲取session
Session session = HibernateUtil.openSession();
//查詢主表信息:
Criteria criteria = session.createCriteria(ZJ.class);
//設置查詢條件: 查詢name為‘趙小花’的記錄
criteria.add(Restrictions.eq("name" ,"趙小花"));
//獲取唯一結果並強轉為該類型的數據
ZJ zj = (ZJ)criteria.uniqueResult();
}
注:查詢結果不唯一會報錯,小心使用
Hql語句心得:
概念介紹:
HQl: Hibernate Query Langurage(hibernate查詢語句)。
注:是hibernate框架的一種查詢AIP;主要分為兩種1.hql語句拼接,2.hql占位符:
1.Hql操作單表:
1.1查詢所有記錄:
代碼:
/**
* 簡單查詢所有的user數據
* */
public void findAllUser() {
//實用工具類獲取session
Session session = HibernateUtil.openSession();
//描寫hql語句
String hql = "FROM User";
//創建查詢對象
Query createQuery = session.createQuery(hql);
//獲取結果集
List list = createQuery.list();
//打印結果集
System.out.println(list);
}
結果顯示:
1.2條件查詢記錄(字符串拼接):
@Test
/**
* 條件查詢之模糊查詢1.字符串拼接
* */
public void findUserByLikeName1() {
//實用工具類獲取session
Session session = HibernateUtil.openSession();
String name ="張";
//描寫hql語句
String hql = "FROM User WHERE name like '%" + name + "%' ";
//創建查詢對象
Query createQuery = session.createQuery(hql);
//獲取結果集
List list = createQuery.list();
//打印結果集
System.out.println(list);
}
結果顯示:
注:使用的時候盡量避免,因為拼接過長容易出錯。希望你是大聲一氣呵成。
1.2條件查詢記錄(占位符方式):
@Test
/**
* 條件查詢之模糊查詢2.占位符
* */
public void findUserByLikeName2() {
//實用工具類獲取session
Session session = HibernateUtil.openSession();
//描寫hql語句
String hql = "FROM User WHERE name like ? ";
//創建查詢對象
Query createQuery = session.createQuery(hql)
.setString(0,"%張%");
//獲取結果集
List list = createQuery.list();
//打印結果集
System.out.println(list);
}
結果顯示:
注:
1.使用占位符,下標是從0開始,和底層jdbc查詢對象從1開始進行區分
2.放置類型只有包裝類型和String類型,不想底層的jdbc查詢對象可直接放置object類型
1.3精准條件查詢獲取唯一結果:
@Test
/**
*精准查詢獲取唯一結果:占位符
* */
public void findUserGetOnlyClass() {
//實用工具類獲取session
Session session = HibernateUtil.openSession();
//描寫hql語句
String hql = "FROM User WHERE name = ? ";
//創建查詢對象
Query createQuery = session.createQuery(hql)
.setString(0,"張三");
//獲取唯一結果並進行強制轉換
User user = (User)createQuery.uniqueResult();
//打印結果集
System.out.println(user);
}
結果顯示:
注:當查詢的結果不唯一,而調用uniqueResult()方法會出現如下情況——方法終止,報錯等
1.4:多表聯查
@Test
/**
*多表聯查主表所有信息
* */
public void findAllZJ() {
//實用工具類獲取session
Session session = HibernateUtil.openSession();
//描寫hql語句
String hql = "SELECT z FROM ZJ z,Singer s WHERE z.singer.id = s.id ";
//創建查詢對象
Query createQuery = session.createQuery(hql);
//獲取唯一結果並進行強制轉換
List list = createQuery.list();
//打印結果集
System.out.println(list);
}
結果顯示:
注:.多表查詢時需要從select 開始,否則你有多少個表底層就會幫你查多少個表的信息,其次會將其信息轉為地址:以為是集合嵌套集合的形式出現的不方便使用。圖下表示FROM 書寫的hql的結果:
1.5JOIN 連接查詢:(案例left join)
@Test
/**
*hql left join
* */
public void findAllZJ() {
//實用工具類獲取session
Session session = HibernateUtil.openSession();
//描寫hql語句
String hql = " SELECT z FROM ZJ AS z LEFT JOIN z.singer ";
//創建查詢對象
Query createQuery = session.createQuery(hql);
//獲取唯一結果並進行強制轉換
List list = createQuery.list();
//打印結果集
System.out.println(list);
}
注:
1.查詢時不能使用 on 關鍵字, 因為HQL不能解析 on 關鍵字
2.使用時,從select 寫起,否則會幫你查詢的結果出現集合嵌套集合(即每個相關表的信息多會出現),打印信息也會變成地址,容易造成誤解。
3.寫入查詢的主表,left join 應當書寫 主表實例類中需要聯合查詢的對象
報錯代碼片段:
- unexpected token on:無法解析 on
- Path expected for join! : 不認識left join
報錯原因:無法解析 join 和 on
解決方法:規避刪除 on ,檢查項目,獲將join換成Where條件查詢
1.6刪除:
代碼
@Test
/**
*hql刪除
* */
public void deleteUserByHql() {
//實用工具類獲取session
Session session = HibernateUtil.openSession();
//描寫hql語句
String hql = "delete User WHERE id = ?";
//創建查詢對象
Query createQuery = session.createQuery(hql);
//放置信息
createQuery.setInteger(0, 1);
//執行hql
createQuery.executeUpdate();
}
執行結果:
注:
1.刪改使用的執行方式是executeUpdate();
2.hibernate是面向對象的因此hql不能使用insert進行添加操作
1.7修改:
代碼
@Test
/**
* hql修改
* */
public void updateUserByHql() {
//實用工具類獲取session
Session session = HibernateUtil.openSession();
//描寫hql語句
String hql = "update User set name = ? WHERE id = ?";
//創建查詢對象
Query createQuery = session.createQuery(hql);
//放置信息
createQuery.setString(0, "趙六");
createQuery.setInteger(1, 2);
//執行hql
createQuery.executeUpdate();
}
執行結果:
Sql:
1.1查詢所有記錄:
代碼:
@Test
/**
* 簡單查詢所有的user數據
* */
public void findAllUserBySql() {
//實用工具類獲取session
Session session = HibernateUtil.openSession();
//描寫sql語句
String sql = "select * from t_users7 ";
//創建查詢對象
SQLQuery createSQLQuery = session.createSQLQuery(sql);
//獲取唯一結果並進行強制轉換
List list = createSQLQuery.list();
//打印結果集
System.out.println(list);
}
結果顯示:
注:
1.查詢時需要注入查詢對象的的映射,多表聯查只需要注入主表關系,因為主表已經關聯了其余表單
未加入實體類打印的信息為地址值;(如下所示)
2.和hql語句使用差不多;使用時也分為拼接和占位兩種方法
1.2條件查詢記錄(占位符方式):
@Test
/**
* 條件查詢
* */
public void findAllUserBySql1() {
//實用工具類獲取session
Session session = HibernateUtil.openSession();
//描寫sql語句
String sql = "select * from t_users7 WHERE user_name = ? ";
//創建查詢對象
SQLQuery createSQLQuery = session.createSQLQuery(sql);
//鏈式查詢(將條件全部添加到一條語句上)
createSQLQuery.addEntity(User.class)
.setString(0, "張三");
//獲取唯一結果並進行強制轉換
List list = createSQLQuery.list();
//打印結果集
System.out.println(list);
}
結果顯示:
注:
1.和Hql 的區別是sqlQuery鏈式查詢不能從獲取查詢對象開始時,即本案例的SQLQuery createSQLQuery = session.createSQLQuery(sql);;
1.3多表查詢
@Test
public void findAllZJBySql1() {
//實用工具類獲取session
Session session = HibernateUtil.openSession();
//描寫sql語句
String sql = " select * from t_zjs7 z , t_singers7 s where z.zj_singer_id = s.singer_id ";
//創建查詢對象
SQLQuery createSQLQuery = session.createSQLQuery(sql)
.addEntity(ZJ.class);
//獲取唯一結果並進行強制轉換
List list = createSQLQuery.list();
//打印結果集
System.out.println(list);
}
結果顯示:
1.4添加:
@Test
/**
* sql添加
* */
public void addUser() {
//實用工具類獲取session
Session session = HibernateUtil.openSession();
//描寫sql語句
String sql = "insert into t_users7 (user_id,user_name,user_age)values (null,?,?)";
//創建查詢對象
SQLQuery createSQLQuery = session.createSQLQuery(sql);
//放置條件
createSQLQuery.setInteger(1, 17)
.setString(0, "皮卡丘");
//執行添加語句
createSQLQuery.executeUpdate();
}
結果顯示:
注:
1.增刪改的方法都是executeUpdate()方法執行
2.使用占位符輸出的格式信息都能很好的保密(即客戶端也無法查看完整的語句)。
使用的類
1.實例類:
1.1:歌手類:
public class Singer {
private Integer id;
private String name;
public Singer() {
super();
// TODO Auto-generated constructor stub
}
public Singer(Integer id, String name) {
super();
this.id = id;
this.name = name;
}
@Override
public String toString() {
return "Singer [id=" + id + ", name=" + name + "]";
}
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;
}
}
歌手的配置信息:
<?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="com.web.dto.Singer" table="t_singers7">
<!-- 建立類中的屬性與表中的主鍵對應 -->
<id name="id" column="singer_id" >
<generator class="native"/>
</id>
<!-- 建立類中的普通的屬性和表的字段的對應 -->
<property name="name" column="singer_name"/>
</class>
</hibernate-mapping>
1.2:專輯類:
public class ZJ {
private String name;
private Integer id;
private Date datea;
private Double price;
private Singer singer;
@Override
public String toString() {
return "ZJ [name=" + name + ", id=" + id + ", datea=" + datea + ", price=" + price + ", singer=" + singer + "]";
}
public ZJ(String name, Integer id, Date datea, Double price, Singer singer) {
super();
this.name = name;
this.id = id;
this.datea = datea;
this.price = price;
this.singer = singer;
}
public ZJ() {
super();
// TODO Auto-generated constructor stub
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public Date getDatea() {
return datea;
}
public void setDatea(Date datea) {
this.datea = datea;
}
public Double getPrice() {
return price;
}
public void setPrice(Double price) {
this.price = price;
}
public Singer getSinger() {
return singer;
}
public void setSinger(Singer singer) {
this.singer = singer;
}
}
1.2:專輯類配置信息:
<?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="com.web.dto.ZJ" table="t_zjs7">
<!-- 建立類中的屬性與表中的主鍵對應 -->
<id name="id" column="zj_id" >
<generator class="native"/>
</id>
<!-- 建立類中的普通的屬性和表的字段的對應 -->
<property name="datea" column="zj_datea"/>
<property name="name" column="zj_name"/>
<property name="price" column="zj_price"/>
<many-to-one name="singer" column="zj_singer_id" lazy="false" class="com.web.dto.Singer"></many-to-one>
</class>
</hibernate-mapping>
1.3用戶類:
public class User {
private Integer id;
private String name;
private Integer age;
public User() {
super();
// TODO Auto-generated constructor stub
}
public User(Integer id, String name, Integer age) {
super();
this.id = id;
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "User [id=" + id + ", name=" + name + ", age=" + age + "]";
}
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;
}
}
1.3:用戶類配置信息:
<?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="com.web.dto.User" table="t_users7">
<!-- 建立類中的屬性與表中的主鍵對應 -->
<id name="id" column="user_id" >
<generator class="native"/>
</id>
<!-- 建立類中的普通的屬性和表的字段的對應 -->
<property name="age" column="user_age"/>
<property name="name" column="user_name"/>
</class>
</hibernate-mapping>
hibernate配置:
<?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:///hibernate</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">root</property>
<!-- 配置Hibernate的方言 -->
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
<!-- 可選配置================ -->
<!-- 打印SQL -->
<property name="hibernate.show_sql">true</property>
<!-- 格式化SQL -->
<property name="hibernate.format_sql">true</property>
<!-- 自動創建表 -->
<property name="hibernate.hbm2ddl.auto">update</property>
<!-- 映射文件 -->
<mapping resource="com/web/dto/ZJ.hbm.xml"/>
<mapping resource="com/web/dto/Singer.hbm.xml"/>
<mapping resource="com/web/dto/User.hbm.xml"/>
</session-factory>
</hibernate-configuration>
使用jar包:
日志配置文件:log4j.properties>:
### direct log messages to stdout ###
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.err
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n
### direct messages to file mylog.log ###
log4j.appender.file=org.apache.log4j.FileAppender
log4j.appender.file.File=c\:mylog.log
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n
### set log levels - for more verbose logging change 'info' to 'debug' ###
# error warn info debug trace
log4j.rootLogger= info, stdout