06__JDBC入门

JDBC入门

1. JDBC的简介

1.1 jdbc:Java DataBase Connectivity,java数据库的连接
1.2 比如有一台电脑,想在电脑上安装显卡,需要显卡的驱动,由显卡生产厂商提供
1.3 要想使用java对数据库进行操作,需要使用由数据库提供的数据库驱动
1.4 一个程序,使用java操作数据库,掌握java代码,除了掌握java代码之外,需要掌握数据库驱动的代码。
很多的数据库,比如mysql、oracle,对于程序员来讲,需要掌握每种数据库的代码,对于程序员压力很大。
1.5 sun公司针对这种情况,开发出一套标准接口,各个数据库只需要实现这个接口就可以了,程序员只需要掌握这套
接口就可以了,这套标准的接口就是jdbc
1.6 如果想要使用jdbc对数据库进行操作,首先安装数据库的驱动,不同的数据库提供的驱动是以jar包的形式提供的,需要把jar包放到项目里面,相当于安装了数据库的驱动。
1.7 导入jar到项目中(使用到开发工具 myeclipse10.x版本)
首先创建一个文件夹 lib,把jar包复制到lib里面,选中jar包右键点击build path – add to build path,jar包前面的图标变成了“奶瓶”图标,表示导入jar成功。

2. JDBC的入门案例

2.1 使用jdbc对数据库进行操作步骤是固定的
2.1.1 使用到类和接口
DriverManager
Connection
Statement
ResultSet
2.2 jdbc的操作步骤
第一步,加载数据库的驱动
DriverManager里面registerDriver(Driver driver)
第二步,创建与数据库的连接
DriverManager里面getConnection(String url, String user, String password)
第三步,编写sql语句
第四步,执行sql语句
Statement里面executeQuery(String sql)
第五步,释放资源(关闭连接)
2.3 使用jdbc实现查询的操作
2.3.1 代码

package cn.itcast.testjdbc;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

import com.mysql.jdbc.Driver;

public class TestJDBC01 {
	/**
	 * 实现使用jdbc的查询的操作
	 * @throws Exception 
	 */
	public static void main(String[] args) throws Exception {
		//加载驱动
		DriverManager.registerDriver(new Driver());
		//创建连接
		Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/testdb2", "root", "root");
		//编写sql
		String sql = "select * from user";
		//执行sql
		//得到statement
		Statement stmt = conn.createStatement();
		ResultSet rs = stmt.executeQuery(sql);
		//遍历结果集得到每条记录
		while(rs.next()) {
			int id = rs.getInt("id");
			String username = rs.getString("username");
			int chinese = rs.getInt("chinese");
			int english = rs.getInt("english");
			System.out.println(id+" :: "+username+" :: "+chinese+" :: "+english);
		}
		//释放资源
		rs.close();
		stmt.close();
		conn.close();
	}
}

3. jdbc的DriverManager对象

3.1 在java.sql包里面
3.2 加载数据库的驱动
registerDriver(Driver driver) :参数是数据库的驱动,这个驱动是由数据库提供的
(1)这个方法在实际开发中,一般不使用,因为这个方法会加载驱动两次
(2)一般在开发中使用反射的方式加载数据库的驱动
Class.forName(“com.mysql.jdbc.Driver”);
3.3 得到数据库的连接
getConnection(String url, String user, String password),返回Connection
(1)有三个参数
第一个参数:表示要连接的数据库
写法:jdbc:mysql://数据库的ip:数据库的端口号/连接的数据库的名称
jdbc:mysql://localhost:3306/testdb2
简写的方式:jdbc:mysql:///testdb2(使用范围:连接的数据库是本机,端口是3306)
第二个参数:表示连接数据库的用户名
第三个参数:表示连接数据库用户密码

4. jdbc的Connection对象

4.1 代表数据库的连接,是接口,在java.sql包里面
4.2 创建statement对象
Statement createStatement()
4.3 创建预编译对象 PreparedStatement
PreparedStatement prepareStatement(String sql)

5. jdbc的Statement对象

5.1 执行sql的对象,接口,在java.sql包里面
5.2 执行查询操作方法
ResultSet executeQuery(String sql) ,返回查询的结果集
5.3 执行增加 修改 删除的方法
int executeUpdate(String sql) ,返回成功的记录数
5.4 执行sql语句的方法
boolean execute(String sql) ,返回是布尔类型,如果执行的是查询的操作返回true,否则返回的false
5.5 执行批处理的方法
addBatch(String sql):把多个sql语句放到批处理里面
int[] executeBatch():执行批处理里面的所有的sql

