为什么要使用JDBC?
JDBC:java database connectivity SUN公司提供的一套操作数据库的标准规范。
java语言操作数据库的一种技术(规范)
JDBC与数据库驱动的关系:接口与实现的关系。
JDBC规范(掌握四个核心对象):
DriverManager类:用于注册驱动 java.sql.DriverManager
Connection接口: 表示与数据库创建的连接 java.sql.Connection
Statement接口: 操作数据库sql语句的对象 java.sql.Connection
ResultSet接口: 结果集或一张虚拟表 java.sql.Connection
开发一个JDBC程序的准备工作:
开发一个JDBC程序
实现查询数据库中的数据显示在java的控制台中
1、创建数据库表,并向表中添加测试数据
create database day06;
use day06;
create table users(
id int primary key auto_increment,
name varchar(40),
password varchar(40),
email varchar(60),
birthday date
)character set utf8 collate utf8_general_ci;
insert into users(name,password,email,birthday) values('zs','123456','zs@sina.com','1980-12-04');
insert into users(name,password,email,birthday) values('lisi','123456','lisi@sina.com','1981-12-04');
insert into users(name,password,email,birthday) values('wangwu','123456','wangwu@sina.com','1979-12-04');
2、创建java project项目,添加数据库驱动(*.jar)
3、实现JDBC操作
//1、注册驱动
//2、创建连接
//3、得到执行sql语句的Statement对象
//4、执行sql语句,并返回结果
//5、处理结果
//6关闭资源
相关代码
Demo1.java
package com.sunny.jdbcdemo;
import java.sql.Statement;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
//使用jdbc技术实现查询数据库数据,并显示在控制台中
public class Demo1 {
public static void main(String[] args) throws Exception{
//注册驱动
DriverManager.registerDriver(new com.mysql.jdbc.Driver());
//获取连接Connection
Connection conn = DriverManager.getConnection("jdbc://localhost:3306/jdbc","root","");
//得到执行sql语句的对象Statement
Statement stmt = conn.createStatement();
//执行sql语句,并返回结果
ResultSet rs = stmt.executeQuery("select password,email,birthday,id,name from users");
//处理结果
while(rs.next()){
System.out.println(rs.getObject("password"));
System.out.println(rs.getObject("id"));
System.out.println(rs.getObject("name"));
System.out.println(rs.getObject("birthday"));
System.out.println(rs.getObject("email"));
System.out.println("-----------------------");
}
//关闭资源
rs.close();
stmt.close();
conn.close();
}
}
Demo2.java
package com.sunny.jdbcdemo;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.Properties;
import org.junit.Test;
public class Demo2 {
@Test
public void test1() throws Exception{
//加载驱动
Class.forName("com.mysql.jdbc.Driver");
//获取连接Connection
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/jdbc","root","");
//得到执行sql语句的对象Statement
Statement stmt = conn.createStatement();
//执行sql语句,并返回结果
ResultSet rs = stmt.executeQuery("select id,name,password,email,birthday from users");
//处理结果
while(rs.next()){
System.out.println(rs.getObject(1));
System.out.println(rs.getObject(2));
System.out.println(rs.getObject(3));
System.out.println(rs.getObject(4));
System.out.println(rs.getObject(5));
System.out.println("-------------");
}
//关闭资源
rs.close();
stmt.close();
conn.close();
}
@Test
public void test2() throws Exception{
//加载驱动
Class.forName("com.mysql.jdbc.Driver");
//获取连接Connection
Properties info = new Properties();
info.setProperty("user", "root");
info.setProperty("password","");
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/jdbc",info);
//得到执行sql语句的对象Statement
Statement stmt = conn.createStatement();
//执行sql语句,并返回结果
ResultSet rs = stmt.executeQuery("select id,name,password,email,birthday from users");
//处理结果
while(rs.next()){
System.out.println(rs.getObject(1));
System.out.println(rs.getObject(2));
System.out.println(rs.getObject(3));
System.out.println(rs.getObject(4));
System.out.println(rs.getObject(5));
System.out.println("--------------------");
}
//关闭资源
rs.close();
stmt.close();
conn.close();
}
@Test
public void test3() throws Exception{
//加载驱动
Class.forName("com.mysql.jdbc.Driver");
//获取连接connection
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/jdbc?user=root&password=");
//得到执行sql语句的对象Statement
Statement stmt = conn.createStatement();
//执行sql语句,并返回结果
ResultSet rs = stmt.executeQuery("select id,name,password,email,birthday from users");
//处理结果
while(rs.next()){
System.out.println(rs.getObject(1));
System.out.println(rs.getObject(2));
System.out.println(rs.getObject(3));
System.out.println(rs.getObject(4));
System.out.println(rs.getObject(5));
System.out.println("-------------------");
}
//关闭资源
rs.close();
stmt.close();
conn.close();
}
@Test
public void test4() throws Exception{
//获取连接Connection
Connection conn=null;
//得到执行sql语句的对象 Statement
Statement stmt = null;
//执行sql语句,并返回结果
ResultSet rs = null;
try{
//加载驱动
Class.forName("com.mysql.jdbc.Driver");
conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/jdbc","root","");
stmt = conn.createStatement();
rs = stmt.executeQuery("select id,name,password,email,birthday from users");
//处理结果
while(rs.next()){
System.out.println(rs.getObject(1));
System.out.println(rs.getObject(2));
System.out.println(rs.getObject(3));
System.out.println(rs.getObject(4));
System.out.println(rs.getObject(5));
System.out.println("--------------------");
}
}catch(Exception e){
e.printStackTrace();
}finally{
//关闭资源
if(rs!=null){
try{
rs.close();
}catch(Exception e){
e.printStackTrace();
}
rs=null;
}
if(stmt!=null){
try{
stmt.close();
}catch(Exception e){
e.printStackTrace();
}
stmt=null;
}
if(conn!=null){
try{
conn.close();
}catch(Exception e){
e.printStackTrace();
}
conn=null;
}
}
}
}
测试结果:
JDBC增删查改
User.java
package com.sunny.entity;
import java.util.Date;
public class User {
private int id;
private String name;
private String password;
private String email;
private Date birthday;
public int getId(){
return id;
}
public void setId(int id){
this.id=id;
}
public String getName(){
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword(){
return password;
}
public void setPassword(String password){
this.password=password;
}
public String getEmail(){
return email;
}
public void setEmail(String email){
this.email=email;
}
public Date getBirthday(){
return birthday;
}
public void setBirthday(Date birthday){
this.birthday=birthday;
}
@Override
public String toString(){
return "User [id="+id+",name="+name+",password="+password+",email="+email+",birthday="+birthday+"]";
}
}
TestCRUD.java
package com.sunny.jdbcdemo;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;
import org.junit.Test;
import com.sunny.entity.User;
public class TestCRDUD {
// 查询表中所有数据
@Test
public void testSelect() throws Exception {
// 加载驱动
Class.forName("com.mysql.jdbc.Driver");
// 获取连接Connection
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/jdbc", "root", "");
// 得到执行sql语句的对象Statement
Statement stmt = conn.createStatement();
// 执行sql语句,并返回结果
ResultSet rs = stmt.executeQuery("select password,email,birthday,id,name from users");
List<User> list = new ArrayList<User>();
// 处理结果
while (rs.next()) {
User u = new User();
u.setId(rs.getInt("id"));
u.setName(rs.getString("name"));
u.setPassword(rs.getString("password"));
u.setEmail(rs.getString("email"));
u.setBirthday(rs.getDate("birthday"));
list.add(u);
}
// 关闭资源
rs.close();
stmt.close();
conn.close();
for (User user : list) {
System.out.println(user);
}
}
// 查询表中最后一条数据
@Test
public void testSelect1() throws Exception {
// 加载驱动
Class.forName("com.mysql.jdbc.Driver");
// 获取连接Connection
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/jdbc", "root", "");
// 得到执行sql语句的对象Statement
Statement stmt = conn.createStatement();
// 执行sql语句,并返回结果
ResultSet rs = stmt.executeQuery("select password,email,birthday,id,name from users");
List<User> list = new ArrayList<User>();
rs.afterLast();
rs.previous();
// 处理结果
// while(rs.next()){
User u = new User();
u.setId(rs.getInt("id"));
u.setName(rs.getString("name"));
u.setPassword(rs.getString("password"));
u.setEmail(rs.getString("email"));
u.setBirthday(rs.getDate("birthday"));
list.add(u);
// }
// 关闭资源
rs.close();
stmt.close();
conn.close();
System.out.println(u);
}
//增
@Test
public void testInsert() throws Exception {
// 加载驱动
Class.forName("com.mysql.jdbc.Driver");
// 获取连接Connection
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/jdbc?user=root&password=");
// 得到执行sql语句的对象Statement
Statement stmt = conn.createStatement();
// 执行sql语句,并返回结果
int i = stmt.executeUpdate("INSERT INTO users VALUES(5,'tom','123','tom@163.com','2015-09-28')");
if (i > 0) {
System.out.println("success");
}
// 关闭资源
stmt.close();
conn.close();
}
//改
@Test
public void testUpdate() throws Exception {
// 加载驱动
Class.forName("com.mysql.jdbc.Driver");
// 获取连接Connection
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/jdbc?user=root&password=");
// 得到执行sql语句的对象Statement
Statement stmt = conn.createStatement();
// 执行sql语句,并返回结果
int i = stmt.executeUpdate("UPDATE users SET NAME='jerry',PASSWORD='333',email='jerry@163.com' WHERE id=3");
if (i > 0) {
System.out.println("success" + " 修改了" + i + "行");
} else {
System.out.println("修改了" + i + "行");
}
// 关闭资源
stmt.close();
conn.close();
}
//删
@Test
public void testDelete() throws Exception {
// 加载驱动
Class.forName("com.mysql.jdbc.Driver");
// 获取连接Connection
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/jdbc?user=root&password=");
// 得到执行sql语句的对象Statement
Statement stmt = conn.createStatement();
// 执行sql语句,并返回结果
int i = stmt.executeUpdate("DELETE FROM users WHERE id=4");
if (i > 0) {
System.out.println("success");
}
// 关闭资源
stmt.close();
conn.close();
}
}
JDBC常用的类和接口详解
1、java.sql.Drivermanager类 : 创建连接
a、注册驱动
DriverManager.registerDriver(new com.mysql.jdbc.Driver());不建议使用
原因有2个:
导致驱动被注册2次。
强烈依赖数据库的驱动jar
解决办法:
Class.forName(“com.mysql.jdbc.Driver”);
b、与数据库建立连接
static Connection getConnection(String url, String user, String password)
试图建立到给定数据库 URL 的连接。
getConnection(“jdbc:mysql://localhost:3306/day06”, “root”, “root”);
URL:SUN公司与数据库厂商之间的一种协议。
jdbc:mysql://localhost:3306/day06
协议 子协议 IP :端口号 数据库
mysql: jdbc:mysql://localhost:3306/day14 或者 jdbc:mysql:///day14(默认本机连接)
oracle: jdbc:oracle:thin:@localhost:1521:sid
Properties info = new Properties();//要参考数据库文档
info.setProperty("user", "root");
info.setProperty("password","root");
getConnection(String url, Properties info)
getConnection(String url)
DriverManager.getConnection(“jdbc:mysql://localhost:3306/day14?user=root&password=root”);
2、java.sql.Connection接口:一个连接
接口的实现在数据库驱动中。所有与数据库交互都是基于连接对象的。
Statement createStatement(); //创建操作sql语句的对象
3、java.sql.Statement接口: 操作sql语句,并返回相应结果的对象(小货车)
接口的实现在数据库驱动中。用于执行静态 SQL 语句并返回它所生成结果的对象。
ResultSet executeQuery(String sql) 根据查询语句返回结果集。只能执行select语句。
int executeUpdate(String sql) 根据执行的DML(insert update delete)语句,返回受影响的行数。
boolean execute(String sql) 此方法可以执行任意sql语句。返回boolean值,表示是否返回ResultSet结果集。仅当执行select语句,且有返回结果时返回true, 其它语句都返回false;
4、java.sql.ResultSet接口: 结果集(客户端存表数据的对象)
a、封装结果集的。
提供一个游标,默认游标指向结果集第一行之前。
调用一次next(),游标向下移动一行。
提供一些get方法。
封装数据的方法
Object getObject(int columnIndex); 根据序号取值,索引从1开始
Object getObject(String ColomnName); 根据列名取值。
将结果集中的数据封装到javaBean中
java的数据类型与数据库中的类型的关系
Java | 数据库 | |
---|---|---|
byte | tityint | 1个字节 |
short | smallint | 2个字节 |
int | int | 4个字节 |
long | bigint | 8个字节 |
float | float | |
double | double | |
String | char varchar | |
Date | date |
boolean next() //将光标从当前位置向下移动一行
int getInt(int colIndex) //以int形式获取ResultSet结果集当前行指定列号值
int getInt(String colLabel) //以int形式获取ResultSet结果集当前行指定列名值
float getFloat(int colIndex) //以float形式获取ResultSet结果集当前行指定列号值
float getFloat(String colLabel) //以float形式获取ResultSet结果集当前行指定列名值
String getString(int colIndex) //以String 形式获取ResultSet结果集当前行指定列号值
String getString(String colLabel) //以String形式获取ResultSet结果集当前行指定列名值
Date getDate(int columnIndex);
Date getDate(String columnName);
void close() //关闭ResultSet 对象
b、可移动游标的方法
boolean next() //将光标从当前位置向前移一行。
boolean previous() //将光标移动到此 ResultSet 对象的上一行。
boolean absolute(int row) //参数是当前行的索引,从1开始根据行的索引定位移动的指定索引行。
void afterLast() //将光标移动到末尾,正好位于最后一行之后。
void beforeFirst() //将光标移动到开头,正好位于第一行之前。
5、释放资源
资源有限,要正确关闭。
@Test
public void test4() throws Exception{
//获取连接Connection
Connection conn=null;
//得到执行sql语句的对象 Statement
Statement stmt = null;
//执行sql语句,并返回结果
ResultSet rs = null;
try{
//加载驱动
Class.forName("com.mysql.jdbc.Driver");
conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/jdbc","root","");
stmt = conn.createStatement();
rs = stmt.executeQuery("select id,name,password,email,birthday from users");
//处理结果
while(rs.next()){
System.out.println(rs.getObject(1));
System.out.println(rs.getObject(2));
System.out.println(rs.getObject(3));
System.out.println(rs.getObject(4));
System.out.println(rs.getObject(5));
System.out.println("--------------------");
}
}catch(Exception e){
e.printStackTrace();
}finally{
//关闭资源
if(rs!=null){
try{
rs.close();
}catch(Exception e){
e.printStackTrace();
}
rs=null;
}
if(stmt!=null){
try{
stmt.close();
}catch(Exception e){
e.printStackTrace();
}
stmt=null;
}
if(conn!=null){
try{
conn.close();
}catch(Exception e){
e.printStackTrace();
}
conn=null;
}
}
}
使用JDBC实现CRUD操作
User.java
package com.dgut.edu.entity;
import java.util.Date;
public class User {
private int id;
private String name;
private String password;
private String email;
private Date birthday;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
@Override
public String toString(){
return "User [id="+id+",name="+name+",password="+password+",email="+email+",birthday="+birthday+"]";
}
}
DBUtils.java
package com.dgut.edu.util;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.ResourceBundle;
public class DBUtils {
private static String driverClass;
private static String url;
private static String username;
private static String password;
static{
//此对象是用于加载properties文件结构的
ResourceBundle rb=ResourceBundle.getBundle("dbinfo");
driverClass=rb.getString("driverClass");
url=rb.getString("url");
username=rb.getString("username");
password=rb.getString("password");
try{
Class.forName(driverClass);
}catch(ClassNotFoundException e){
e.printStackTrace();
}
}
//得到连接的方法
public static Connection getConnection() throws Exception{
return DriverManager.getConnection(url,username,password);
}
//关闭资源的方法
public static void closeAll(ResultSet rs,Statement stmt,Connection conn){
//关闭资源
if(rs!=null){
try{
rs.close();
}catch(Exception e){
e.printStackTrace();
}
rs=null;
}
if(stmt!=null){
try{
stmt.close();
}catch(Exception e){
e.printStackTrace();
}
stmt=null;
}
if(conn!=null){
try{
conn.close();
}catch(Exception e){
e.printStackTrace();
}
conn=null;
}
}
}
dbinfo.properties
driverClass=com.mysql.jdbc.Driver
url=jdbc:mysql:///jdbc
username=root
password=
TestCRUD.java
package com.dgut.edu.crud;
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 org.junit.Test;
import com.dgut.edu.entity.User;
import com.dgut.edu.util.DBUtils;
public class TestCRUD {
// 查
@Test
public void testSelect() {
Connection conn = null;
Statement stmt = null;
ResultSet rs = null;
try {
conn = DBUtils.getConnection();
stmt = conn.createStatement();
rs = stmt.executeQuery("select * from users");
List<User> list = new ArrayList<User>();
while (rs.next()) {
User u = new User();
u.setId(rs.getInt(1));
u.setName(rs.getString(2));
u.setPassword(rs.getString(3));
u.setEmail(rs.getString(4));
u.setBirthday(rs.getDate(5));
list.add(u);
}
for (User user : list) {
System.out.println(user);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
DBUtils.closeAll(rs, stmt, conn);
}
}
// 增
@Test
public void testInsert() {
Connection conn = null;
PreparedStatement stmt = null;
try {
conn = DBUtils.getConnection();
stmt = conn.prepareStatement("INSERT INTO users VALUES(?,?,?,?,?)");
stmt.setInt(1, 4);
stmt.setString(2, "Sunny");
stmt.setString(3, "666");
stmt.setString(4, "Sunny@qq.com");
// stmt.setDate(5, new java.sql.Date(System.currentTimeMillis()));
stmt.setString(5, "2017-09-11");
int i = stmt.executeUpdate();
if (i > 0) {
System.out.println("success");
}
} catch (Exception e) {
e.printStackTrace();
} finally {
DBUtils.closeAll(null, stmt, conn);
}
}
// 改
@Test
public void testUpdate() {
Connection conn = null;
PreparedStatement stmt = null;
try {
conn = DBUtils.getConnection();
stmt = conn.prepareStatement("UPDATE users SET NAME=?,PASSWORD=?,email=? WHERE id=?");
stmt.setString(1, "Barret");
stmt.setString(2, "123666");
stmt.setString(3, "Barret@qq.com");
stmt.setInt(4, 5);
int i = stmt.executeUpdate();
if (i > 0) {
System.out.println("success");
}
} catch (Exception e) {
e.printStackTrace();
} finally {
DBUtils.closeAll(null, stmt, conn);
}
}
// 删
@Test
public void testDelete() {
Connection conn = null;
Statement stmt = null;
try {
conn = DBUtils.getConnection();
stmt = conn.createStatement();
int i = stmt.executeUpdate("DELETE FROM users WHERE id=4");
if (i > 0) {
System.out.println("success");
}
} catch (Exception e) {
e.printStackTrace();
} finally {
DBUtils.closeAll(null, stmt, conn);
}
}
}
实现一个用户登录的功能
User.java
package com.itheima.entity;
import java.util.Date;
public class User {
private int id;
private String name;
private String password;
private String email;
private Date birthday;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
@Override
public String toString() {
return "User [id=" + id + ", name=" + name + ", password=" + password
+ ", email=" + email + ", birthday=" + birthday + "]";
}
}
DBUtils.java
package com.itheima.util;
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 DBUtils {
private static String driverClass;
private static String url;
private static String user;
private static String password;
static{
ResourceBundle rb = ResourceBundle.getBundle("dbinfo");
//给上面4个变量赋值
driverClass = rb.getString("driverClass");
url = rb.getString("url");
user = rb.getString("user");
password = rb.getString("password");
try {
Class.forName(driverClass);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
//得到连接
public static Connection getConnection() throws SQLException{
return DriverManager.getConnection(url, user, password);
}
//关闭资源
public static void closeAll(ResultSet rs,Statement stmt,Connection conn){
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;
}
}
}
DoLogin.java
package com.itheima.service;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import com.itheima.entity.User;
import com.itheima.util.DBUtils;
public class DoLogin {
/**
* 根据用户名和密码查询用户对象信息
* @param name
* @param pwd
* @return u
*/
public User findUser(String name,String pwd){
Connection conn = null;
PreparedStatement stmt = null;
ResultSet rs = null;
User u = null;
try {
conn = DBUtils.getConnection();//得到连接对象Connection
String sql ="SELECT * FROM users WHERE NAME=? AND PASSWORD=?";
stmt = conn.prepareStatement(sql);//得到执行sql语句的对象Statement
//给?赋值
stmt.setString(1, name);
stmt.setString(2, pwd);
rs = stmt.executeQuery();//执行sql语句
if(rs.next()){
u = new User();
u.setId(rs.getInt(1));
u.setName(rs.getString(2));
u.setPassword(rs.getString(3));
u.setEmail(rs.getString(4));
u.setBirthday(rs.getDate(5));
}
} catch (SQLException e) {
e.printStackTrace();
}finally{
DBUtils.closeAll(rs, stmt, conn);
}
return u;
}
}
Login.java
package com.itheima.client;
import java.util.Scanner;
import com.itheima.entity.User;
import com.itheima.service.DoLogin;
public class Login {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
System.out.println("请输入用户名:");
String name = input.nextLine();
System.out.println("请输入密码:");
String pwd = input.nextLine();
DoLogin dl = new DoLogin();
User user = dl.findUser(name, pwd);//调用查询用户的方法
if(user!=null){
System.out.println("欢迎你:"+user.getName());
}else{
System.out.println("用户名或密码错误!");
}
}
}
SQL注入问题:preparedStatement
preparedStatement:预编译对象, 是Statement对象的子类。
特点:
性能要高
会把sql语句先编译
sql语句中的参数会发生变化,过滤掉用户输入的关键字。