JDBC代码的优化
JDBC代码简化以及PreparedStatement和Statement接口
- 抽取
- 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类 增删改抽取到父类中
- 7个属性
- 三个方法
- 得到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代码的优化的更多相关文章
- Java开发代码性能优化总结
代码优化,可能说起来一些人觉得没用.可是我觉得应该平时开发过程中,就尽量要求自己,养成良好习惯,一个个小的优化点,积攒起来绝对是有大幅度效率提升的.好了,将平时看到用到总结的分享给大家. 代码优化的目 ...
- 使用元数据简化jdbc代码---查询操作(用到反射)
使用元数据简化jdbc代码---查询操作(用到反射) 一 思路分析 简化就是把共同的地方提取出来并放到一个方法里,在用到时只要调用就ok了,上一篇介绍了更新的操作,而查询的操作相对来说比较复杂,因为 ...
- 针对于Java的35 个代码性能优化总结
针对于Java的35 个代码性能优化总结前言代码优化,一个很重要的课题.可能有些人觉得没用,一些细小的地方有什么好修改的,改与不改对于代码的运行效率有什么影响呢?这个问题我是这么考虑的,就像大海里面的 ...
- Java开发中程序和代码性能优化
现在计算机的处理性能越来越好,加上JDK升级对一些代码的优化,在代码层针对一些细节进行调整可能看不到性能的明显提升, 但是我觉得在开发中注意这些,更多的是可以保持一种性能优先的意识,对一些敲代码时间比 ...
- SparkSQL使用之JDBC代码访问Thrift JDBC Server
启动ThriftJDBCServer: cd $SPARK_HOME/sbin start-thriftserver.sh & 使用jdbc访问ThriftJDBCServer代码段: pac ...
- Python 代码性能优化技巧(转)
原文:Python 代码性能优化技巧 Python 代码优化常见技巧 代码优化能够让程序运行更快,它是在不改变程序运行结果的情况下使得程序的运行效率更高,根据 80/20 原则,实现程序的重构.优化. ...
- Android代码内存优化建议-OnTrimMemory优化
原文 http://androidperformance.com/2015/07/20/Android代码内存优化建议-OnTrimMemory优化/ OnTrimMemory 回调是 Androi ...
- JAVA_eclipse 保留Java文件时自动格式化代码和优化Import
Eclipse 保存Java文件时自动格式化代码和优化Import Eclipse中format代码的快捷方式是ctrl+shift+F,如果大家想保存 java文件的时候 自动就格式化代码+消除不必 ...
- JavaScript代码性能优化总结
JavaScript 代码性能优化总结 尽量使用源生方法 javaScript是解释性语言,相比编译性语言执行速度要慢.浏览器已经实现的方法,就不要再去实现一遍了.另外,浏览器已经实现的方法在算法方面 ...
随机推荐
- rocketMq 消息偏移量 Offset
消息偏移量 Offset queue0 offset 0 0-20 offset 4 20-40 纠错:每条消息的tag对应的HashCode. queue1 offset 1 0-20 ...
- Windows安装VsCode 和Nodejs Vue
一.安装VSCode 1.在官网下载并安装VSCode https://code.visualstudio.com/Download 注意:解压到非系统盘(节约系统盘空间,也方便后面使用) 文件夹最好 ...
- 《改善python程序的91个建议》读书笔记
推荐 <改善Pthon程序的91个建议>是从基本原则.惯用方法.语法.库.设计模式.内部机制.开发工具和性能优化8个方面深入探讨编写高质量python代码的技巧.禁忌和最佳实践. 读书就如 ...
- 通配符的匹配很全面, 但无法找到元素 'dubbo:application' 的声明 解决办法
直接升级dubbo的版本到2.6.4 下面的是我的项目的pom.xml配置的依赖 <dependency> <groupId>com.alibab ...
- navicat12.0.26如何激活
首先准备好所需工具链接:https://pan.baidu.com/s/1EHATRC0M34n-aNteIyBXbw 密码:r7tf 下载后如图分别为64位和32位. 操作时需要断掉网络 Nav ...
- [LeetCode]9. Palindrome Number判断回文数字
/* 查看网上的思路有两种: 1.每次取两边的数,然后进行比较 2.取数的倒置数,进行比较 */ public boolean isPalindrome1(int x) { if (x<0) r ...
- 母鸡下蛋实例:多线程通信生产者和消费者wait/notify和condition/await/signal条件队列
简介 多线程通信一直是高频面试考点,有些面试官可能要求现场手写生产者/消费者代码来考察多线程的功底,今天我们以实际生活中母鸡下蛋案例用代码剖析下实现过程.母鸡在鸡窝下蛋了,叫练从鸡窝里把鸡蛋拿出来这个 ...
- break continue学习
1.break和continue必须使用在循环或者switch语句中 2.当break语句单独存在时.后面不要定义其他语句,因为后面的语句无法执行到 3.break跳出当前所在循环 4.break跳出 ...
- Scrum转型(二) Scrum的角色
1.1 ScurmMaster 作为Scrum流程的捍卫者和布道者,ScrumMaster在Scrum团队中起到至关重要的作用,他们确保团队使用正确的流程,确保团队正确地召开各种会议,他们训练团队的敏 ...
- ORB-SLAM3 细读单目初始化过程(上)
作者:乔不思 来源:微信公众号|3D视觉工坊(系投稿) 3D视觉精品文章汇总:https://github.com/qxiaofan/awesome-3D-Vision-Papers/ 点击上方&qu ...