6. jdbc的ResultSet对象

6.1 代表查询之后返回的结果,接口,在java.sql包里面
类似于使用select语句查询出来的表格

+------+----------+---------+---------+
| id   | username | chinese | english |
+------+----------+---------+---------+
|    1 | lucy     |     100 |      30 |
|    2 | mary     |      60 |      80 |
|    3 | jack     |      70 |      40 |
|    4 | zhangsan |      40 |      70 |
|    5 | lisi     |      40 |      70 |
|    6 | wangwu   |      40 |      70 |
+------+----------+---------+---------+

6.2 遍历结果集
next()
6.3 得到数据的具体值
getXXX
(1)比如数据是string类型,使用getString(“字段的名称”)
比如数据是int类型,使用getInt(“字段的名称”)
比如不知道数据的类型,使用getObject(“字段的名称”)
(2)字段的名称修改为1,2,3,4也是可以的,但是不推荐。

int id = rs.getInt(1);
String username = rs.getString(2);
int chinese = rs.getInt(3);
int english = rs.getInt(4);

6.4 结果集的遍历方式
在最开始的时候在第一行之前,当执行了next方法之后,一行一行的向下进行遍历
,在默认的情况下,只能向下,不能向上,在遍历出来的结果也是不能修改的。
在这里插入图片描述

7. jdbc的释放资源

7.1 关闭的原则:谁最先打开,谁最后关闭
7.2 关闭资源的规范的写法

package cn.itcast.testjdbc;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

import com.sun.corba.se.spi.orbutil.fsm.State;

/**
 * 使用jdbc实现crud的操作
 * @author asus
 */
public class TestJDBC {
	public static void main(String[] args) {
		Connection conn = null;
		Statement stmt = null;
		ResultSet rs = null;
		try {
			//加载数据库的驱动
			Class.forName("com.mysql.jdbc.Driver");
			//创建与数据库的连接
			conn = DriverManager.getConnection("jdbc:mysql:///testdb2", "root", "root");
			//编写sql语句
			String sql = "select * from user";
			//执行sql
			//创建statement对象
			stmt = conn.createStatement();
			rs = stmt.executeQuery(sql);
			//遍历结果集
			while(rs.next()) {
				int id = rs.getInt("id");
				String username = rs.getString("username");
				int chinese = rs.getInt("chinese");
				int english = rs.getInt("english");
				System.out.println(id+" ::"+username+" ::"+chinese+" ::"+english);
			}
		}catch(Exception e) {
			
		}finally {
			//释放资源
			if(rs != null) {
				try {
					rs.close();
				} catch (SQLException e) {
					e.printStackTrace();
				}
				rs = null;
			}
			if(stmt != null) {
				try {
					stmt.close();
				} catch (SQLException e) {
					e.printStackTrace();
				}
				stmt = null;
			}
			if(conn != null) {
				try {
					conn.close();
				} catch (SQLException e) {
					e.printStackTrace();
				}
				conn = null;
			}			
		}
	}
}

8. 使用jdbc进行crud操作

(1)实现对数据库表记录进行查询的操作
* executeQuery(sql)
(2)实现对数据库表记录进行增加的操作
* executeUpdate(sql)

package cn.itcast.testjdbc;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

import com.sun.corba.se.spi.orbutil.fsm.State;

/**
 * 使用jdbc实现crud的操作
 * @author asus
 *
 */
public class TestJDBC {
	public static void main(String[] args) {
//		selectUser();
		addUser();
	}
	//实现向user表添加记录
	public static void addUser() {
		Connection conn = null;
		Statement stmt = null;
		try {
			//加载驱动
			Class.forName("com.mysql.jdbc.Driver");
			//创建连接
			conn = DriverManager.getConnection("jdbc:mysql:///testdb2", "root", "root");
			//编写sql
			String sql = "insert into user values(7,'zhaoliu',40,60)";
			//创建statement对象
			stmt = conn.createStatement();
			//执行sql
			int rows = stmt.executeUpdate(sql);
			if(rows > 0) {
				System.out.println("insert success");
			} else {
				System.out.println("fail");
			}
		}catch(Exception e) {
			
		}finally {
			//释放资源
			if(stmt != null) {
				try {
					stmt.close();
				} catch (SQLException e) {
					e.printStackTrace();
				}
				stmt = null;
			}
			
			if(conn != null) {
				try {
					conn.close();
				} catch (SQLException e) {
					e.printStackTrace();
				}
				conn = null;
			}			
		}
	}
	//实现对user进行查询
	public static void selectUser() {
		Connection conn = null;
		Statement stmt = null;
		ResultSet rs = null;
		try {
			//加载数据库的驱动
			Class.forName("com.mysql.jdbc.Driver");
			//创建与数据库的连接
			conn = DriverManager.getConnection("jdbc:mysql:///testdb2", "root", "root");
			//编写sql语句
			String sql = "select * from user";
			//执行sql
			//创建statement对象
			stmt = conn.createStatement();
			rs = stmt.executeQuery(sql);
			//遍历结果集
			while(rs.next()) {
				int id = rs.getInt("id");
				String username = rs.getString("username");
				int chinese = rs.getInt("chinese");
				int english = rs.getInt("english");
				System.out.println(id+" ::"+username+" ::"+chinese+" ::"+english);
			}
		}catch(Exception e) {
			
		}finally {
			//释放资源
			if(rs != null) {
				try {
					rs.close();
				} catch (SQLException e) {
					e.printStackTrace();
				}
				rs = null;
			}
			if(stmt != null) {
				try {
					stmt.close();
				} catch (SQLException e) {
					e.printStackTrace();
				}
				stmt = null;
			}
			if(conn != null) {
				try {
					conn.close();
				} catch (SQLException e) {
					e.printStackTrace();
				}
				conn = null;
			}			
		}
	}
}

(3)实现对数据库表记录进行修改的操作
* executeUpdate(sql)
(4)实现对数据库表记录进行删除的操作
* executeUpdate(sql)

package cn.itcast.testjdbc;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
/**
 * 使用jdbc进行修改和删除的操作
 * @author asus
 */
public class TestJdbc01 {
	public static void main(String[] args) {
//		updateUser();
		deleteUser();
	}
	//实现删除的操作
	//删除id=6的记录
	public static void deleteUser() {
		Connection conn = null;
		Statement stmt = null;
		try {
			//加载驱动
			Class.forName("com.mysql.jdbc.Driver");
			//创建连接
			conn = DriverManager.getConnection("jdbc:mysql:///testdb2", "root", "root");
			//编写sql
			String sql = "delete from user where id=6";
			//执行sql
			stmt = conn.createStatement();
			stmt.executeUpdate(sql);
		}catch(Exception e) {
			
		}finally {
			//释放资源
			if(stmt != null) {
				try {
					stmt.close();
				} catch (SQLException e) {
					e.printStackTrace();
				}
				stmt = null;
			}
			
			if(conn != null) {
				try {
					conn.close();
				} catch (SQLException e) {
					e.printStackTrace();
				}
				conn = null;
			}			
		}
	}
	
	//实现修改的操作
	//修改id=7的记录里面username为niuqi,把chinese为80
	public static void updateUser() {
		Connection conn = null;
		Statement stmt = null;
		try {
			//加载驱动
			Class.forName("com.mysql.jdbc.Driver");
			//创建连接
			conn = DriverManager.getConnection("jdbc:mysql:///testdb2", "root", "root");
			//编写sql
			String sql = "update user set username='niqi',chinese=80 where id=7";
			//创建statement对象
			stmt = conn.createStatement();
			//执行sql
			int rows = stmt.executeUpdate(sql);
			if(rows > 0) {
				System.out.println("success");
			} else {
				System.out.println("fail");
			}
		}catch(Exception e) {
			
		}finally {
			//释放资源
			if(stmt != null) {
				try {
					stmt.close();
				} catch (SQLException e) {
					e.printStackTrace();
				}
				stmt = null;
			}
			
			if(conn != null) {
				try {
					conn.close();
				} catch (SQLException e) {
					e.printStackTrace();
				}
				conn = null;
			}			
		}
	}
}

9. jdbc工具类的封装

9.1 当在很多的类里面有相同的代码,可以把相同的代码提取到一个工具类里面,
在类里面直接调用工具类里面的方法实现
9.2 在jdbc实现crud操作的代码里面,首先得到数据库连接和释放资源的代码是重复的,所以可以进行封装
9.3 可以把数据库的一些信息,写到配置文件里面,在工具类读取配置文件得到内容
一般使用properties格式文件作为存储数据库信息的文件
有两种方式读取配置文件
第一种,使用properties类
(1)代码
//创建properties对象
Properties p = new Properties();
//文件的输入流
InputStream in = new FileInputStream(“src/db.properties”);
//把文件的输入流放到对象里面
p.load(in);
String drivername = p.getProperty(“drivername”);
String url = p.getProperty(“url”);
String username = p.getProperty(“username”);
String password = p.getProperty(“password”);
第二种,使用ResourceBundle类
* 使用范围:首先读取的文件的格式需要时properties,文件需要放到src下面
(1)代码
String drivername = ResourceBundle.getBundle(“db”).getString(“drivername”);
String url = ResourceBundle.getBundle(“db”).getString(“url”);
String username = ResourceBundle.getBundle(“db”).getString(“username”);
String password = ResourceBundle.getBundle(“db”).getString(“password”);
9.4 代码
public static String drivername;
public static String url;
public static String username;
public static String password;
//在类加载时候,执行读取文件的操作
static {
drivername = ResourceBundle.getBundle(“db”).getString(“drivername”);
url = ResourceBundle.getBundle(“db”).getString(“url”);
username = ResourceBundle.getBundle(“db”).getString(“username”);
password = ResourceBundle.getBundle(“db”).getString(“password”);
}

package cn.itcast.utils;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ResourceBundle;
public class MyJdbcUtils {
	public static String drivername;
	public static String url;
	public static String username;
	public static String password;
	//在类加载时候,执行读取文件的操作
	static {
		drivername = ResourceBundle.getBundle("db").getString("drivername");
		url = ResourceBundle.getBundle("db").getString("url");
		username = ResourceBundle.getBundle("db").getString("username");
		password = ResourceBundle.getBundle("db").getString("password");
	}
	//得到数据库连接的方法
	public static Connection getConnection() throws Exception {
		//加载驱动
		Class.forName(drivername);
		Connection conn = DriverManager.getConnection(url, username, password);
		return conn;
	}
	//封装释放资源的代码
	public static void clearConn(Connection conn,Statement stmt,ResultSet rs) {
		if(rs != null) {
			try {
				rs.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
			rs = null;
		}
		if(stmt != null) {
			try {
				stmt.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
			stmt = null;
		}
		if(conn != null) {
			try {
				conn.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
			conn = null;
		}			
	}
}


db.properties
drivername=com.mysql.jdbc.Driver
url=jdbc:mysql:///day05
username=root
password=root


package cn.itcast.utils;
import java.io.FileInputStream;
import java.io.InputStream;
import java.util.Properties;
import java.util.ResourceBundle;
public class TestReadFile {
	public static void main(String[] args) throws Exception {
		read2();
	}
	//第二种方式
	public static void read2() {
		String drivername = ResourceBundle.getBundle("db").getString("drivername");
		String url = ResourceBundle.getBundle("db").getString("url");
		String username = ResourceBundle.getBundle("db").getString("username");
		String password = ResourceBundle.getBundle("db").getString("password");
		System.out.println(drivername);
		System.out.println(url);
		System.out.println(username);
		System.out.println(password);
	}
	//第一种方式 
	public static void read1() throws Exception {
		//创建properties对象
		Properties p = new Properties();
		//文件的输入流
		InputStream in = new FileInputStream("src/db.properties");
		//把文件的输入流放到对象里面
		p.load(in);
		String drivername = p.getProperty("drivername");
		String url = p.getProperty("url");
		String username = p.getProperty("username");
		String password = p.getProperty("password");
		System.out.println(drivername);
		System.out.println(url);
		System.out.println(username);
		System.out.println(password);
	}

}


package cn.itcast.testjdbc;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
/**
 * 使用jdbc进行修改和删除的操作
 * @author asus
 */
public class TestJdbc01 {
	public static void main(String[] args) {
//		updateUser();
		deleteUser();
	}
	//实现删除的操作
	//删除id=6的记录
	public static void deleteUser() {
		Connection conn = null;
		Statement stmt = null;
		try {
			//加载驱动
			Class.forName("com.mysql.jdbc.Driver");
			//创建连接
			conn = DriverManager.getConnection("jdbc:mysql:///testdb2", "root", "root");
			//编写sql
			String sql = "delete from user where id=6";
			//执行sql
			stmt = conn.createStatement();
			stmt.executeUpdate(sql);
		}catch(Exception e) {
			
		}finally {
			//释放资源
			if(stmt != null) {
				try {
					stmt.close();
				} catch (SQLException e) {
					e.printStackTrace();
				}
				stmt = null;
			}
			
			if(conn != null) {
				try {
					conn.close();
				} catch (SQLException e) {
					e.printStackTrace();
				}
				conn = null;
			}			
		}
	}
	//实现修改的操作
	//修改id=7的记录里面username为niuqi,把chinese为80
	public static void updateUser() {
		Connection conn = null;
		Statement stmt = null;
		try {
			//加载驱动
			Class.forName("com.mysql.jdbc.Driver");
			//创建连接
			conn = DriverManager.getConnection("jdbc:mysql:///testdb2", "root", "root");
			//编写sql
			String sql = "update user set username='niqi',chinese=80 where id=7";
			//创建statement对象
			stmt = conn.createStatement();
			//执行sql
			int rows = stmt.executeUpdate(sql);
			if(rows > 0) {
				System.out.println("success");
			} else {
				System.out.println("fail");
			}
		}catch(Exception e) {
			
		}finally {
			//释放资源
			if(stmt != null) {
				try {
					stmt.close();
				} catch (SQLException e) {
					e.printStackTrace();
				}
				stmt = null;
			}
			
			if(conn != null) {
				try {
					conn.close();
				} catch (SQLException e) {
					e.printStackTrace();
				}
				conn = null;
			}			
		}
	}
}


package cn.itcast.testjdbc;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
/**
 * 使用jdbc实现crud的操作
 * @author asus
 */
public class TestJDBC {
	public static void main(String[] args) {
//		selectUser();
		addUser();
	}
	
	//实现向user表添加记录
	public static void addUser() {
		Connection conn = null;
		Statement stmt = null;
		try {
			//加载驱动
			Class.forName("com.mysql.jdbc.Driver");
			//创建连接
			conn = DriverManager.getConnection("jdbc:mysql:///testdb2", "root", "root");
			//编写sql
			String sql = "insert into user values(7,'zhaoliu',40,60)";
			//创建statement对象
			stmt = conn.createStatement();
			//执行sql
			int rows = stmt.executeUpdate(sql);
			if(rows > 0) {
				System.out.println("insert success");
			} else {
				System.out.println("fail");
			}
		}catch(Exception e) {
			
		}finally {
			//释放资源
			if(stmt != null) {
				try {
					stmt.close();
				} catch (SQLException e) {
					e.printStackTrace();
				}
				stmt = null;
			}
			
			if(conn != null) {
				try {
					conn.close();
				} catch (SQLException e) {
					e.printStackTrace();
				}
				conn = null;
			}			
		}
	}
	
	//实现对user进行查询
	public static void selectUser() {
		Connection conn = null;
		Statement stmt = null;
		ResultSet rs = null;
		try {
			//加载数据库的驱动
			Class.forName("com.mysql.jdbc.Driver");
			//创建与数据库的连接
			conn = DriverManager.getConnection("jdbc:mysql:///testdb2", "root", "root");
			//编写sql语句
			String sql = "select * from user";
			//执行sql
			//创建statement对象
			stmt = conn.createStatement();
			rs = stmt.executeQuery(sql);
			//遍历结果集
			while(rs.next()) {
				int id = rs.getInt("id");
				String username = rs.getString("username");
				int chinese = rs.getInt("chinese");
				int english = rs.getInt("english");
				System.out.println(id+" ::"+username+" ::"+chinese+" ::"+english);
			}
		}catch(Exception e) {
			
		}finally {
			//释放资源
			if(rs != null) {
				try {
					rs.close();
				} catch (SQLException e) {
					e.printStackTrace();
				}
				rs = null;
			}
			if(stmt != null) {
				try {
					stmt.close();
				} catch (SQLException e) {
					e.printStackTrace();
				}
				stmt = null;
			}
			
			if(conn != null) {
				try {
					conn.close();
				} catch (SQLException e) {
					e.printStackTrace();
				}
				conn = null;
			}			
		}
	}
}

10. 使用jdbc的工具类实现crud操作

package cn.itcast.utils;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ResourceBundle;
public class MyJdbcUtils {

	public static String drivername;
	public static String url;
	public static String username;
	public static String password;
	
	//在类加载时候,执行读取文件的操作
	static {
		drivername = ResourceBundle.getBundle("db").getString("drivername");
		url = ResourceBundle.getBundle("db").getString("url");
		username = ResourceBundle.getBundle("db").getString("username");
		password = ResourceBundle.getBundle("db").getString("password");
	}

	//得到数据库连接的方法
	public static Connection getConnection() throws Exception {
		//加载驱动
		Class.forName(drivername);
		Connection conn = DriverManager.getConnection(url, username, password);
		return conn;
	}
	
	//封装释放资源的代码
	public static void clearConn(Connection conn,Statement stmt,ResultSet rs) {
		if(rs != null) {
			try {
				rs.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
			rs = null;
		}
		if(stmt != null) {
			try {
				stmt.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
			stmt = null;
		}
		
		if(conn != null) {
			try {
				conn.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
			conn = null;
		}			
	}
}


package cn.itcast.utils;
import java.io.FileInputStream;
import java.io.InputStream;
import java.util.Properties;
import java.util.ResourceBundle;
public class TestReadFile {
	public static void main(String[] args) throws Exception {
		read2();
	}
	//第二种方式
	public static void read2() {
		String drivername = ResourceBundle.getBundle("db").getString("drivername");
		String url = ResourceBundle.getBundle("db").getString("url");
		String username = ResourceBundle.getBundle("db").getString("username");
		String password = ResourceBundle.getBundle("db").getString("password");
		System.out.println(drivername);
		System.out.println(url);
		System.out.println(username);
		System.out.println(password);
	}
	
	//第一种方式 
	public static void read1() throws Exception {
		//创建properties对象
		Properties p = new Properties();
		//文件的输入流
		InputStream in = new FileInputStream("src/db.properties");
		//把文件的输入流放到对象里面
		p.load(in);
		String drivername = p.getProperty("drivername");
		String url = p.getProperty("url");
		String username = p.getProperty("username");
		String password = p.getProperty("password");
		System.out.println(drivername);
		System.out.println(url);
		System.out.println(username);
		System.out.println(password);
	}
}


db.properties
drivername=com.mysql.jdbc.Driver
url=jdbc:mysql:///day05
username=root
password=root


package cn.itcast.testjdbc;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;
import cn.itcast.utils.MyJdbcUtils;
/**
 * 使用工具类实现crud操作
 * @author asus
 */
public class TestJDBC01 {
	public static void main(String[] args) {
//		selectUser();
		updateUser();
	}
	
	//实现修改的操作
	//修改user表里面id=3里面username修改为QQQ
	public static void updateUser() {
		Connection conn = null;
		Statement stmt = null;
		try {
			//使用工具类得到连接
			conn = MyJdbcUtils.getConnection();
			//编写sql
			String sql = "update user set username='QQQ' where id=3";
			//创建statement对象
			stmt = conn.createStatement();
			//执行sql
			stmt.executeUpdate(sql);
		}catch(Exception e) {
			
		}finally {
			//释放资源
			MyJdbcUtils.clearConn(conn, stmt, null);
		}
	}
	
	//实现查询的操作
	public static void selectUser() {
		Connection conn = null;
		Statement stmt = null;
		ResultSet rs = null;
		try {
			//使用工具类得到数据库的连接
			conn = MyJdbcUtils.getConnection();
			//编写sql
			String sql = "select * from user";
			//创建statement对象
			stmt = conn.createStatement();
			//执行sql
			rs = stmt.executeQuery(sql);
			//遍历结果集
			while(rs.next()) {
				String id = rs.getString("id");
				String username = rs.getString("username");
				String password = rs.getString("password");
				System.out.println(id+" :: "+username+" :: "+password);
			}
		}catch(Exception e) {
			
		}finally {
			//释放资源
			MyJdbcUtils.clearConn(conn, stmt, rs);
		}
	}
}


package cn.itcast.testjdbc;
import java.sql.Connection;
import java.sql.Statement;
import cn.itcast.utils.MyJdbcUtils;
public class TestJDBC02 {
	/**
	 * 使用jdbc工具类实现增加 删除的操作
	 */
	public static void main(String[] args) {
//		addUser();
		deleteUser();
	}
	
	//实现删除的操作
	//删除user表里面id=1记录
	public static void deleteUser() {
		Connection conn = null;
		Statement stmt = null;
		try {
			//使用工具类得到连接
			conn = MyJdbcUtils.getConnection();
			//编写sql
			String sql = "delete from user where id=1";
			//创建statement对象
			stmt = conn.createStatement();
			//执行sql
			stmt.executeUpdate(sql);
		}catch(Exception e) {
			
		}finally {
			//释放资源
			MyJdbcUtils.clearConn(conn, stmt, null);
		}
	}
	//实现增加的操作
	public static void addUser() {
		Connection conn = null;
		Statement stmt = null;
		try {
			//使用工具类得到连接
			conn = MyJdbcUtils.getConnection();
			//编写sql
			String sql = "insert into user values('4','WWW','999')";
			//创建statement对象
			stmt = conn.createStatement();
			//执行sql
			stmt.executeUpdate(sql);
		}catch(Exception e) {
			
		}finally {
			//释放资源
			MyJdbcUtils.clearConn(conn, stmt, null);
		}
	}
}

11. sql的注入和防止

11.1 模拟登录的效果
(1)登录的实现的步骤
第一,输入用户名和密码
第二,拿到输入的用户名和密码,到数据库里面进行查询,如果用户名和密码都正确,才表示登录成功;
但是如果用户名和密码,有一个是错误的,表示登录失败。
11.2 演示sql的注入
(1)在登录时候,用户名里面输入 bbb’ or '1=1,因为在表里面有一个用户是bbb,可以登录成功.
因为输入的内容,被作为sql语句的一个条件,而不是作为整个用户名。
eg:select * from user where username='bbb' or '1=1' and password='rrr'

package cn.itcast.login;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;
import cn.itcast.utils.MyJdbcUtils;
public class TestLogin {
	/**
	 * 模拟登录的效果
	 */
	public static void main(String[] args) {
		//正确的效果
//		login("bbb", "123456");
		//失败的效果
//		login("aa", "11");
		//sql的注入
		login("bbb' or '1=1","rrr");
	}
	
	//实现登录的操作
	public static void login(String username,String password) {
		//根据用户名和密码,到数据库进行查询
		// select * from user where username='' and passwrod=''
		Connection conn = null;
		Statement stmt = null;
		ResultSet rs = null;
		try {
			//根据工具类得到数据库的连接
			conn = MyJdbcUtils.getConnection();
			//编写sql
			String sql = "select * from user where username='"+username+"' and password='"+password+"'";
			//创建statement对象
			stmt = conn.createStatement();
			//执行sql
			rs = stmt.executeQuery(sql);
			if(rs.next()) {
				//如果查询出结果
				System.out.println("login success: "+rs.getString("username"));
			} else {
				//没有查询出结果
				System.out.println("fail");
			}
		}catch(Exception e) {
		}finally {
			//释放资源
			MyJdbcUtils.clearConn(conn, stmt, rs);
		}
	}
}

11.3 防止sql的注入
(1)使用PreparedStatement预编译对象防止sql注入
(2)创建PreparedStatement对象 prepareStatement(String sql)
(3)PreparedStatement接口的父接口Statement
(4)什么是预编译
(5)步骤:
第一步,加载驱动,创建数据库的连接
第二步,编写sql
第三步,需要对sql进行预编译
第四步,向sql里面设置参数
第五步,执行sql
第六步,释放资源
(6)代码

package cn.itcast.login;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Statement;
import cn.itcast.utils.MyJdbcUtils;
public class TestLogin {
	/**
	 * 模拟登录的效果
	 */
	public static void main(String[] args) {
		//正确的效果
//		login("bbb", "123456");
		//失败的效果
//		login("aa", "11");
		//sql的注入
		login("bbb' or '1=1","aaaaa");
	}
	//实现登录的操作
	public static void login(String username,String password) {
		Connection conn = null;
		PreparedStatement psmt = null;
		ResultSet rs = null;
		try {
			//使用工具类得到数据库的连接
			conn = MyJdbcUtils.getConnection();
			//编写sql
			String sql = "select * from user where username=? and password=?";
			//对sql进行预编译
			psmt = conn.prepareStatement(sql);
			//设置参数
			psmt.setString(1, username);
			psmt.setString(2, password);
			//执行sql
			rs = psmt.executeQuery();
			if(rs.next()) {
				System.out.println("login success");
			} else {
				System.out.println("fail");
			}
		}catch(Exception e) {
		}finally {
			//释放资源
			MyJdbcUtils.clearConn(conn, psmt, rs);
		}
	}
}

12. 使用PreparedStatement预编译对象实现crud的操作

注意地方:
第一,编写sql时候,参数使用?表示(占位符)
第二,预编译sql,设置参数的值,执行sql

12.1 使用PreparedStatement预编译对象实现查询的操作
(1)预编译对象executeQuery()执行查询语句

//使用预编译对象实现查询的操作
//查询user表里面的所有的数据
public static void selectUser() {
	Connection conn = null;
	PreparedStatement psmt = null;
	ResultSet rs = null;
	try {
		//使用工具类得到数据库的连接
		conn = MyJdbcUtils.getConnection();
		//编写sql语句
		String sql = "select * from user";
		//预编译sql
		psmt = conn.prepareStatement(sql);
		//执行sql语句
		rs = psmt.executeQuery();
		//遍历结果集
		while(rs.next()) {
			String id = rs.getString("id");
			String username = rs.getString("username");
			String password = rs.getString("password");
			System.out.println(id+" :: "+username+" :: "+password);
		}
	}catch(Exception e) {
	}finally {
	//释放资源
		MyJdbcUtils.clearConn(conn, psmt, rs);
	}
}

12.2 使用PreparedStatement预编译对象实现增加的操作
(1)预编译对象executeUpdate()执行增加的语句

//使用预编译对象实现增加的操作
//向user表里面添加一条记录
public static void addUser(String id,String username,String password) {
	Connection conn = null;
	PreparedStatement psmt = null;
	try {
		//得到数据库的连接
		conn = MyJdbcUtils.getConnection();
		//编写sql语句
		String sql = "insert into user values(?,?,?)";
		//预编译sql语句
		psmt = conn.prepareStatement(sql);
		//设置参数
		psmt.setString(1, id);
		psmt.setString(2, username);
		psmt.setString(3, password);
		//执行sql
		int rows = psmt.executeUpdate();
		if(rows > 0) {
			System.out.println("success");
		} else {
			System.out.println("fail");
		}
	}catch(Exception e) {
		
	}finally {
		//释放资源
		MyJdbcUtils.clearConn(conn, psmt, null);
	}
}

12.3 使用PreparedStatement预编译对象实现修改的操作
(1)预编译对象executeUpdate()执行修改的语句

//使用预编译对象实现修改的操作
//修改user表里面id=5的username为mary,password修改为555
public static void updateUser(String id,String username,String password) {
	Connection conn = null;
	PreparedStatement psmt = null;
	try {
		//得到数据库的连接
		conn = MyJdbcUtils.getConnection();
		//编写sql
		String sql = "update user set username=?,password=? where id=?";
		//预编译sql
		psmt = conn.prepareStatement(sql);
		//设置参数
		psmt.setString(1, username);
		psmt.setString(2, password);
		psmt.setString(3, id);
		//执行sql
		int rows = psmt.executeUpdate();
		if(rows > 0) {
			System.out.println("success");
		} else {
			System.out.println("fail");
		}
	}catch(Exception e) {
		e.printStackTrace();
	}finally {
		//释放资源
		MyJdbcUtils.clearConn(conn, psmt, null);
	}
}

12.4 使用PreparedStatement预编译对象实现删除的操作
(1)预编译对象executeUpdate()执行删除的语句

//使用预编译对象实现删除的操作
//删除user表里面id=2的记录
public static void deleteUser(String id) {
	Connection conn = null;
	PreparedStatement psmt = null;
	try {
		//得到连接
		conn = MyJdbcUtils.getConnection();
		//编写sql
		String sql = "delete from user where id=?";
		//预编译sql
		psmt = conn.prepareStatement(sql);
		//设置参数
		psmt.setString(1, id);
		//执行sql语句
		int rows = psmt.executeUpdate();
		if(rows > 0) {
			System.out.println("success");
		} else {
			System.out.println("fail");
		}
	}catch(Exception e) {

	}finally {
		//释放资源
		MyJdbcUtils.clearConn(conn, psmt, null);
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

左绍骏

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值