参数绑定
使用参数绑定的好处有三:
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
}