hibernate学习笔记(八)

参数绑定

使用参数绑定的好处有三:

1. 可读性提高;2 效果高 ;3.防止 sql注入漏洞

这个sql注入指的是:在sql语句中where后边随意写一个根本查不到的查询,然后再在后边接一个or 1 = ‘1’,这样做的话如果你不使用参数绑定会查询出全部的用户信息,这是一个注入漏洞。

参数绑定有两种形式:

第一种形式

Query q=session.createQuery(from Student where sdept=:dept and sage>:age)

其中,dept和age都是我们自己起的变量名,举例:

List<Student> list=session.createQuery("from Student where sdept=:a1 and sage>:sage")
			.setString("a1", "计算机系").setString("sage", "2").list();
注意这里的参数是冒号形式给出的,因此赋值时使用的是setString中的(String,String)形式,而不能使用(Integer,String)这个形式,再举例:

List<Student> list=session.createQuery("from Student where sdept=? and sage>?")
			.setString(0, "计算机系").setString(1, "2").list();
这里如果没有变量名,而知直接以?的形式给出,可以使用integer来表示标号(位置),从而进行赋值


第二种形式:(分开写)

Query query=session.createQuery("from Student where sdept=? and sage>?");
			
			query.setString(0, "计算机系");
			query.setString(1, "2");
			List <Student> list=query.list();
			for(int i=0;i<list.size();i++){
				Student s= list.get(i);
				System.out.println(s.getSname()+" "+s.getSage());
			}



使用参数绑定实现一个增强版的hibernateUtil工具包里的统一查询函数

public static List executeQuery(String hql, String [] paramaters) {
		Session session = null;
		Transaction ts = null;
		List list = null;
		try {			
			session = HibernateUtil.getCurrentSession();
			ts = session.beginTransaction();
			Query query = session.createQuery(hql);
			//通过一个循环做参数绑定
			if (paramaters!=null && paramaters.length>0) {
				for (int i = 0; i < paramaters.length; i++) {
				query.setString(i, paramaters[i]);
				}
			}
			list = query.list();
	
			ts.commit();
			
		} catch (Exception e) {
			if (ts!=null) {
				ts.rollback();
			}
			throw new RuntimeException(e.getMessage());
		}finally{
			if(session!=null&&session.isOpen()){
				session.close();
			}
		}
		return list;
	} 

举例使用方法1(全部查询):

String hql="from Student where sdept=? and sage>?";
		String parameters[]={"计算机系","3"};
		List<Student> list= HibernateUtil.executeQuery(hql,parameters);
		for(Student s: list){
			System.out.println(s.getSname()+" "+s.getSage());
		}

举例使用方法2(部分查询):

String hql="select sname,saddress from Student where sdept=? and sage>?";
		String parameters[]={"计算机系","3"};
		List<Object[]> list= HibernateUtil.executeQuery(hql,parameters);
		for(Object[] s: list){
			System.out.println(s[0].toString()+" "+s[1].toString());
		}



统一的分页查询的方法:(后两个参数的意思是一页几个和查看第几页的内容)

public static List executeQueryByPage(String hql,String [] parameters,int pageSize,int pageNow){
		Session s=null;
		List list=null;
		
		try {
			s=openSession();
			Query query=s.createQuery(hql);
			//先判断是否有参数要绑定
			if(parameters!=null&& parameters.length>0){
				for(int i=0;i<parameters.length;i++){
					query.setString(i, parameters[i]);
				}
			}
			query.setFirstResult((pageNow-1)*pageSize).setMaxResults(pageSize);
			
			list=query.list();
		} catch (Exception e) {
			e.printStackTrace();
			throw new RuntimeException(e.getMessage());
			// TODO: handle exception
		}finally{
			
			if(s!=null&&s.isOpen()){
				s.close();
			}
			
		}
		return list;
	}

使用方法举例:

String hql="select sname,saddress from Student order by sage";
		String parameters[]=null;
		List<Object[]> list= HibernateUtil.
		executeQueryByPage(hql, parameters, 2, 3) ;
		for(Object[] s: list){
			System.out.println(s[0].toString()+" "+s[1].toString());
		}


统一的添加方法

//统一的添加的方法
	public  static void save(Object obj){
		Session s=null;
		Transaction tx=null;
		
		try {
			s=openSession();
			tx=s.beginTransaction();
			s.save(obj);
			tx.commit();
		} catch (Exception e) {
			if(tx!=null){
				tx.rollback();
			}
			throw new RuntimeException(e.getMessage());
			// TODO: handle exception
		}finally{
			if(s!=null && s.isOpen()){
				s.close();
			}
		}
		
	}
使用的小例子:

Course c=new Course();
		c.setCname("servlet");
		c.setCid(4L);
		HibernateUtil.save(c);


统一的修改和删除的方法:

//统一的一个修改和删除(批量 hql) hql"delete upate ...??"
	public static void executeUpdate(String hql,String [] parameters){
		
		Session s=null;
		Transaction tx=null;
		
		try {
			s=openSession();
			tx=s.beginTransaction();
			Query query=s.createQuery(hql);
			//先判断是否有参数要绑定
			if(parameters!=null&& parameters.length>0){
				for(int i=0;i<parameters.length;i++){
					query.setString(i, parameters[i]);
				}
			}
			query.executeUpdate();
			tx.commit();
		} catch (Exception e) {
			e.printStackTrace();
			throw new RuntimeException(e.getMessage());
			// TODO: handle exception
		}finally{
			
			if(s!=null&&s.isOpen()){
				s.close();
			}
			
		}
		
	}

使用小案例:

String hql="update Student set sage=sage+1 where sdept=?";
		String parameters[]={"计算机系"};
		try {
			HibernateUtil.executeUpdate(hql, parameters);
		} catch (Exception e) {
			System.out.println(e.getMessage());
			// TODO: handle exception
		}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值