JDBC代码简化以及PreparedStatement和Statement接口
  1. 抽取
  2. JDBC的Bug

    sql语句可以拼接导致登录功能中如果用户名或者密码中出现'or'2'='2则一定可以登录的bug,Statement有sql注入的危害

    所以有子类PreparedStatement继承Statement

Statement 和 PreparedStatement之间的关系和区别.来自:https://blog.csdn.net/suwu150/article/details/52745055

    关系:PreparedStatement继承自Statement,都是接口

    区别:PreparedStatement可以使用占位符,是预编译的,批处理比Statement效率高    

详解:

1、PreparedStatement:表示预编译的 SQL 语句的对象。

   接口:public interface PreparedStatement extends Statement之间的继承关系

   SQL 语句被预编译并存储在 PreparedStatement 对象中。然后可以使用此对象多次高效地执行该语句。

   注:用于设置 IN 参数值的设置方法(setShort、setString 等等)必须指定与输入参数的已定义 SQL 类型兼容的类型。例如,如果 IN 参数具有 SQL 类型 INTEGER,那么应该使用 setInt 方法,问号的位置也是应该注意的,因为第一个问好的位置为1,第二个问号的位置为2.以此类推。 如果需要任意参数类型转换,使用 setObject 方法时应该将目标 SQL 类型作为其参数。

BaseDao类 增删改抽取到父类中

  1. 7个属性
  2. 三个方法
  • 得到Connection对象方法
  • 增删改的通用方法
  • 关闭方法
除了主函数有输出,其他地方不要有输出
一张表对应一张操作类和一个实体类(实体类放到bean包下)

命名:emp(表)------>EmpDao(操作类)------>Emp(实体类)

类------表名

属性------字段

对象------一条记录

练习:emp表完成增删改查,根据ID查,且使用basedao

