JDBC连接MySQL数据库(三)
目录
数据库的CRUD
所谓数库的CRUD,简单地说也就是数据库的增删改查,增加(Create),查询检索(Retrieve),更新(update), 删除(Delete)接下来就介绍一下数据的这四种基本操作
查询
查询这种方式我们在刚刚说到数据库的基本连接的时候有提到过,就当再看一遍吧
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class prac {
public static void main(String [] args ) {
Connection conn = null;
ResultSet rs = null;
Statement st = null;
try {
conn = JDBCutils.getconn();
st = conn.createStatement();
String sql= "select * from stugrade";
rs = st.executeQuery(sql);
while(rs.next()) {
int id = rs.getInt("id");
String name = rs.getString( "name");
System.out.println( id+":"+name);
}
} catch (SQLException e) {
e.printStackTrace();
}finally {
JDBCutils.ReleaseAll(conn, rs, st);
}
}
}
删除
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class prac {
public static void main(String [] args ) {
Connection conn = null;
Statement st = null;
try {
conn = JDBCutils.getconn();
st = conn.createStatement();
String sql= "delete from stugrade where id = 1";
int r = st.executeUpdate(sql);
if(r>0) {
System.out.println("ok");
}else {
System.out.println("error");
}
} catch (SQLException e) {
e.printStackTrace();
}finally {
JDBCutils.Release(conn, st);
}
}
}
更新
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class prac {
public static void main(String [] args ) {
Connection conn = null;
Statement st = null;
try {
conn = JDBCutils.getconn();
st = conn.createStatement();
String sql= "update stugrade set score = 90 where id = 2";
int r = st.executeUpdate(sql);
if(r>0) {
System.out.println("ok");
}else {
System.out.println("error");
}
} catch (SQLException e) {
e.printStackTrace();
}finally {
JDBCutils.Release(conn, st);
}
}
}
添加
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class prac {
public static void main(String [] args ) {
Connection conn = null;
Statement st = null;
try {
conn = JDBCutils.getconn();
st = conn.createStatement();
String sql= "insert into stugrade values(3,'Emma',92)";
int r = st.executeUpdate(sql);
if(r>0) {
System.out.println("ok");
}else {
System.out.println("error");
}
} catch (SQLException e) {
e.printStackTrace();
}finally {
JDBCutils.Release(conn, st);
}
}
}
以上代码完成了数据库的增删改查的基本代码。
添加Junit测试单元
如果我们想要测试某一段代码的正确性,我们就可以添加Junit方法
方法如下:
右键当前项目 -> build path -> configure build path ->java build path ->libiaries -> classpath -> add library-> Junit ->next
建立一个测试类在其实部分添加@Test 导包就行了
实现带码如下:
@Test
public void testquery1(){
Connection conn = null;
ResultSet rs = null;
Statement st = null;
try {
conn = JDBCutils.getconn();
st = conn.createStatement();
String sql= "update stugrade set score = 90 where id = 2";
int r = st.executeUpdate(sql);
if(r>0) {
System.out.println("ok");
}else {
System.out.println("error");
}
}catch(SQLException e) {
e.printStackTrace();
}finally {
JDBCutils.ReleaseAll(conn, rs, st);
}
}
看到右侧看到测试那个进度条完成变成绿色就是证明代码没有错误啦~
statement的安全问题
现在我们假设通过通过带有参数的方法执行数据库的查询工作
数据库信息如下:
观察如下简单的示例代码:
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import Utils.JDBCutils;
public class prac {
public static void main(String [] args) {
test t = new test();
t.login("CXK", "81604152");
}
}
class test{
public void login(String name, String password) {
Connection conn = null;
Statement st = null;
ResultSet rs = null;
try {
conn = JDBCutils.getconn();
st = conn.createStatement();
String sql = "select * from stulog where name = '"+name+"' and password= '"+password+"'";
rs =st.executeQuery(sql);
if(rs.next()) {
System.out.println("login succeed");
}else {
System.out.println("login failed");
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
现在我们注意我们这个查询的SQL语句:
String sql = "select * from stulog where name = '"+name+"' and password= '"+password+"'";
如果我现在将password传出的参数改为
t.login("CXK", "81604152 'or' 1 = 1 ");`
此时执行出来的结果依然是login succeed,这个可以去测试一下子,可是此时数据库中的密码并不是81604152 ‘or’ 1 = 1而是 81604152 这个原因是什么呢?
Statement执行SQL语句的原理
statement的执行是拼接SQL语句周后一起执行的,当statement执行SQL语句时,其中字符含有有数据库中的关键字,那它认为是数据库中的关键字, 而不是代表字符串本身的文字,所以刚刚的密码81604152 ‘or’ 1 = 1 它认为 or 就是逻辑连接词所以还是可以登陆成功的。基于有这样的问题我们,我们应该怎么解决呢?
PrepareStatement接口
Statement对象接口封装了JDBC执行SQL语句的方法,可以完成Java程序执行的SQL语句操作,但是在实际开发过程中就有可能出现刚刚所说的问题——将变量作为SQL语句中的查询条件,使用Statement接口就存在过于繁琐的问题,而且还有安全问题,对于这样的问题我们使用PrepareStatement对象解决此问题。
PrepareStatement接口中的主要方法:
方法 | 功能 |
---|---|
executeUpdate() | 在此PrepareStatement对象中执行SQL语句 |
executeQuery() | 在此PrepareStatement对象中执行SQL的查询语句,返回ResultSet对象 |
setInt(int parameterIndex, int x) | 将指定的参数设置为int类型 |
setString(int parameterIndex,int x) | 将指定的参数设置为String类型 |
setFloat(int parameterIndex,int x) | 将指定的参数设置为Float类型 |
setDate(int parameterIndex,int x) | 将指定的参数设置给定的Date值 |
Date的类型是java.sql.date而不是java.util.date
我们这样使用SQL语句:
String sql = "select * from stugrade where name= ? and score = ?";
PrepareStatement ps =conn.prepareStatement(sql);
// 使用的参数需要SQL的数据类型相匹配
ps.setString(1, "Steven");
ps.setInt(2, 92);
? 代表对应的字符串中需要添加的内容, 对应每个?使用setxxx的方法
接下来以此数据库为例看一下使用PrepareStatement:
通过PrepareStatement删除信息
public void delete(int id) {
Connection conn = null;
PreparedStatement ps = null;
try {
conn = JDBCutils.getconn();
String sql = "delete from stugrade where id = ?";
ps =conn.prepareStatement(sql);
ps.setInt(1, id);
int rs = ps.executeUpdate();
if(rs>0) {
System.out.println("ok");
}else {
System.out.println("error");
}
} catch (SQLException e) {
e.printStackTrace();
}
}
通过PrepareStatement添加信息
public void insert(int id, String name, int score) {
Connection conn = null;
PreparedStatement ps = null;
try {
conn = JDBCutils.getconn();
String sql ="insert into stugrade values(?,?,?)";
ps = conn.prepareStatement(sql);
ps.setInt(1, id);
ps.setString(2, name);
ps.setInt(3, score);
int rs = ps.executeUpdate();
if(rs>0) {
System.out.println("insert ok");
}else {
System.out.println("error");
}
} catch (SQLException e) {
e.printStackTrace();
}finally {
JDBCutils.Release(conn,ps);
}
}
通过PrepareStatement更新信息
public void update(int id, int score) {
Connection conn = null;
PreparedStatement ps = null;
try {
conn = JDBCutils.getconn();
String sql = "update stugrade set score= ? where id = ?";
ps = conn.prepareStatement(sql);
ps.setInt(1, score);
ps.setInt(2, id);
int rs = ps.executeUpdate();
if(rs > 0) {
System.out.println("update ok");
}else {
System.out.println("error");
}
} catch (SQLException e) {
e.printStackTrace();
}finally {
JDBCutils.Release(conn, ps);
}
}