使用PreparedStatement执行sql增、删、改、查语句

StatementPreparedStatement的区别:
1. PreparedStatement可以写动态参数化的查询
PreparedStatement你可以写带参数的sql查询语句,通过使用相同的sql语句和不同的参数值来做查询比创建一个不同的查询语句要好
2. PreparedStatement比 Statement 更快
PreparedStatement用来执行SQL语句查询的时候。数据库系统会对sql语句进行预编译处理,预处理语句将被预先编译好,这条预编译的sql查询语句能在将来的查询中重用,这样一来,它比Statement对象生成的查询速度更快。
3. PreparedStatement可以防止SQL注入式攻击
如果你是做Java web应用开发的,那么必须熟悉那声名狼藉的SQL注入式攻击。Sony就遭受了SQL注入攻击,被盗用了一些Sony play station(PS机)用户的数据。在SQL注入攻击里,恶意用户通过SQL元数据绑定输入。
例如:

 sql =  "SELECT * FROM users WHERE name = '" + userName + "' and pw = '"+ passWord +"';"
 恶意填入:
userName = "1' OR '1'='1";
passWord = "1' OR '1'='1";
那么最终SQL语句变成了:
sql = "SELECT * FROM users WHERE name = '1' OR '1'='1' and pw = '1' OR '1'='1';"

PreparedStatement的局限性
尽管PreparedStatement非常实用,但是它仍有一定的限制。
为了防止SQL注入攻击,PreparedStatement不允许一个占位符(?)有多个值,在执行有IN子句查询的时候这个问题变得棘手起来。
注意:占位符索引位置从1开始,而不是从0开始。
接下来给大家展示使用使用·PreparedStatement·执行sql增、删、改、查语句的过程:
实体类

package zr.com.chiansoft.vo;

import java.util.Date;

public class Emp {
    private int empno;
    private String ename;
    private String job;
    private int mgr;
    private Date hiredate;
    private double sal;
    private double comm;
    private int deptno;
    public Emp() {
        super();
        // TODO Auto-generated constructor stub
    }
    public Emp(int empno, String ename, String job, int mgr, Date hiredate, double sal, double comm, int deptno) {
        super();
        this.empno = empno;
        this.ename = ename;
        this.job = job;
        this.mgr = mgr;
        this.hiredate = hiredate;
        this.sal = sal;
        this.comm = comm;
        this.deptno = deptno;
    }
    public Emp(String ename, String job, int mgr, Date hiredate, double sal, double comm, int deptno) {
        super();
        this.ename = ename;
        this.job = job;
        this.mgr = mgr;
        this.hiredate = hiredate;
        this.sal = sal;
        this.comm = comm;
        this.deptno = deptno;
    }
    public int getEmpno() {
        return empno;
    }
    public void setEmpno(int empno) {
        this.empno = empno;
    }
    public String getEname() {
        return ename;
    }
    public void setEname(String ename) {
        this.ename = ename;
    }
    public String getJob() {
        return job;
    }
    public void setJob(String job) {
        this.job = job;
    }
    public int getMgr() {
        return mgr;
    }
    public void setMgr(int mgr) {
        this.mgr = mgr;
    }
    public Date getHiredate() {
        return hiredate;
    }
    public void setHiredate(Date hiredate) {
        this.hiredate = hiredate;
    }
    public double getSal() {
        return sal;
    }
    public void setSal(double sal) {
        this.sal = sal;
    }
    public double getComm() {
        return comm;
    }
    public void setComm(double comm) {
        this.comm = comm;
    }
    public int getDeptno() {
        return deptno;
    }
    public void setDeptno(int deptno) {
        this.deptno = deptno;
    }
    @Override
    public String toString() {
        return "Emp [empno=" + empno + ", ename=" + ename + ", job=" + job + ", mgr=" + mgr + ", hiredate=" + hiredate
                + ", sal=" + sal + ", comm=" + comm + ", deptno=" + deptno + "]";
    }
}

dao接口

package zr.com.chinasoft.dao;

import java.util.List;

import zr.com.chiansoft.vo.Emp;

public interface EmpDao {
    /**
     * 作者:_借东西的小人
     * 向表中增加员工信息
     */
    boolean addEmp(Emp emp);
    /**
     * 通过empno删除员工信息
     */
    boolean deleteByEmpno(int empno);
    /**
     * 通过ename删除员工信息
     */
    boolean deleteByEname(String ename);
    /**
     * 通过empno修改员工信息
     */
    boolean update(Emp emp);
    /**
     * 查询所有员工信息
     */
    List<Emp> QueryEmp();
    /**
     * 通过ename查询员工信息
     */
    List<Emp> QueryEmpByEname(Emp emp);

}

工具类

package zr.com.chiansoft.dbUtils;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import zr.com.chiansoft.vo.Emp;