package com.alibaba.wlq.dao;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class BaseDao {
    protected String driver = "com.mysql.jdbc.Driver";
    protected String url = "jdbc:mysql://localhost:3306/emp";
    protected String user = "root";
    protected String password = "123456";
    protected Connection conn = null;
    protected PreparedStatement ps = null;
    protected ResultSet rs = null;
    public void getConn() throws Exception{
        Class.forName(driver);
        conn = DriverManager.getConnection(url,user,password);
    }
    public void closeAll() {
        if(rs!=null) {
           try {
               rs.close();
           } catch (SQLException e) {
               e.printStackTrace();
           }
        }
        if(conn!=null) {
           try {
               conn.close();
           } catch (SQLException e) {
               e.printStackTrace();
           }
        }
        if(ps!=null) {
           try {
               ps.close();
           } catch (SQLException e) {
               e.printStackTrace();
           }
        }
    }
    public void edit(String sql,Object...params) {
        try {
           getConn();
           ps = conn.prepareStatement(sql);
           for(int i=0;i<params.length;i++) {
               ps.setObject(i+1, params[i]);
           }
           int <u>a</u> = ps.executeUpdate();
        } catch (SQLException e) {
           e.printStackTrace();
        } catch (Exception e) {
           e.printStackTrace();
        } finally {
           closeAll();
        }
    }
}
package com.alibaba.wlq.dao;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import com.alibaba.wlq.bean.Emp;
public class EmpDao extends BaseDao{
    /**
     * 添加员工信息
     * @param empno    员工编号
     * @param ename    员工姓名
     * @param job  员工职位
     * @param mgr  员工上司
     * @param sal  员工的薪资
     * @param comm 员工的奖金
     * @param deptno   员工所在部门
     */
    public void add(int empno,String ename,String job,int mgr,double sal,double comm,int deptno) {
        String sql = "insert into emp values(?,?,?,?,now(),?,?,?)";
        edit(sql,empno,ename,job,mgr,sal,comm,deptno);
    }
    /**
     * 输入员工编号删除相应的员工信息
     * @param empno
     */
    public void delete(int empno) {
        String sql = "delete from emp where empno = ?";
        edit(sql,empno);
    }
    /**
     * 输入员工编号来修改相对应员工的信息
     * @param empno 员工编号
     * @param ename    员工姓名
     * @param job  员工职位
     * @param mgr  员工领导编号
     * @param sal  员工薪资    
     * @param comm 员工奖金
     * @param depnot   员工所在部门编号
     */
    public void update(int empno,String ename,String job,int mgr,double sal,double comm,int depnot) {
        String sql = "update emp set ename = ?,job = ?,mgr = ?,sal = ?,comm = ?,deptno = ? where empno =?";
        edit(sql,ename,job,mgr,sal,comm,depnot,empno);
    }
    /**
     * 根据员工编号查询员工姓名
     * @param empno 员工编号
     * @return
     */
    public Emp select(int empno) {
        Emp emp = null;
        try {
           getConn();
           String sql = "select * from emp where empno = ?";
           ps = conn.prepareStatement(sql);
           ps.setInt(1, empno);
           rs = ps.executeQuery();
           while(rs.next()) {
               int empno2 = rs.getInt("empno");
               String ename = rs.getString("ename");
               String job = rs.getString("job");
               int mgr = rs.getInt("mgr");
               Date hiredate = rs.getDate("hiredate");
               int sal = rs.getInt("sal");
               int comm = rs.getInt("comm");
               int dept = rs.getInt("deptno"); //数据库中获取字段的值
               //给对象的属性赋值
               emp=new Emp();
               emp.setEmpno(empno2);
               emp.setEname(ename);
               emp.setComm(comm);
               emp.setDeptno(dept);
               emp.setHiredate(hiredate);
               emp.setJob(job);
               emp.setMgr(mgr);
               emp.setSal(sal);
           }
        } catch (SQLException e) {
           e.printStackTrace();
        } catch (Exception e) {
           e.printStackTrace();
        }
        return emp;
    }
    /**
     * 查询所有员工的信息
     * @param sql
     * @param empno
     * @return
     */
    public List<Emp> selectAll(){
        List<Emp> list = new ArrayList<>();
        try {
           getConn();
           String sql = "Select * from emp";
           ps = conn.prepareStatement(sql);
           rs = ps.executeQuery();
           while(rs.next()) {
               Emp emp = new Emp();
               emp.setDeptno(rs.getInt("empno"));
               emp.setEname(rs.getString("ename"));
               emp.setJob(rs.getString("job"));
               emp.setHiredate(rs.getDate("hiredate"));
               emp.setMgr(rs.getInt("mgr"));
               emp.setSal(rs.getDouble("sal"));
               emp.setComm(rs.getDouble("comm"));
               list.add(emp);
           }
        } catch (SQLException e) {
           e.printStackTrace();
        } catch (Exception e) {
           e.printStackTrace();
        }finally {
           closeAll();
        }
        return list;
    }
}
package com.alibaba.wlq.dao;
import java.util.List;
import com.alibaba.wlq.bean.Emp;
public class test {
    public static void main(String[] args) {
        EmpDao emp = new EmpDao();
        //emp.add(10016,"佩奇", "singer",
1001, 10000.0, 10000.0, 10);
        //emp.delete(10016);
        //emp.update(1015,"刘亦菲","演员",
1001, 10000.0, 50000.0, 10);
//      <u>Emp</u> e = emp.select(1001);
//      if(e==null) {
//         System.out.println("该员工编号不存在");
//      }else {
//         System.out.println(e.getEname());
//      }
        List<Emp> list = emp.selectAll();
        for(Emp e:list) {
           if(e==null) {
               System.out.println("该编号的员工不存在");
           }
           else {
               System.out.println(e.getEname());
           }
        }
    }
}
package com.alibaba.wlq.bean;
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(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() {
    }
    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;
    }
}

