JDBC连接MySQL数据库(三)——增删查改以及Junit的使用

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);
  	}
 }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值