Statement接口
Statement接口作用
用于进行Java程序和数据库之间的数据传输
具体类有3个实现
Statement
用于对数据库进行通用访问,使用的是静态sql
PreparedStatement
PreparedStatement 用于预编译模板SQL语句,在运行时接受sql输入参数
CallableStatement
要访问数据库存储过程时使用,也可以接受运行时输入参数。
预编译语句
没有预编译语句时,没有预编译语句,所有的sql都是进行拼接
使用预编译语句时
- PreparedStatement 用于预编译模板SQL语句
- 在性能和代码灵活性上有显著地提高
- PreparedStatement 对象使用
?
作为占位符,即参数标记; - 使用
setXXX( index,value)
方法将值绑定到参数中,每个参数标记是其顺序位置引用,注意 index 从 1 开始; executeQuery()
和executeUpdate()
注意,它们都没有参数
executeQuery()
executeUpdate()
内部优化
支持优化情况
- MySql不支持
- Oracle支持
更安全
可以防SQL注入
什么是sql注入
就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令
用户登录
为什么PrepareState就能够防注入
之所以PreparedStatement能防止注入,是因为它把单引号转义了,变成了\'
,这样一来,就无法截断SQL语句,进而无法拼接SQL语句 基本上没有办法注入了。
student.java
package com.iris.jdbc.domain;
public class Student {
Integer id;
String name;
Integer age;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
@Override
public String toString() {
return "Student [id=" + id + ", name=" + name + ", age=" + age + "]";
}
}
IStudentDao.java
package com.iris.jdbc.jao;
import java.util.List;
import com.iris.jdbc.domain.Student;
public interface IStudentDao {
//保存数据
void save(Student stu);
//更新指定学生
void update(int id,Student stu);
//删除指定学生
void delete(int id);
//获取指定学生
public Student get(int id);
//获取所有学生
List<Student>getAll();
}
JDBCUtil.java
package com.iris.jdbc.util;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class JDBCUtil {
public static String driveName = "com.mysql.cj.jdbc.Driver"; //JAVA1.6之后可以不写此语句,根据开发环境类型而定
public static String url = "jdbc:mysql://localhost:3306/jdbc_db?useUnicode=true&characterEncoding=UTF-8&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC"; //url 数据库地址
public static String user="root"; //user 数据库用户名
public static String password="13718407978" ; //password 数据库密码
static{ //静态代码块
try {
Class.forName(JDBCUtil.driveName) ; //JAVA1.6之后可以不写此语句,根据开发环境类型而定
}catch (Exception e) {
e.printStackTrace();
}
}
public static Connection getConn() {
try {
Class.forName(JDBCUtil.driveName) ; //JAVA1.6之后可以不写此语句,根据开发环境类型而定
//连接数据库
return DriverManager.getConnection(JDBCUtil.url, JDBCUtil.user, JDBCUtil.password);
}catch(Exception e) {
e.printStackTrace();
}
return null;
}
public static void close(Connection conn,Statement st, ResultSet res) {
//释放资源
if(res !=null){
try {
res.close();
}
catch(SQLException e) {
e.printStackTrace();
}
}
if(st !=null){
try {
st.close();
}
catch(SQLException e) {
e.printStackTrace();
}
}
if(conn != null) {
try {
conn.close();
}catch(SQLException e) {
e.printStackTrace();
}
}
}
}
StudentDaoImpl.java
package com.iris.jdbc.dao.impl;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;
import com.iris.jdbc.domain.Student;
import com.iris.jdbc.jao.IStudentDao;
import com.iris.jdbc.util.JDBCUtil;
public class StudentDaoImpl implements IStudentDao {
@Override
public void save(Student stu) {
// TODO Auto-generated method stub
Connection conn = null;
PreparedStatement ps = null;
try{
//加载驱动
//连接数据库
conn = JDBCUtil.getConn();
//创建语句
String sql = "insert into student(name,age) values(?,?)";
ps = conn.prepareStatement(sql);
ps.setString(1, stu.getName());
ps.setInt(2, stu.getAge());
System.out.println(sql);
//执行语句
ps.executeUpdate();
} catch(Exception e){
e.printStackTrace();
} finally {
//释放资源
JDBCUtil.close(conn, ps, null);
}
}
@Override
public void update(int id,Student stu) {
// TODO Auto-generated method stub
Connection conn = null;
PreparedStatement ps = null;
try{
//加载驱动
//连接数据库
conn = JDBCUtil.getConn();
//创建语句
String sql = "update student set name=? , age=? where id =? ";
ps = conn.prepareStatement(sql);
ps.setString(1, stu.getName());
ps.setInt(2,stu.getAge());
ps.setInt(3, id);
System.out.println(sql);
//执行语句
ps.executeUpdate();
} catch(Exception e){
e.printStackTrace();
} finally {
//释放资源
JDBCUtil.close(conn, ps, null);
}
}
@Override
public void delete(int id) {
// TODO Auto-generated method stub
Connection conn = null;
PreparedStatement ps = null;
try{
//加载驱动
//连接数据库
conn = JDBCUtil.getConn();
//创建语句
String sql = "delete from student where id = ?";
ps = conn.prepareStatement(sql);
ps.setInt(1, id);
System.out.println(sql);
//执行语句
ps.executeUpdate();
//System.out.println(((JdbcPreparedStatement)ps).getPreparedSql());
} catch(Exception e){
e.printStackTrace();
} finally {
//释放资源
JDBCUtil.close(conn, ps, null);
}
}
@Override
public Student get(int id) {
// TODO Auto-generated method stub
Connection conn = null;
PreparedStatement ps = null;
ResultSet res = null;
try{
//加载驱动
//连接数据库
conn = JDBCUtil.getConn();
//创建语句
String sql = "select * from student where id = ?";
ps = conn.prepareStatement(sql);
ps.setInt(1, id);
System.out.println(sql);
//执行语句
res = ps.executeQuery();
if(res.next()) {
Student stu = new Student();
stu.setName(res.getString("name"));
stu.setAge(res.getInt("age"));
stu.setId(res.getInt("id"));
return stu;
}
} catch(Exception e){
e.printStackTrace();
} finally {
//释放资源
JDBCUtil.close(conn, ps, res);
}
return null;
}
@Override
public List<Student> getAll() {
// TODO Auto-generated method stub
Connection conn = null;
Statement st = null;
ResultSet res = null;
try{
//连接数据库
conn = JDBCUtil.getConn();
//创建语句
st = conn.createStatement();
String sql = "select * from student";
System.out.println(sql);
//执行语句
res = st.executeQuery(sql);
//创建集合
List<Student> list = new ArrayList<Student>();
while(res.next()) {
Student stu = new Student();
stu.setName(res.getString("name"));
stu.setAge(res.getInt("age"));
stu.setId(res.getInt("id"));
list.add(stu);
}
return list;
} catch(Exception e){
e.printStackTrace();
} finally {
//释放资源
JDBCUtil.close(conn, st, res);
}
return null;
}
}
StudentDaoTest.java
package com.iris.jdbc.test;
import java.util.List;
import org.junit.Test;
import com.iris.jdbc.dao.impl.StudentDaoImpl;
import com.iris.jdbc.domain.Student;
import com.iris.jdbc.jao.IStudentDao;
public class StudentDaoTest {
@Test
public void save(){
//创建一个学生
Student stu = new Student();
stu.setName ("张三");
stu.setAge(20);
IStudentDao dao = new StudentDaoImpl(); //多态
dao.save(stu);
}
@Test
public void delete() {
IStudentDao dao = new StudentDaoImpl(); //多态
dao.delete(6);
}
@Test
public void update() {
IStudentDao dao = new StudentDaoImpl(); //多态
Student stu = new Student();
stu.setName("鲁班");
stu.setAge(7);
dao.update(3, stu);
}
@Test
public void get() {
IStudentDao dao = new StudentDaoImpl(); //多态
Student stu= dao.get(3);
System.out.println(stu); //添加tostring方法
}
public void getAll() {
IStudentDao dao = new StudentDaoImpl(); //多态
List<Student> allStu = dao.getAll();
System.out.println(allStu); //添加tostring方法
}
}