public class DBUtils {
    static String user = "SCOTT";
    static String password = "TIGER";
    static Connection conn = null;
    static PreparedStatement ps = null;
    /**
     * 获取连接
     */
    public static Connection getConnection(String user,String password){
        Connection conn = null;
        try {
//          1.加载驱动
            Class.forName("oracle.jdbc.driver.OracleDriver");
//          2.获取连接对象
            String url = "jdbc:oracle:thin:@localhost:1521:xe";
            conn = DriverManager.getConnection
                    (url,"SCOTT","TIGER");
//          
        } catch (ClassNotFoundException | SQLException e) {
            e.printStackTrace();
        }
        return conn;
        
    } 
    /**
     * 更新语句
     */
    public static boolean update(String sql,Object obj[]){
        conn = getConnection(user, password);
        int count = 0;
        try {
//          预编译sql
            ps = conn.prepareStatement(sql);
            for(int i=0;i<obj.length;i++){
//              给sql语句占位符赋值
                ps.setObject(i+1, obj[i]);
            }
            count = ps.executeUpdate();
            System.out.println("数据表更新"+count+"条");
        } catch (SQLException e) {
            e.printStackTrace();
        }finally{
            close(null, ps, conn);
        }
        return count==0?false:true;
    }
    /**
     * 查询全部语句
     */
    public static List<Emp> QueryAll(String sql,ResultSet rs){
        conn = getConnection(user, password);
        try {
//          预编译sql
            ps=conn.prepareStatement(sql);
//          执行sql
            rs = ps.executeQuery();
        } catch (SQLException e1) {
            e1.printStackTrace();
        }
        List<Emp> list = new ArrayList<>();
        try {
            //遍历rs
            while(rs.next()){
            int empno = rs.getInt(1);
            String ename1 = rs.getString(2);
            String job = rs.getString(3);
            int mgr = rs.getInt(4);
            Date hiredate = rs.getDate(5);
            double sal = rs.getDouble(6);
            double comm = rs.getDouble(7);
            int deptno = rs.getInt(8);
            Emp emp = new Emp(empno,ename1, job, mgr, hiredate, sal, comm, deptno);
            list.add(emp);
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return list;
    }
    /**
     *按照条件查询语句
     */
    public static List<Emp> Query(String sql,ResultSet rs,Object obj[]){
        conn = getConnection(user, password);
        try {
//          预编译sql
            ps=conn.prepareStatement(sql);
//          给sql语句占位符赋值
            ps.setObject(1, obj[0]);
//          执行sql
            rs = ps.executeQuery();
            
        } catch (SQLException e1) {
            e1.printStackTrace();
        }
        List<Emp> list = new ArrayList<>();
        try {
//          遍历rs
            while(rs.next()){
            int empno = rs.getInt(1);
            String ename1 = rs.getString(2);
            String job = rs.getString(3);
            int mgr = rs.getInt(4);
            Date hiredate = rs.getDate(5);
            double sal = rs.getDouble(6);
            double comm = rs.getDouble(7);
            int deptno = rs.getInt(8);
            Emp emp = new Emp(empno,ename1, job, mgr, hiredate, sal, comm, deptno);
            list.add(emp);
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return list;
    }
    /**
     * 关闭连接
     */
    public static void close(ResultSet rs,Statement stat,Connection conn){
        try {
//          6.关闭连接
            if(rs!=null){
                rs.close();
            }
            if(stat!=null){
                stat.close();
            }
            if(conn!=null){
                conn.close();
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}

dao接口的实现

package zr.com.chiansoft.dao.impl;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;

import zr.com.chiansoft.dbUtils.DBUtils;
import zr.com.chiansoft.vo.Emp;
import zr.com.chinasoft.dao.EmpDao;

public class EmpDaoImpl implements EmpDao{

//  数据库用户名
    String user = "SCOTT";
//  数据库密码
    String password = "TIGER";
    Connection conn = null;
    PreparedStatement ps = null;
    ResultSet rs = null;
    boolean re = false;
    int count = 0;
    List<Emp> list = new ArrayList<Emp>();
    
    /**
     * 向表中增加员工信息
     */
    @Override
    public boolean addEmp(Emp emp) {
//          1.加载驱动
//          2.获取连接对象
//          3.编写sql语句
            String sql = "insert into emp (empno,ename,job,mgr,hiredate,sal,comm,deptno) "
                    + "values (?,?,?,?,?,?,?,?)";
            Object obj[] = {emp.getEmpno(),emp.getEname(),emp.getJob(),emp.getMgr(),
                        emp.getHiredate(),emp.getSal(),emp.getComm(),emp.getDeptno()}; 
            DBUtils.update(sql, obj);
//      6.关闭连接
        DBUtils.close(null, ps, conn);
        return re;
    }

    /**
     * 通过empno删除员工信息
     */
    @Override
    public boolean deleteByEmpno(int empno) {
        String sql = "delete from emp where empno=?";
        Object obj[] = {empno};
        re = DBUtils.update(sql, obj);
        DBUtils.close(null, ps, conn);
        return re;
    }
    
    /**
     * 通过ename删除员工信息
     */
    @Override
    public boolean deleteByEname(String ename) {
            String sql = "delete from emp where ename=?";
            Object obj[] = {ename};
            re = DBUtils.update(sql, obj);
            DBUtils.close(null, ps, conn);
        return re;
    }

    /**
     * 通过empno修改员工信息
     */
    @Override
    public boolean update(Emp emp) {
        String sql = "update emp set ename=?,job=?,mgr=?,hiredate=?,sal=?,comm=?,deptno=? where empno=?";
        Object obj[] = {emp.getEname(),emp.getJob(),emp.getMgr(),
                    emp.getHiredate(),emp.getSal(),emp.getComm(),emp.getDeptno(),emp.getEmpno()}; 
        re = DBUtils.update(sql, obj);
        DBUtils.close(null, ps, conn);
        return re;
    }

    /**
     * 查询所有员工信息
     */
    @Override
    public List<Emp> QueryEmp() {
        String sql = "select * from emp";
        list = DBUtils.QueryAll(sql,rs);
        DBUtils.close(rs, ps, conn);
        return list;
    }

    /**
     * 通过ename查询员工信息
     */
    @Override
    public List<Emp> QueryEmpByEname(Emp emp) {
        String sql = "select * from emp where ename=?";
        Object []obj = {emp.getEname()};
        list = DBUtils.Query(sql,rs,obj);
        DBUtils.close(rs, ps, conn);
        return list;
    }


}

测试类

package zr.com.chinasoft.test;

import java.sql.Date;
import java.util.List;

import zr.com.chiansoft.dao.impl.EmpDaoImpl;
import zr.com.chiansoft.vo.Emp;
import zr.com.chinasoft.dao.EmpDao;
public class EmpTest {
    
public static void main(String[] args) {
    EmpDao dao = new EmpDaoImpl();
    Emp emp = new Emp();
    
    System.out.println("添加员工测试");
    emp.setEmpno(1122);
    emp.setEname("lilil");
    emp.setJob("Cliker");
    emp.setHiredate(Date.valueOf("2017-05-05"));
    emp.setSal(1111);
    emp.setComm(100);
    emp.setDeptno(10);
    dao.addEmp(emp);
    
    System.out.println("通过empno删除员工信息测试");
    dao.deleteByEmpno(1122);
    
    System.out.println("通过ename删除员工信息测试");
    dao.deleteByEname("狼狼");
    
    System.out.println("通过empno修改员工信息测试");
    emp.setEmpno(1000);
    emp.setEname("泡泡");
    emp.setJob("Mouse");
    emp.setMgr(100);
    emp.setHiredate(Date.valueOf("1999-9-9"));
    emp.setSal(6666);
    emp.setComm(666);
    emp.setDeptno(10);
    dao.update(emp);
    
    System.out.println("查询所有员工信息测试");
    List<Emp> list = dao.QueryEmp();
    for(Emp empInfo:list){
        System.out.println(empInfo);
    }
    
    System.out.println("通过ename查询员工信息测试");
    emp.setEname("韩跑跑");
    List<Emp> list1 = dao.QueryEmpByEname(emp);
    for(Emp empInfo:list1){
        System.out.println(empInfo);
    }
    
    }
}

完整的项目代码已经上传到github中了,访问地址:github

QQ截图20170919143859.png

在学习的过程中如果遇到什么问题,欢迎大家提问。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,311评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,339评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,671评论 0 342
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,252评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,253评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,031评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,340评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,973评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,466评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,937评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,039评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,701评论 4 323
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,254评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,259评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,485评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,497评论 2 354
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,786评论 2 345

推荐阅读更多精彩内容

  • JDBC概述 在Java中,数据库存取技术可分为如下几类:JDBC直接访问数据库、JDO技术、第三方O/R工具,如...
    usopp阅读 3,527评论 3 75
  • 生产环境下一定要考虑使用 PreparedStatement! JDBC为什么要使用PreparedStateme...
    hongXkeX阅读 1,267评论 0 2
  • 1. 简介 1.1 什么是 MyBatis ? MyBatis 是支持定制化 SQL、存储过程以及高级映射的优秀的...
    笨鸟慢飞阅读 5,425评论 0 4
  • 这部分主要是开源Java EE框架方面的内容,包括Hibernate、MyBatis、Spring、Spring ...
    杂货铺老板阅读 1,344评论 0 2
  • 渐渐的,渐渐的,我不再听从别人的安排,不再因他人的绑架而顺从。渐渐的,我开始长大,我开始去区分这世界的颜色...
    醉朝歌阅读 371评论 0 0