下载 JDBC
https://mvnrepository.com/
创建项目,然后创建一个目录并将下载好的 jar 包拷贝进去
选择 Add as Library,让这个目录能被项目识别
连接数据库服务器
在 JDBC 里面,使用 DataSource 类来描述数据库的位置
import com.mysql.cj.jdbc.MysqlDataSource;
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.SQLException;
public class JDBCTest {
public static void main(String[] args) throws SQLException {
// 使用 DataSource 描述 MySQL 服务器的位置
DataSource dataSource = new MysqlDataSource();
((MysqlDataSource)dataSource).setURL("jdbc:mysql://127.0.0.1:3306/mydb?characterEncoding=utf8&useSSL=false");
((MysqlDataSource)dataSource).setUser("root");
((MysqlDataSource)dataSource).setPassword("233333");
// 和数据库建立连接
Connection connection = dataSource.getConnection();
System.out.println(connection);
}
}
// 输出:com.mysql.cj.jdbc.ConnectionImpl@1e88b3c
DataSource 是一个 interface,不能直接实例化,而 MysqlDataSource 则是实现类
mydb
是要连接的数据库名;characterEncoding=utf8
,设置客户端连接服务器使用的字符集;useSSL=false
不启用加密
最后还要设置好用户名和密码
然后建立连接,打印出对象说明连接成功了
对数据库进行操作
上述代码完成了后续的构造 SQL 语句,这里以插入一条数据为例,还需要借助 PreparedStatement 对象,然后执行 SQL,最后断开连接,释放资源
import com.mysql.cj.jdbc.MysqlDataSource;
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
public class JDBCTest {
public static void main(String[] args) throws SQLException {
// 使用 DataSource 描述 MySQL 服务器的位置
DataSource dataSource = new MysqlDataSource();
((MysqlDataSource)dataSource).setURL("jdbc:mysql://127.0.0.1:3306/mydb?characterEncoding=utf8&useSSL=false");
((MysqlDataSource)dataSource).setUser("root");
((MysqlDataSource)dataSource).setPassword("123456");
// 和数据库建立连接
Connection connection = dataSource.getConnection();
//System.out.println(connection);
// 构造 SQL 语句
String sql = "insert into student values(1, '张三')";
PreparedStatement statement = connection.prepareStatement(sql);
// 执行 SQL 语句
// insert, update, delete 都是通过 executeUpdate 来执行,select 通过 executeQuery 来执行
// 返回影响的行数
int n = statement.executeUpdate();
System.out.println("n = " + n);
// 断开连接,释放资源,后创建的先释放
statement.close();
connection.close();
}
}
// 输出:n = 1
很多时候我们的 SQL 语句不能是写死的,一种最简单的方式的就是通过拼接字符串来构造 SQL 语句,如:
String sql = "insert into student values(" + num + ", '" + name + "')";
这样写会带来两个问题,一是代码丑陋,引号太多不易读,二是无法防止SQL注入
正确的写法:
String sql = "insert into student values(?, ?)";
使用 ?
作为占位符,后续使用 statement 对象进行替换。
statement.setInt(1, num); // 将第1个?替换成num
statement.setString(2, name); // 将第2个?替换成name
System.out.println(statement); // 打印statement
// 输出:com.mysql.cj.jdbc.ClientPreparedStatement: insert into student values(2, 'lisi')
// 说明拼接的没问题
select 操作:
import com.mysql.cj.jdbc.MysqlDataSource;
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class JDBCSelect {
public static void main(String[] args) throws SQLException {
DataSource dataSource = new MysqlDataSource();
((MysqlDataSource)dataSource).setURL("jdbc:mysql://127.0.0.1:3306/mydb?characterEncoding=utf8&useSSL=false");
((MysqlDataSource)dataSource).setUser("root");
((MysqlDataSource)dataSource).setPassword("123456");
Connection connection = dataSource.getConnection();
String sql = "select * from student";
PreparedStatement statement = connection.prepareStatement(sql);
// select 使用 executeQuery,返回一个 ResultSet
ResultSet resultSet = statement.executeQuery();
// 遍历 ResultSet
while (resultSet.next()) {
int id = resultSet.getInt("id");
String name = resultSet.getString("name");
System.out.println(id + ": " + name);
}
// 释放
resultSet.close();
statement.close();
connection.close();
}
}