JDBC代码的优化的更多相关文章

  1. Java开发代码性能优化总结

    代码优化,可能说起来一些人觉得没用.可是我觉得应该平时开发过程中,就尽量要求自己,养成良好习惯,一个个小的优化点,积攒起来绝对是有大幅度效率提升的.好了,将平时看到用到总结的分享给大家. 代码优化的目 ...

  2. 使用元数据简化jdbc代码---查询操作(用到反射)

    使用元数据简化jdbc代码---查询操作(用到反射) 一  思路分析 简化就是把共同的地方提取出来并放到一个方法里,在用到时只要调用就ok了,上一篇介绍了更新的操作,而查询的操作相对来说比较复杂,因为 ...

  3. 针对于Java的35 个代码性能优化总结

    针对于Java的35 个代码性能优化总结前言代码优化,一个很重要的课题.可能有些人觉得没用,一些细小的地方有什么好修改的,改与不改对于代码的运行效率有什么影响呢?这个问题我是这么考虑的,就像大海里面的 ...

  4. Java开发中程序和代码性能优化

    现在计算机的处理性能越来越好,加上JDK升级对一些代码的优化,在代码层针对一些细节进行调整可能看不到性能的明显提升, 但是我觉得在开发中注意这些,更多的是可以保持一种性能优先的意识,对一些敲代码时间比 ...

  5. SparkSQL使用之JDBC代码访问Thrift JDBC Server

    启动ThriftJDBCServer: cd $SPARK_HOME/sbin start-thriftserver.sh & 使用jdbc访问ThriftJDBCServer代码段: pac ...

  6. Python 代码性能优化技巧(转)

    原文:Python 代码性能优化技巧 Python 代码优化常见技巧 代码优化能够让程序运行更快,它是在不改变程序运行结果的情况下使得程序的运行效率更高,根据 80/20 原则,实现程序的重构.优化. ...

  7. Android代码内存优化建议-OnTrimMemory优化

    原文  http://androidperformance.com/2015/07/20/Android代码内存优化建议-OnTrimMemory优化/ OnTrimMemory 回调是 Androi ...

  8. JAVA_eclipse 保留Java文件时自动格式化代码和优化Import

    Eclipse 保存Java文件时自动格式化代码和优化Import Eclipse中format代码的快捷方式是ctrl+shift+F,如果大家想保存 java文件的时候 自动就格式化代码+消除不必 ...

  9. JavaScript代码性能优化总结

    JavaScript 代码性能优化总结 尽量使用源生方法 javaScript是解释性语言,相比编译性语言执行速度要慢.浏览器已经实现的方法,就不要再去实现一遍了.另外,浏览器已经实现的方法在算法方面 ...

随机推荐

  1. Liunx运维(三)-文件过滤及内容编辑处理

    文档目录: 一.cat:合并文件或查看文件内容 二.tac:反向显示文件内容 三.more:分页显示文件内容 四.less:分页显示文件内容 五.head:显示文件头部内容 六.tail:显示文件尾部 ...

  2. sqlserver 汉字转全拼函数

    create function fn_Getquanpin (@str varchar(100)) returns varchar(8000) as begin declare @re varchar ...

  3. Redis 设计与实现 5:压缩列表

    压缩列表是 ZSET.HASH和 LIST 类型的其中一种编码的底层实现,是由一系列特殊编码的连续内存块组成的顺序型数据结构,其目的是节省内存. ziplist 的结构 外层结构 下图展示了压缩列表的 ...

  4. umi-request 统一异常处理实践

    首发于语雀文档 前言 本人在工作中用到了 umi-request,百度谷歌搜了一遍,感觉都没找到超过 3 篇合适且含代码的文章,因此只能自行实践总结了. umi-request 有点不同 umi-re ...

  5. [译] 使用 Espresso 隔离测试视图

    原文地址:Testing Views in Isolation with Espresso 原文作者:Ataul Munim 译文出自:掘金翻译计划 译者:yazhi1992 校对者:lovexiao ...

  6. mysql字符串拼接

    逗号分隔拼接字符串 SELECT group_concat(USER_ID)from rocky_bankinfo         默认大小2014 2).可以简单一点,执行语句,可以设置作用范围   ...

  7. 技术选型关于redis客户端选择

    redis作为分布式缓存框架的首选  相信已经毋庸置疑.能高效.合理的使用好它  必定能提升系统的可用性,高性能.高吞吐量的保障.但选择一个客户端,充分发挥它的能力,就是一个选型问题.现在市场上能选择 ...

  8. eclipse下的jetty远程调试设置

    在windows下的jetty远程调试设置1.首先说明的是windows下的jetty是通过命令java  -jar start.jar来启动的,因此要想设置成远程调试模式,则要改用命令java -X ...

  9. Class 类文件结构

    本文部分摘自<深入理解 Java 虚拟机第三版> 概述 我们知道,Java 具有跨平台性,其实现基础就是虚拟机和字节码存储格式.Java 虚拟机不与 Java 语言绑定,只与 Class ...

  10. 四、hive安装

    一.安装方式(内嵌模式,本地模式远程模式) 安装环境以及前提说明: Hive是依赖于hadoop系统的,因此在运行Hive之前需要保证已经搭建好hadoop集群环境. 本例中使用的hadoop版本为2 ...