hibernate入门笔记总结

hibernate

hibernate与c3p0dbutils的区别

创建

hibernate的创建
在src下创建hibernate.cfg.xml,配置驱动,数据库url,用户名和密码
<?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>
	<!-- 负责初始化hibernate -->
	<session-factory>
		<!-- 连接数据库驱动 -->
		<property name="hibernate.connection.driver_class">com.mysql.cj.jdbc.Driver</property>
		<!-- 数据库地址 -->
		<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/hibernatelearn?useUnicode=true&amp;characterEncoding=utf-8&amp;serverTimezone=GMT%2B8</property>
		<!-- 数据库用户名 -->
		<property name="hibernate.connection.username">login</property>
		<!-- 数据库密码 -->
		<property name="hibernate.connection.password">123</property>
		<!-- 配置数据库的方言 -->
		<property name="hibernate.dialect">org.hibernate.dialect.MySQL8Dialect</property>
		
		<!-- 映射 -->
		<mapping resource="com/sikiedu/domain/User.hbm.xml"/>
	
	</session-factory>

</hibernate-configuration>
c3p0+dbutils的创建
c3p0连接数据库,dbutils操作数据库

c3p0-config.xml

<?xml version="1.0" encoding="UTF-8"?>
<c3p0-config>

	<default-config>
		<property name="driverClass">com.mysql.cj.jdbc.Driver</property>
		<property name="jdbcUrl">jdbc:mysql://localhost:3306/hibernatelearn?useUnicode=true&amp;characterEncoding=utf-8&amp;serverTimezone=GMT%2B8</property>
		<property name="user">login</property>
		<property name="password">123</property>
		<property name="initialPoolSize">5</property>
		<property name="maxPoolSize">20</property>
	</default-config>

</c3p0-config>

添加实体

hibernate

需要实体与表的映射文件xxx.hbm.xml,需要配置属性与字段的对应,添加主键生成策略

User.java

package com.sikiedu.domain;

public class User {
		private String id;
		private String username;
		private String password;
		private String name;
		private String email;
		private String telephone;
		//此处省略get和set方法以及构造器
}

User.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="com.sikiedu.domain.User"  table="user" >
    		<id name="id" column="id">
    			<!-- 主键  生成策略(手动生成) -->
    			<generator class="assigned"></generator>
    		</id>
    			<!-- 非主键 一一对应 -->
    		<property name="username" column="username"></property>
    		<property name="password" column="password"></property>
    		<property name="name" column="name"></property>
    		<property name="email" column="email"></property>
    		<property name="telephone" column="telephone"></property>
    	</class>
    </hibernate-mapping>
c3p0+dbutils需要实体

操作数据库

hibernate

通过session来去操作数据库(开启事务)。如何操作mysql中的表:不用谢sql语句(hibernate帮你写),而且一样代码解决session

UserDao.java

package com.sikiedu.dao;

import java.sql.SQLException;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;

import com.sikiedu.domain.User;

public class UserDao {
	public void addUser(User user)  {
		//使用hibernate  得到配置信息
		Configuration config=new Configuration().configure();
		//创建sessionFactory对象
		SessionFactory sessionFactory=config.buildSessionFactory();
		//获取session
		Session session=sessionFactory.openSession();
		
		//打开事务
		Transaction transaction=session.beginTransaction();
		//存储user对象
		session.save(user);
		
		//提交事务
		transaction.commit();
		//关闭事务
		session.close();
	}
}
c3p0+dbutils

通过queryrunner来操作数据库.如何操作mysql中的表:需要写sql语句,相对于hibernate会比较麻烦

UserDao.java

package com.sikiedu.dao;

import java.sql.SQLException;

import org.apache.commons.dbutils.QueryRunner;

import com.sikiedu.domain.User;
import com.yl.lain.utils.C3p0DataSourceUtils;

public class UserDao {
	public void addUser(User user) throws SQLException {
		
		QueryRunner runner=new QueryRunner(C3p0DataSourceUtils.getDataSource());
		String sql="insert into user values(?,?,?,?,?,?)";
		runner.update(sql,user.getId(),user.getUsername(),user.getPassword(),user.getName(),user.getEmail(),user.getTelephone());
		
	}
}

使用hibernate和struts开发一个注册(自动建表并插入数据)功能小案例(JavaSE-11&MySql8.0)

创建动态web工程导入相关jar包并buildPath

在这里插入图片描述

在web.xml中配置struts

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
  <display-name>HibernateForum</display-name>
  <filter>
  	<filter-name>struts</filter-name>
  	<filter-class>org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter</filter-class>
  </filter>
  <filter-mapping>
  	<filter-name>struts</filter-name>
  	<url-pattern>/*</url-pattern>
  </filter-mapping>
</web-app>

在src下创建相关的package和类

com.sikiedu.domain

User.java

package com.sikiedu.domain;

public class User {
		private String id;
		private String username;
		private String password;
		private String name;
		private String email;
		private String telephone;
		//此处省略所有属性的get和set方法以及有参构造器
		public User() {
			super();
		}
		
}

User.hbm.xml

注意:class标签的name属性一定要这样写com.sikiedu.domain.User不能写成User否则会报错说找不到User这个class

<?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.sikiedu.domain.User"  table="user" >
    		<id name="id" column="id">
    			<!-- 主键  生成策略(手动生成) -->
    			<generator class="assigned"></generator>
    		</id>
    			<!-- 非主键 一一对应 -->
    		<property name="username" column="username"></property>
    		<property name="password" column="password"></property>
    		<property name="name" column="name"></property>
    		<property name="email" column="email"></property>
    		<property name="telephone" column="telephone"></property>
    	</class>
    </hibernate-mapping>
com.sikiedu.dao

UserDao.java

package com.sikiedu.dao;



import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;

import com.sikiedu.domain.User;

public class UserDao {
	public void addUser(User user)  {
		//使用hibernate  得到配置信息
		Configuration config=new Configuration().configure();
		//创建sessionFactory对象
		SessionFactory sessionFactory=config.buildSessionFactory();
		//获取session
		Session session=sessionFactory.openSession();
		
		//打开事务
		Transaction transaction=session.beginTransaction();
		//存储user对象
		session.save(user);
		
		//提交事务
		transaction.commit();
		//关闭事务
		session.close();
	}
}
com.sikiedu.service

UserService.java

package com.sikiedu.service;

import java.sql.SQLException;

import com.sikiedu.dao.UserDao;
import com.sikiedu.domain.User;

public class UserService {
	public void addUser(User user) throws SQLException {
		UserDao userDao=new UserDao();
		userDao.addUser(user);
	}
}
com.sikiedu.web

UserAction.java

package com.sikiedu.web;

import java.util.UUID;

import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;
import com.sikiedu.domain.User;
import com.sikiedu.service.UserService;

public class UserAction extends ActionSupport implements ModelDriven<User>{
	 
	public User user=new User();
	public String register() throws Exception {
		user.setId(UUID.randomUUID().toString());
		
		UserService userService=new UserService();
		userService.addUser(user);
		return "toLogin";
	}
	@Override
	public User getModel() {
		// TODO Auto-generated method stub
		return user;
	}

}

创建struts.xml和hibernate.cfg.xml

struts.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
	"-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
	"http://struts.apache.org/dtds/struts-2.5.dtd">
	
	<struts>
		<constant name="struts.devMode" value="false"></constant>
		<constant name="struts.enable.DynamicMethodInvocation" value="true"></constant>
		
		<package name="hibernate" namespace="/" extends="struts-default">
			<global-allowed-methods>regex:.*</global-allowed-methods>
			<action name="UserAction_*" class="com.sikiedu.web.UserAction" method="{1}">
				<result name="toLogin" type="redirect">/login.html</result>
			</action>
		
		</package>
	</struts>

hibernate.cfg.xml 注意MySql的方言一定要与本机的MySql版本对应,否则会出错

<?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>
	<!-- 负责初始化hibernate -->
	<session-factory>
		<!-- 连接数据库驱动 -->
		<property name="hibernate.connection.driver_class">com.mysql.cj.jdbc.Driver</property>
		<!-- 数据库地址 -->
		<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/hibernatelearn?useUnicode=true&amp;characterEncoding=utf-8&amp;serverTimezone=GMT%2B8</property>
		<!-- 数据库用户名 -->
		<property name="hibernate.connection.username">login</property>
		<!-- 数据库密码 -->
		<property name="hibernate.connection.password">123</property>
		
		
		<!-- 配置数据库的方言   -->
		<property name="hibernate.dialect">org.hibernate.dialect.MySQL8Dialect</property>
		

		<!-- 将hibernate生成的sql语句打印到控制台 -->
		<property name="hibernate.show_sql">true</property>
		<!-- 格式化hibernate生成的sql语句 -->
		<property name="hiberante.format_sql">true</property>
	
		<!--配置 hibernate自动创建表 
			create:自动创建表,每次框架运行都会创建一张新的表,原来的数据将丢失(开发时)
			create-drop:自动建表,每次框架运行结束都会将所有表删除(开发环境中测试使用)
			update(推荐) 自动生成表,如果表已经存在则更新数据,如果表不存在就会创建一张新的表		
		 -->
		<property name="hibernate.hbm2ddl.auto">update</property>
		
		<!-- 映射文件路径 -->
		<mapping resource="com/sikiedu/domain/User.hbm.xml"/>
	
	</session-factory>

</hibernate-configuration>

在WebContent下创建register.jsp,注册成功后(在数据库中创建user表并导入数据)跳转到login.html

register.jsp

<form action="${pageContext.request.contextPath }/UserAction_register" method="post">
			<div class="register-box">
				<label for="username" class="username_label">
					用 户 名
					<input maxlength="20" name="username" type="text"
						placeholder="您的用户名和登录名" />
				</label>
				<div class="tips">

				</div>
			</div>
			<div class="register-box">
				<label for="username" class="other_label">
					设 置 密 码
					<input maxlength="20" type="password" name="password"
						placeholder="建议至少使用两种字符组合" />
				</label>
				<div class="tips">

				</div>
			</div>
			<div class="register-box">
				<label for="username" class="other_label">
					确 认 密 码
					<input maxlength="20" type="password" placeholder="请再次输入密码" />
				</label>
				<div class="tips">

				</div>
			</div>
			<div class="register-box">
				<label for="username" class="username_label">
					真实姓名
					<input maxlength="20" name="name" type="text"
						placeholder="您的真实姓名" />
				</label>
				<div class="tips">
				</div>
			</div>
			
			<div class="register-box">
				<label for="username" class="username_label">
					邮箱
					<input maxlength="20" name="email" type="text"
						placeholder="您的邮箱" />
				</label>
				<div class="tips">
				</div>
			</div>
			<div class="register-box">
				<label for="username" class="username_label">
					手机号
					<input maxlength="20" name="telephone" type="text"
						placeholder="您的手机号" />
				</label>
				<div class="tips">
				</div>
			</div>
	

			<div class="arguement">
				<input type="checkbox" id="xieyi" />
				阅读并同意
				<a href="javascript:void(0)">《错题用户注册协议》</a>
				<a href="login.html">已有账号,立即登录</a>
				<div class="tips">
				</div>
			</div>
			<div class="submit_btn">
				<button type="submit" id="submit_btn">
					立 即 注 册
				</button>
			</div>
		</form>

在dao中创建增删改查方法

package com.sikiedu.dao;



import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;

import com.sikiedu.domain.User;

public class UserDao {
	public void addUser(User user)  {		
		//使用hibernate  得到配置信息
		Configuration config=new Configuration().configure();
		//创建sessionFactory对象
		SessionFactory sessionFactory=config.buildSessionFactory();
		//获取session
		Session session=sessionFactory.openSession();
		
		//打开事务
		Transaction transaction=session.beginTransaction();
		//存储user对象
		session.save(user);
		
		//提交事务
		transaction.commit();
		//关闭事务
		session.close();
	}
	
	public void deleteUser() {
		Configuration config=new Configuration().configure();
		SessionFactory factory=config.buildSessionFactory();
		Session session=factory.openSession();
		Transaction transaction=session.beginTransaction();
		
		//得到id为 505cd713-6828-4459-bbfc-211fa9d1398c的对象
		User user=session.get(User.class, "505cd713-6828-4459-bbfc-211fa9d1398c");
		session.delete(user);
		transaction.commit();
		session.close();
		
	}
	public void ChangeUser() {
		//读取hibernate.cfg.xml
		Configuration config=new Configuration().configure();
		//获取sessionFactory工厂
		SessionFactory factory=config.buildSessionFactory();
		//获取session
		Session session=factory.openSession();
		//开启事务
		Transaction beginTransaction=session.beginTransaction();
		//获取id为   de95d435-0d85-49a6-8dfb-d9513921c91f的对象
		User user=session.get(User.class, "de95d435-0d85-49a6-8dfb-d9513921c91f");
		user.setUsername("tianjinfeng");
		session.update(user);
		
		beginTransaction.commit();//提交事务
		session.close();//关闭session
		
	}
	public void findUser() {
		Configuration config=new Configuration().configure();
		SessionFactory factory=config.buildSessionFactory();
		Session openSession=factory.openSession();
		Transaction beginTransaction=openSession.beginTransaction();
		User user=openSession.get(User.class, "de95d435-0d85-49a6-8dfb-d9513921c91f");
		System.out.println(user.getName());
		beginTransaction.commit();
		openSession.close();
	}
	
}

实体的创建

  • 提供无参的构造器
  • 成员变量的私有化,提供Get和Set方法,提供属性
  • 尽量使用包装类型
  • 主键
  • 不要加final(hibernate中使用代理机制)

对象的三种状态

  • 瞬时状态:实体 没有id.没有与session关联

  • 持久化状态 特点:持久化状态对象的任何改变都会同步到数据库中
    实体 有id,与session关联

    save方法本质:对象状态的转换 调用save方法变为持久化状态

  • 游离态:实体 有id,没有与session关联

    public void addUser()  {
    		//使用hibernate  得到配置信息
    		Configuration config=new Configuration().configure();
    		//创建sessionFactory对象
    		SessionFactory sessionFactory=config.buildSessionFactory();
    		//获取session
    		Session session=sessionFactory.openSession();
    		
    		//打开事务
    		Transaction transaction=session.beginTransaction();
    		
    		User user=new User();
    		user.setName("lian");//=>没有id 没有与session关联 瞬时状态
    	
    		//存储user对象
    		session.save(user);//有id,与session关联  调用save方法变为持久化状态
    		
    		//提交事务
    		transaction.commit();
    		//关闭事务
    		session.close();//有id  没有与session关联
    		System.out.println(user.getId());
    	}
    

在这里插入图片描述

一级缓存

在这里插入图片描述

事务

事务的性质

  • 原子性:原子不可再分,一个操作不能分为更小的操作,要么全部执行,要么全不执行
  • 一致性:事务在完成时,必须使得所有的数据保持一致的状态(与开始事务保持前一样的状态)
  • 隔离性:事务查看数据时数据所处的状态,要么是另一个并发事务修改它之前的状态,要么是另一并发事务修改它之后的状态,事务不会查看中间状态的数据
  • 持久性:事务完成之后,它对于系统的影响是永久性的。(执行了就执行了,没有撤回)

事务的隔离级别

  • 脏读:读取了未提交事务中的数据
  • 不可重复复读:对于数据库中某个数据,一个事务范围内多次读取同一个数据,却有不同的值
  • 幻读:A事务把money从50修改为100(事务未结束),此时b事务抢到了cpu又把money改为50,然后A事务拿到了cpu资源却发现money是50就产生了幻读。

在这里插入图片描述

配置事务的隔离级别
  • 读未提交:最低的隔离级别,最快但最没用,不能保证避免三种隔离级别
  • 读已提交:可避免脏读,不能避免不可重复读
  • 可重复度:可以避免不可重复读和脏读(mysql默认)
  • 串行化:三种都可以避免,最慢
		<!-- 配置数据库的隔离级别
				1(0001)   读未提交:最低的隔离级别,最快但最没用,不能保证避免三种隔离级别
				2(0010)   读已提交:可避免脏读,不能避免不可重复读
				4(0100)   可重复度:可以避免不可重复读和脏读(mysql默认)
				8(1000)   串行化:三种都可以避免,最慢
		 -->
		<property name="hibernate.connection.isolation">4</property>

提取HibernateUtils工具类

HibernateUtils.java

package com.sikiedu.utils;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;

public class HibernateUtils {
	private static SessionFactory sessionFactory=null;
	//静态代码块只执行一次
	static {
		Configuration config=new Configuration().configure();
		//获取sessionFactory工厂
		sessionFactory=config.buildSessionFactory();
		
	}
	
	public static Session getSession() {
		Session session=sessionFactory.openSession();
		return session;
	}
	
	public  static Session getCurrentSession() {
		return sessionFactory.getCurrentSession();
	}
}

事务小案例

点击按钮,根据id查找user。找到将user的名字改变

在hibernate.cfg.xml中配置事务

	<!-- 配置事务  session与当前线程绑定 -->
	<property name="hibernate.current_session_context_class">thread</property>
		

在UserService.java中的方法添加事务

public void addUser(User user) throws SQLException {
		
		UserDao dao=new UserDao();
		//开启事务
		Session currentSession = HibernateUtils.getCurrentSession();
		Transaction beginTransaction = currentSession.beginTransaction();
		try {
			
			//根据id查找tuser
			User tuser=dao.findUserById("de95d435-0d85-49a6-8dfb-d9513921c91f");
			if(user!=null) {
				//如果找到  根据id修改名字
				dao.ChangeUserByUserId(tuser.getId());
			}else {
				//没找到 不做操作
			}
		}catch (Exception e) {
			e.printStackTrace();
			beginTransaction.rollback();//回滚事务 
		}
		
		//提交事务
		beginTransaction.commit();
		
	}

完善UserDao.java中的两个方法

public User findUserById(String id) {
		//得到同一个Session
		Session session=HibernateUtils.getCurrentSession();
		return session.get(User.class, id);
		
	}
	
public void ChangeUserByUserId(String id) {
		
		Session session=HibernateUtils.getCurrentSession();
		
		//先拿到持久化user
		User user=session.get(User.class, id);
		//改变user
		user.setUsername("jifeng");
		
	}

点击register.jsp页面的按钮,就会把数据库中id为XXX的名字改为jifeng了

HQL查询

HQL不能出现表中的任何内容,它是面向对象的查询

基本查询

//基本查询
	public void search() {
		Session session=HibernateUtils.getSession();
		Transaction beginTransaction=session.beginTransaction();
		
		/
		//操作 select * from user
		String hql="from com.sikiedu.domain.User";
		
		Query query = session.createQuery(hql);
		List<User> list=query.list();//查询多条数据
//		User user=(User) query.uniqueResult();//查询唯一数据
	
		System.out.println(list);
		
		///
		beginTransaction.commit();
		session.close();
	}

条件查询

public void search1() {
		Session session=HibernateUtils.getSession();
		Transaction beginTransaction=session.beginTransaction();
		
		/
		//操作 select * from user  where id=1;
		String hql="from com.sikiedu.domain.User where username='jifeng'";
		Query query = session.createQuery(hql);
		User user=(User) query.uniqueResult();
		
		System.out.println(user.getId());
		
		///
		beginTransaction.commit();
		session.close();
	}

占位符查询

public void search2(String username) {
		Session session=HibernateUtils.getSession();
		Transaction beginTransaction=session.beginTransaction();
		
		/
		//操作 select * from user  where id=1;
		//   ?占位符要从0开始
		String hql="from com.sikiedu.domain.User where username=?0";
		Query query = session.createQuery(hql);
		
		//设置参数
		query.setParameter(0, username);
		User user = (User)query.uniqueResult();
		
		System.out.println(user.getPassword());
		///
		beginTransaction.commit();
		session.close();
	}

在service包中调用

public void test() {
		HQLDao dao=new HQLDao();
		dao.search2("jifeng");
	}

命名占位符查询(推荐)

public void search3(String username) {
		Session session=HibernateUtils.getSession();
		Transaction beginTransaction=session.beginTransaction();
		
		/
		//操作 select * from user  where id=1;
		//  :(冒号)后面的字符串是匹配的字符串
		String hql="from com.sikiedu.domain.User where username= :username";
		Query query = session.createQuery(hql);
		
		//设置参数
		query.setParameter("username", username);
		User user = (User)query.uniqueResult();
		
		System.out.println(user.getEmail());
		///
		beginTransaction.commit();
		session.close();
	}

分页查询 limit ?,?

//分页查询 limit ?,?
	public void search4() {
		Session session=HibernateUtils.getSession();
		Transaction beginTransaction=session.beginTransaction();
		
		/
		//操作 select * from user  limit 1,2;
		String hql="from com.sikiedu.domain.User";
		Query query = session.createQuery(hql);
		query.setFirstResult(1);
		query.setMaxResults(2);
		
		List<User> list = query.list();
		System.out.println(list.get(0).getUsername()+":"+list.get(0).getPassword());
		System.out.println(list.get(1).getUsername()+":"+list.get(1).getPassword());
		///
		beginTransaction.commit();
		session.close();
	}

Criteria查询(推荐)

基本查询

// 基本查询
	public void search() {
		Session session = HibernateUtils.getSession();
		Transaction beginTransaction = session.beginTransaction();

		/
		// 操作 select * from user
		CriteriaBuilder criteriaBuilder = session.getCriteriaBuilder();
		// createQuery -->查询条件(首先要知道查询什么类型数据)
		CriteriaQuery<User> criteria = criteriaBuilder.createQuery(User.class);
		Root<User> root = criteria.from(User.class);
		criteria.select(root);
		// 执行查询
		List<User> resultList = session.createQuery(criteria).getResultList();

		System.out.println(resultList);
		///
		beginTransaction.commit();
		session.close();
	}

条件查询

// 条件查询
	public void search1() {
		Session session = HibernateUtils.getSession();
		Transaction beginTransaction = session.beginTransaction();

		/
		// 操作 select * from user where id=1
		CriteriaBuilder criteriaBuilder = session.getCriteriaBuilder();
		
		// createQuery -->查询条件(首先要知道查询什么类型数据)
		CriteriaQuery<User> criteria = criteriaBuilder.createQuery(User.class);
		Root<User> root = criteria.from(User.class);
		//得到id这一列的id为1
		criteria.select(root).where(root.get("id").in(1));
		// 执行查询
		List<User> resultList = session.createQuery(criteria).getResultList();

		System.out.println(resultList.get(0).getName());//控制台输出daofeng
		///
		beginTransaction.commit();
		session.close();
	}

查询总数

// 查询总数 
	public void search2() {
		Session session = HibernateUtils.getSession();
		Transaction beginTransaction = session.beginTransaction();

		/
		// 操作 select count(*) from user 查询的是个数
		CriteriaBuilder criteriaBuilder = session.getCriteriaBuilder();
		
		// createQuery -->查询条件(首先要知道查询什么类型数据) 返回的是个数  Integer或Long
		CriteriaQuery<Long> criteria = criteriaBuilder.createQuery(Long.class);
		Root<User> root = criteria.from(User.class);//从哪个表去查
		criteria.select(criteriaBuilder.count(root));//聚集查询的方法都在criteriaBuilder类下
		// 执行查询  
		Long count = session.createQuery(criteria).uniqueResult();

		System.out.println(count);
		///
		beginTransaction.commit();
		session.close();
	}

查询带有条件的总数

//查询名字带有feng和密码带有8的人的总数  -- 2
	public void search3() {
		Session session = HibernateUtils.getSession();
		Transaction beginTransaction = session.beginTransaction();

		/
		// 操作 select count(*) from user  where username like '%feng%'
		CriteriaBuilder criteriaBuilder = session.getCriteriaBuilder();
		CriteriaQuery<Long> criteria = criteriaBuilder.createQuery(Long.class);
		Root<User> root = criteria.from(User.class);
		criteria.select(criteriaBuilder.count(root)).where(criteriaBuilder.like(root.get("username"), "%feng%")).where(criteriaBuilder.like(root.get("password"), "%8%"));
		// 执行查询  
		Long count = session.createQuery(criteria).uniqueResult();

		System.out.println(count);
		///
		beginTransaction.commit();
		session.close();
	}

SQL查询(推荐)

基本查询

// 基本查询
	public void fun() {
		Session session = HibernateUtils.getSession();
		Transaction beginTransaction = session.beginTransaction();

		/
		String sql = "select * from user";

		// 创建sql查询对象
		NativeQuery query = session.createSQLQuery(sql);
		// 封装数据
		query.addEntity(User.class);
		// 接收list
		List<User> list = query.list();

		System.out.println(
				list.get(0).getUsername() + "---" + list.get(1).getUsername() + "---" + list.get(2).getUsername());

		/
		beginTransaction.commit();
		session.close();
	}

条件查询

public void fun2() {
		Session session = HibernateUtils.getSession();
		Transaction beginTransaction = session.beginTransaction();

		/

		String sql = "select * from user where id=?";
		// 创建sql查询对象
		NativeQuery query = session.createSQLQuery(sql);
		// 给?赋值 SQL的下标从1开始
		query.setParameter(1, "3");

		// 封装数据
		query.addEntity(User.class);
		// 接收list
		User user = (User) query.uniqueResult();

		System.out.println(user);

		/
		beginTransaction.commit();
		session.close();
	}

分页查询

// SQL分页查询
	public void fun3() {
		Session session = HibernateUtils.getSession();
		Transaction beginTransaction = session.beginTransaction();

		/

		String sql = "select * from user limit ?,?";
		// 创建sql查询对象
		NativeQuery query = session.createSQLQuery(sql);
		// 给?赋值 SQL的下标从1开始
		query.setParameter(1, 0);//注意分页查询这里 第二个参数不能是字符串
		query.setParameter(2, 2);
		query.addEntity(User.class);
		// 接收list
		List<User> list=query.list();

		System.out.println(list+"---"+list.get(0).getUsername()+"---"+list.get(1).getUsername());

		/
		beginTransaction.commit();
		session.close();
	}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值