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&characterEncoding=utf-8&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&characterEncoding=utf-8&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&characterEncoding=utf-8&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();
}