HIbernate常用的三種查詢


Hibernate三種常用查詢API:標准,HQL,SQL

使用工具:

    1. hibernate的核心jar包及配置文件和映射文件
    1. 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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM