使用PreparedStatement執(zhí)行sql增簸淀、刪瓶蝴、改、查語句

StatementPreparedStatement的區(qū)別:
1. PreparedStatement可以寫動態(tài)參數(shù)化的查詢
PreparedStatement你可以寫帶參數(shù)的sql查詢語句租幕,通過使用相同的sql語句和不同的參數(shù)值來做查詢比創(chuàng)建一個(gè)不同的查詢語句要好
2. PreparedStatement比 Statement 更快
PreparedStatement用來執(zhí)行SQL語句查詢的時(shí)候囊蓝。數(shù)據(jù)庫系統(tǒng)會對sql語句進(jìn)行預(yù)編譯處理,預(yù)處理語句將被預(yù)先編譯好令蛉,這條預(yù)編譯的sql查詢語句能在將來的查詢中重用聚霜,這樣一來,它比Statement對象生成的查詢速度更快珠叔。
3. PreparedStatement可以防止SQL注入式攻擊
如果你是做Java web應(yīng)用開發(fā)的蝎宇,那么必須熟悉那聲名狼藉的SQL注入式攻擊。Sony就遭受了SQL注入攻擊祷安,被盜用了一些Sony play station(PS機(jī))用戶的數(shù)據(jù)姥芥。在SQL注入攻擊里,惡意用戶通過SQL元數(shù)據(jù)綁定輸入汇鞭。
例如:

 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非常實(shí)用凉唐,但是它仍有一定的限制庸追。
為了防止SQL注入攻擊,PreparedStatement不允許一個(gè)占位符(台囱?)有多個(gè)值淡溯,在執(zhí)行有IN子句查詢的時(shí)候這個(gè)問題變得棘手起來。
注意:占位符索引位置從1開始簿训,而不是從0開始咱娶。
接下來給大家展示使用使用·PreparedStatement·執(zhí)行sql增、刪强品、改膘侮、查語句的過程:
實(shí)體類

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.加載驅(qū)動
            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 {
//          預(yù)編譯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("數(shù)據(jù)表更新"+count+"條");
        } catch (SQLException e) {
            e.printStackTrace();
        }finally{
            close(null, ps, conn);
        }
        return count==0?false:true;
    }
    /**
     * 查詢?nèi)空Z句
     */
    public static List<Emp> QueryAll(String sql,ResultSet rs){
        conn = getConnection(user, password);
        try {
//          預(yù)編譯sql
            ps=conn.prepareStatement(sql);
//          執(zhí)行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 {
//          預(yù)編譯sql
            ps=conn.prepareStatement(sql);
//          給sql語句占位符賦值
            ps.setObject(1, obj[0]);
//          執(zhí)行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;
    }
    /**
     * 關(guān)閉連接
     */
    public static void close(ResultSet rs,Statement stat,Connection conn){
        try {
//          6.關(guān)閉連接
            if(rs!=null){
                rs.close();
            }
            if(stat!=null){
                stat.close();
            }
            if(conn!=null){
                conn.close();
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}

dao接口的實(shí)現(xiàn)

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{

//  數(shù)據(jù)庫用戶名
    String user = "SCOTT";
//  數(shù)據(jù)庫密碼
    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.加載驅(qū)動
//          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.關(guān)閉連接
        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);
    }
    
    }
}

完整的項(xiàng)目代碼已經(jīng)上傳到github中了,訪問地址:github

QQ截圖20170919143859.png

在學(xué)習(xí)的過程中如果遇到什么問題的榛,歡迎大家提問琼了。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市夫晌,隨后出現(xiàn)的幾起案子表伦,更是在濱河造成了極大的恐慌,老刑警劉巖慷丽,帶你破解...
    沈念sama閱讀 212,816評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異鳄哭,居然都是意外死亡要糊,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,729評論 3 385
  • 文/潘曉璐 我一進(jìn)店門妆丘,熙熙樓的掌柜王于貴愁眉苦臉地迎上來锄俄,“玉大人,你說我怎么就攤上這事勺拣∧淘” “怎么了?”我有些...
    開封第一講書人閱讀 158,300評論 0 348
  • 文/不壞的土叔 我叫張陵药有,是天一觀的道長毅戈。 經(jīng)常有香客問我,道長愤惰,這世上最難降的妖魔是什么苇经? 我笑而不...
    開封第一講書人閱讀 56,780評論 1 285
  • 正文 為了忘掉前任,我火速辦了婚禮宦言,結(jié)果婚禮上扇单,老公的妹妹穿的比我還像新娘。我一直安慰自己奠旺,他們只是感情好蜘澜,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,890評論 6 385
  • 文/花漫 我一把揭開白布施流。 她就那樣靜靜地躺著,像睡著了一般鄙信。 火紅的嫁衣襯著肌膚如雪瞪醋。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 50,084評論 1 291
  • 那天扮碧,我揣著相機(jī)與錄音趟章,去河邊找鬼。 笑死慎王,一個(gè)胖子當(dāng)著我的面吹牛蚓土,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播赖淤,決...
    沈念sama閱讀 39,151評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼蜀漆,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了咱旱?” 一聲冷哼從身側(cè)響起确丢,我...
    開封第一講書人閱讀 37,912評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎吐限,沒想到半個(gè)月后鲜侥,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,355評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡诸典,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,666評論 2 327
  • 正文 我和宋清朗相戀三年描函,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片狐粱。...
    茶點(diǎn)故事閱讀 38,809評論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡舀寓,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出肌蜻,到底是詐尸還是另有隱情互墓,我是刑警寧澤,帶...
    沈念sama閱讀 34,504評論 4 334
  • 正文 年R本政府宣布蒋搜,位于F島的核電站篡撵,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏豆挽。R本人自食惡果不足惜酸休,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,150評論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望祷杈。 院中可真熱鬧斑司,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至僵缺,卻和暖如春胡桃,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背磕潮。 一陣腳步聲響...
    開封第一講書人閱讀 32,121評論 1 267
  • 我被黑心中介騙來泰國打工翠胰, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人自脯。 一個(gè)月前我還...
    沈念sama閱讀 46,628評論 2 362
  • 正文 我出身青樓之景,卻偏偏與公主長得像,于是被迫代替她去往敵國和親膏潮。 傳聞我的和親對象是個(gè)殘疾皇子锻狗,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,724評論 2 351

推薦閱讀更多精彩內(nèi)容

  • JDBC概述 在Java中,數(shù)據(jù)庫存取技術(shù)可分為如下幾類:JDBC直接訪問數(shù)據(jù)庫焕参、JDO技術(shù)轻纪、第三方O/R工具,如...
    usopp閱讀 3,533評論 3 75
  • 生產(chǎn)環(huán)境下一定要考慮使用 PreparedStatement叠纷! JDBC為什么要使用PreparedStateme...
    hongXkeX閱讀 1,281評論 0 2
  • 1. 簡介 1.1 什么是 MyBatis 刻帚? MyBatis 是支持定制化 SQL、存儲過程以及高級映射的優(yōu)秀的...
    笨鳥慢飛閱讀 5,464評論 0 4
  • 這部分主要是開源Java EE框架方面的內(nèi)容涩嚣,包括Hibernate崇众、MyBatis、Spring缓艳、Spring ...
    雜貨鋪老板閱讀 1,357評論 0 2
  • 漸漸的阶淘,漸漸的,我不再聽從別人的安排互妓,不再因他人的綁架而順從溪窒。漸漸的,我開始長大冯勉,我開始去區(qū)分這世界的顏色...
    醉朝歌閱讀 374評論 0 0