hibernate06--参数的绑定
创建Dept实体类 以及 对应的 Dept.hbm.xml文件
/** * @author 小豆腐 * *部门的实体类 */ public class Dept { private Integer deptNo; //部门编号 private String dName; //部门名称 private String loc; //地址 public Integer getDeptNo() { return deptNo; } public void setDeptNo(Integer deptNo) { this.deptNo = deptNo; } public String getdName() { return dName; } public void setdName(String dName) { this.dName = dName; } public String getLoc() { return loc; } public void setLoc(String loc) { this.loc = loc; } public Dept() { super(); } public Dept(Integer deptNo, String dName, String loc) { super(); this.deptNo = deptNo; this.dName = dName; this.loc = loc; } @Override public String toString() { return "Dept [deptNo=" + deptNo + ", dName=" + dName + ", loc=" + loc + "]"; } }
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="cn.bdqn.bean"> <class name="Dept"> <id name="deptNo"> <generator class="sequence"> <param name="sequence">sq_student_id</param> </generator> </id> <property name="loc"/> <property name="dName"/> </class> </hibernate-mapping>
在hibernate.cfg.xml文件中管理映射文件
<!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="connection.url"> jdbc:oracle:thin:@localhost:1521:orcl </property> <property name="connection.username">t10</property> <property name="connection.password">t10</property> <property name="connection.driver_class"> oracle.jdbc.OracleDriver </property> <!--方言 --> <property name="dialect"> org.hibernate.dialect.Oracle9Dialect </property> <property name="show_sql">true</property> <property name="hbm2ddl.auto">update</property> <!--加载我们配置的映射文件 全路径 --> <mapping resource="cn/bdqn/bean/Dept.hbm.xml" /> </session-factory> </hibernate-configuration>
创建对应的测试类
package cn.bdqn.test; import java.util.Iterator; import java.util.List; import oracle.net.aso.s; import org.hibernate.Query; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.Transaction; import org.hibernate.cfg.Configuration; import org.junit.After; import org.junit.Before; import org.junit.Test; import cn.bdqn.bean.Dept; import com.sun.org.apache.bcel.internal.generic.NEW; /** * * @author 小豆腐 * 以后的你,会感谢现在努力的自己!努力!坚持!不放弃! */ public class DeptTest { Configuration configuration = null; SessionFactory sessionFactory = null; Session session = null; Transaction transaction = null; // 测试方法有相同的代码块 @Before public void before() { // 01.加载配置文件(hibernate.cfg.xml) 必须位于src的根目录下 configuration = new Configuration().configure(); // 02.创建会话工厂 设置成单例模式 sessionFactory = configuration.buildSessionFactory(); // 03.通过工厂创建会话session HttpSession(用户session) session = sessionFactory.openSession(); // 04.利用面向对象的思想来操作数据库 增删改都必须开启事务 transaction = session.beginTransaction(); } @After //关闭session public void after(){ //查询中没有session 做非空验证 if (session!=null) { // 05.关闭session session.close(); } } //查询所有 @Test public void test01(){ String hql="from Dept"; Query query = session.createQuery(hql); List list = query.list(); for (Object object : list) { System.out.println(object); } } /** * * 参数类型的绑定 * 01.按照参数的位置进行查询 * 查询deptNo是3的部门信息 */ @Test public void test02(){ String hql="from Dept where deptNo=?"; //创建query对象 Query query = session.createQuery(hql); //根据参数的位置进行赋值 前提要知道参数的类型 01.query.setInteger(0, 3); query.setParameter(0, 3); //查询唯一的结果 Object object = query.uniqueResult(); System.out.println(object); } /** * 02.按照参数的名称进行绑定 (:参数名称) * 查询部门名称为 研发部的 部门信息 */ @Test public void test03(){ String hql="from Dept where dName=:name"; //创建query对象 Query query = session.createQuery(hql); //根据参数的名称进行赋值 01.query.setString("name", "研发部"); query.setParameter("name", "研发部"); //查询唯一的结果 Object object = query.uniqueResult(); System.out.println(object); } /** * 动态的参数绑定 * * 查询部门表中 地址是xx 编号是xxx 部门名称是xxx的 部门信息 * * 这种方式不可取的! 因为把参数都写死了?? * 用户有可能只输入部门名称。。。。。 */ @Test public void test04(){ String hql="from Dept where dName=:name and loc=:location and deptNo=:id "; //创建query对象 Query query = session.createQuery(hql); //根据参数的名称进行赋值 query.setParameter("name", "研发部"); query.setParameter("location", "1楼"); query.setParameter("id", 1); //查询唯一的结果 Object object = query.uniqueResult(); System.out.println(object); } /** * 想实现动态参数的绑定! * 01.得拼接字符串! * 02.类名需要设置别名 */ @Test public void test05(){ //创建部门对象 Dept dept=new Dept(); dept.setdName("研发部"); dept.setLoc("1楼"); String hql="from Dept d where 1=1 "; //创建字符串拼接的对象 StringBuffer buffer=new StringBuffer(hql); //开始拼接 如果部门名称不为空 if (dept.getdName()!=null&&!(dept.getdName().equals(""))) { buffer.append(" and d.dName like :name "); } //如果地址不为空 if (dept.getLoc()!=null&&!(dept.getLoc().equals(""))) { buffer.append(" and d.loc like :location "); } //输出buffer System.out.println(buffer.toString()); //创建query Query query = session.createQuery(buffer.toString()); //绑定参数 推荐时候用参数名称的绑定 query.setParameter("name", "%"+dept.getdName()+"%"); query.setParameter("location", "%"+dept.getLoc()+"%"); List list = query.list(); for (Object object : list) { System.out.println(object); } } /** * 如果参数多的情况下,肯定得使用整个对象来作为参数! * 必须保证 参数的名称 和 属性的名称 完全一致 */ @Test public void test06(){ //创建部门对象 Dept dept=new Dept(); dept.setdName("研发部"); dept.setLoc("1楼"); String hql="from Dept d where 1=1 "; //创建字符串拼接的对象 StringBuffer buffer=new StringBuffer(hql); //开始拼接 如果部门名称不为空 if (dept.getdName()!=null&&!(dept.getdName().equals(""))) { buffer.append(" and d.dName like :dName "); } //如果地址不为空 if (dept.getLoc()!=null&&!(dept.getLoc().equals(""))) { buffer.append(" and d.loc like :loc "); } //输出buffer System.out.println(buffer.toString()); //创建query Query query = session.createQuery(buffer.toString()); //绑定参数 传递整个对象 query.setProperties(dept); List list = query.list(); for (Object object : list) { System.out.println(object); } } /** * 模糊查询 部门信息 */ @Test public void test07(){ String hql="from Dept where dName like :name"; List list = session.createQuery(hql).setParameter("name", "%部%").list(); for (Object object : list) { System.out.println(object); } } /** * 投影查询:就是查询指定的一部分字段! * 01.将每条查询结果封装成Object对象 */ @Test public void test08(){ String hql="select dName from Dept"; //List list = session.createQuery(hql).list(); List<Object> list = session.createQuery(hql).list(); for (Object object : list) { System.out.println(object); } } /** * 02.将每条查询结果封装成Object数组 */ @Test public void test09(){ String hql="select dName,loc from Dept"; /**List<Object> list = session.createQuery(hql).list(); * 运行的结果是 [Ljava.lang.Object;@188db4c0 * 我们发现这个是数组! 所以 Object 写成Object[] */ List<Object[]> list = session.createQuery(hql).list(); for (Object[] object : list) { System.out.println("dName==="+object[0]); System.out.println("loc==="+object[1]); } } /** * 03.将每条查询结果 通过 构造函数 封装成对象! * 001.前提是 类中 必须要有 对应的 构造方法! * 002.参数名称 必须和类中的属性名一致! */ @Test public void test10(){ String hql="select new Dept(deptNo,dName,loc) from Dept"; List<Dept> list = session.createQuery(hql).list(); for (Dept d : list) { System.out.println(d.getdName()); } } /** * 分页查询 * 01.查询总记录数(前提) * 02.每页显示多少数据 * 03.计算总页数 * 04.想查看第几页的内容 * 05.配置query对象的方法参数 * 06.开始查询 * * * 每页显示两条数据 查询第2页的内容 */ @Test public void test11(){ String hql="select count(*) from Dept"; //获取总记录数 int counts=((Long)session.createQuery(hql).uniqueResult()).intValue(); //页大小 int pageSize=2; //求总页数 int totalPage=(counts%pageSize==0)?(counts/pageSize):(counts/pageSize+1); //显示第2页的内容 int pageIndex=1; hql="from Dept";//查询所有 Query query = session.createQuery(hql); //设置方法的参数 从那一条记录开始 query.setFirstResult((pageIndex-1)*pageSize); //每页显示多少条 query.setMaxResults(pageSize); List list = query.list(); for (Object object : list) { System.out.println(object); } } }