一、JDBC
1.JDBC概念
JDBC(Java DataBase Connectivity:java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系型数据库提供统一访问,它是由一组用Java语言编写的类和接口组成的。
2.JDBC作用
可以通过java代码操作数据库。
3.JDBC本质
是java官方提供的一套规范(接口),用于帮助开发人员快速实现不同关系型数据库的连接。
二、导入MySQL驱动jar包
1.导入jar包
方法一:从官网下载对应版本的压缩包驱动包下载
解压打开找到
将该JAR文件复制,并在IDEA项目下新建一个lib目录,将JAR文件粘贴至该目录下
然后再右键lib,选择add as library,即可完成导入。
方法二:在pom.xml导入mysql驱动包
<dependencies>
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
<version>8.0.32</version>
</dependency>
</dependencies>
刷新maven即可完成
三、JDBC中增删改查的基本模板
原始表数据,数据库名jdbc_db,表名information
注:以下代码增删改查实际只有SQL语句和执行SQL语句不同
1.查询操作
只有查询数据调用executeQuery()方法,其余增删改都调用executeUpdate()方法
public class JDBCDemo {
public static void main(String[] args) throws Exception {
//1.注册驱动
Class.forName("com.mysql.cj.jdbc.Driver");
//2.获取连接
String url = "jdbc:mysql://localhost:3306/jdbc_db";//连接的数据库
String username = "root";//用户名
String password = "1234";//用户名密码
Connection conn = DriverManager.getConnection(url,username,password);
String userID = "0001";
//3.定义SQL语句
String sql = "select * from information where ID = ?";
//4.获取PreparedStatement对象
PreparedStatement prep = conn.prepareStatement(sql);
//5.将值传入占位符“?”
prep.setString(1,userID);
//6.执行SQL
ResultSet rs = prep.executeQuery();
//打印是否查询成功
System.out.println(rs.next());
//输出查询到的Uname值
System.out.println(rs.getString("Uname"));
//7.释放资源
rs.close();
prep.close();
conn.close();
}
}
控制台输出
2.增加操作
public class JDBCDemo {
public static void main(String[] args) throws Exception {
//1.注册驱动
Class.forName("com.mysql.cj.jdbc.Driver");
//2.获取连接
String url = "jdbc:mysql://localhost:3306/jdbc_db";//连接的数据库
String username = "root";//用户名
String password = "1234";//用户名密码
Connection conn = DriverManager.getConnection(url, username, password);
String userID = "0004";
String Uname = "王四";
//3.定义SQL语句
String sql = "insert into information(ID,Uname) values (?,?)";
//4.获取PreparedStatement对象
PreparedStatement prep = conn.prepareStatement(sql);
//5.将值传入占位符“?”
prep.setString(1, userID);
prep.setString(2, Uname);
//6.执行SQL
int rs = prep.executeUpdate();
System.out.println(rs);
//7.释放资源
prep.close();
conn.close();
}
}
控制台输出
表变化
3.删除操作
public class JDBCDemo {
public static void main(String[] args) throws Exception {
//1.注册驱动
Class.forName("com.mysql.cj.jdbc.Driver");
//2.获取连接
String url = "jdbc:mysql://localhost:3306/jdbc_db";//连接的数据库
String username = "root";//用户名
String password = "1234";//用户名密码
Connection conn = DriverManager.getConnection(url,username,password);
String userID = "0001";
//3.定义SQL语句
String sql = "delete from information where ID = ?";
//4.获取PreparedStatement对象
PreparedStatement prep = conn.prepareStatement(sql);
//5.将值传入占位符“?”
prep.setString(1,userID);
//6.执行SQL
int rs = prep.executeUpdate();
System.out.println(rs);
//7.释放资源
prep.close();
conn.close();
}
}
控制台输出
表变化
4.更新操作
public class JDBCDemo {
public static void main(String[] args) throws Exception {
//1.注册驱动
Class.forName("com.mysql.cj.jdbc.Driver");
//2.获取连接
String url = "jdbc:mysql://localhost:3306/jdbc_db";//连接的数据库
String username = "root";//用户名
String password = "1234";//用户名密码
Connection conn = DriverManager.getConnection(url, username, password);
String userID = "0002";
String Uname = "王大";
//3.定义SQL语句
String sql = "update information set Uname = ? where ID = ?";
//4.获取PreparedStatement对象
PreparedStatement prep = conn.prepareStatement(sql);
//5.将值传入占位符“?”
prep.setString(1, Uname);
prep.setString(2, userID);
//6.执行SQL
int rs = prep.executeUpdate();
System.out.println(rs);
//7.释放资源
prep.close();
conn.close();
}
}
控制台输出
表变化
四、使用PreparedStatement而不使用Statement的原因
1.PreparedStatement在使用时只需要编译一次,就可以运行多次,Statement每运行一次就编译一次,PreparedStatement的效率更高。
2.PreparedStatement需要的SQL语句为用?(占位符)来替换值,Statement所需要的SQL语句为字符串拼接。
3.PreparedStatement解决了SQL注入的问题,Statement没有解决,因为PreparedStatement有一个预编译的过程,就算传入占位符的数据中有SQL关键字也都被认为是值。Statement所需要的是字符串拼接,传入的整个字符串被默认为sql语句,如果用户手动拼接了字符串,那么会导致语句的改变。