JDBC-PreparedStatement实现CURD(笔记)
Posted Vodka~
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JDBC-PreparedStatement实现CURD(笔记)相关的知识,希望对你有一定的参考价值。
1.数据库的作用是向数据库服务器发送命令和SQL语句,并接受数据库服务器返回的结果,数据库连接也是Socket连接。
2.在java.sql包中有3个接口分别定义了对数据库的调用的不同方式,由Driver Manager进行管理:
-Statement: 用于执行静态SQL语句,并返回它所生成结果的对象。
-PreparedStatement: SQL语句被预编译,存储在此对象中,可以使用此对象多次高效地执行该语句。
-CallableStatement: 用于执行SQL存储过程
3.使用Statement操作数据表的弊端:
-1 通过调用Connection 对象的 createStatement()方法创建对象,该对象用于执行静态的SQL语句,并且返回执行结果。
-2 Statement 接口中定义了下列方法,用于执行SQL语句:
int excuteUpdate(String sql): //执行更新操作 INSERT , UPDATE, DELETE
ResultSet executeQuery(String sql): //执行查询操作 SELECT
4.使用Statement 操作数据表存在弊端:
-问题一: 存在拼串操作,繁琐
-问题二: 存在SQL注入问题
- SQL 注入是利用某些系统没有对用户输入的数据进行充分的检查,进而在用户输入数据中注入非法的SQL语句或者命令
(如: SELECT user ,password FROM user_table where user=‘a’ OR 1= ‘AND password = ’ OR ‘1’ = ‘1’ ) , 从而利用系统的SQL 引擎完成恶意操作
6.在Java语言中,要防范SQL注入, 只要用PreparedStatement (从Statement扩展而来) 取代Statement即可
//GetConnection.class
package util;
import PreparedStatementCURD.PreparedStatementTest;
import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.Properties;
/**
* @author Vodka
* @date 2021/07//17:14
*/
public class GetConnection {
/*
* 封装获取数据库连接的函数
* */
public static Connection getConnection() throws IOException, ClassNotFoundException, SQLException {
//加载配置文件
InputStream IS = ClassLoader.getSystemClassLoader().getResourceAsStream("jdbc.properties");
Properties pros = new Properties();
pros.load(IS);
String User = pros.getProperty("User");
String PassWord = pros.getProperty("PassWord");
String Url = pros.getProperty("Url");
String DriverClass = pros.getProperty("DriverClass");
//利用反射机制,注册驱动,连接数据库
Class.forName(DriverClass);
Connection conn = DriverManager.getConnection(Url,User,PassWord);
if(conn != null) System.out.println("数据库连接成功!");
else System.out.println("数据库连接失败!");
// 返回连接
return conn;
}
/*
* 2.封装关闭流函数
* */
public static void Close(Connection conn , PreparedStatement ps) throws SQLException{
conn.close();
ps.close();
if(conn == null && ps == null){
System.out.println("数据库连接已关闭!");
}
}
}
//Test.class
package PreparedStatementCURD;
import util.GetConnection;
import java.io.IOException;
import java.sql.Connection;
import java.sql.Date;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
/**
* @author Vodka
* @date 2021/07//17:28
*/
public class Test {
@org.junit.Test
public void test(){
try{
//使用封装好的连接函数,获取数据库连接
Connection conn = GetConnection.getConnection();
String sql = "insert into student (Sno,Sname,Sex,InTime) values(?,?,?,?)";
PreparedStatement ps = conn.prepareStatement(sql);
ps.setString(1,"4550");
ps.setString(2,"拉水");
ps.setString(3,"0");
java.util.Date Times = new java.util.Date();
java.sql.Timestamp times = new java.sql.Timestamp(Times.getTime());
ps.setTimestamp(4, times);
System.out.println(times);
//插入数据
ps.execute();
//使用封装好的关闭函数,关闭数据库相关连接
GetConnection.Close(conn ,ps);
}catch(SQLException e){
e.printStackTrace();
} catch(IOException e){
e.printStackTrace();
} catch(ClassNotFoundException e){
e.printStackTrace();
}
}
}
package PreparedStatementCURD;
import org.junit.Test;
import util.GetConnection;
import java.io.IOException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
/**
* @author Vodka
* @date 2021/07//22:00
*/
public class UpdateTest {
//更新数据库的测试
@Test
public void updateTest(){
try {
// //建立数据库连接
// Connection conn = GetConnection.getConnection();
// //更新数据
// String UpdateSQL = "update student set Sname = ? , InTime = ? where Sno = ?";
// java.sql.Timestamp time= new java.sql.Timestamp(new java.util.Date().getTime());
//
// //预编译sql语句
// PreparedStatement ps =conn.prepareStatement(UpdateSQL);
// //设置变量值
// ps.setObject(1,"维迦");
// ps.setTimestamp(2,time);
// ps.setString(3,"19125");
// //执行sql语句
// ps.execute();
String Dsql = "delete from student where Sno = ?"; //这里要注意,当表名和数据库关键字重名时,要加单引号,例如`order`
String Upsql = "update student set Sage = Sage + ? where Sex = ?";
operation(Upsql, "5" , "1");
}catch (Exception e){
e.printStackTrace();
}
}
//高内聚,低耦合,封装一个curd通用的函数,因为参数是不确定的,所以利用可变参数
public void operation(String sql , Object ...args) {
Connection conn = null;
PreparedStatement ps = null;
try {
//建立连接
conn = GetConnection.getConnection();
//预编译
ps = conn.prepareStatement(sql);
for (int index = 0; index < args.length; index++) {
ps.setObject(index + 1, args[index]); //这里要注意两个变量下标起始值的不同
}
//执行sql语句
ps.execute();
} catch(Exception e){
e.printStackTrace();
} finally{
try{
if(conn != null && ps != null) GetConnection.Close(conn,ps);
} catch(SQLException e){
e.printStackTrace();
}
}
}
}
以上是关于JDBC-PreparedStatement实现CURD(笔记)的主要内容,如果未能解决你的问题,请参考以下文章