每个数据库都会提供一组API来支持程序员实现自己客户端,自己根据需求来完成一些具体的增删查改的功能。但数据库也有很多种,例如 Oracle、MySQL、SQL Server 等。显然,这些不同的数据库是出自不同的厂商之手,而对于数据库 API 的约定,并没有一个业界统一的标准。 Java 这种跨平台的语言就弄了一个大统一的方案,就叫JDBC。也就是说,Java约定了一组API,称为 JDBC,这组 API 里面就包含了一些类和一些方法,通过这些类和方法来实现数据库的基本操作。再由各个厂商提供各自的数据驱动包,来和 JDBC 的 API 对接。程序员只需要掌握这一套 JDBC API 就可以操作各种各样的数据库了。
依赖仓库
选择和自己数据库版本相同的连接依赖。
<dependency>
<groupId>mysqlgroupId>
<artifactId>mysql-connector-javaartifactId>
<version>8.0.30version>
dependency>
不是必须的,在较新的 JDBC 版本中,使用Class.forName("com.mysql.cj.jdbc.Driver");
注册驱动已经不是必需的步骤。在较旧的 JDBC 版本(例如 JDBC 3.0 及之前的版本)中,手动加载驱动是必须的,因为在那些版本中,驱动的加载不是由DriverManager
自动完成的。
在 JDBC 4.0 及更高版本中,Java引入了服务提供者机制(Service Provider Mechanism),其中DriverManager
的registerDriver
方法能够自动识别和加载可用的 JDBC 驱动。因此,对于新的 MySQL Connector/J 驱动,不再需要显式地调用Class.forName("com.mysql.cj.jdbc.Driver");
。
Class.forName("com.mysql.cj.jdbc.Driver");//mysql8.0
Class.forName("com.mysql.jdbc.Driver");//mysql8.0以前
String url = "jdbc:mysql://localhost:3306/test";
String user = "root";
String password = "120125hzy.";
Connection conn = DriverManager.getConnection(url, user, password);
//获取执行sql对象 Statement
Statement stmt = conn.createStatement();
//处理结果集
ResultSet rs = null;
rs=stmt.executeQuery(sql);//executeQuery 执行select语句
rs=stmt.executeUpdate(sql);//executeUpdate 执行 INSERT、UPDATE 或 DELETE 语句以及 SQL DDL(数据定义语言)语句,例如 CREATE TABLE 和 DROP TABLE。INSERT、UPDATE 或 DELETE 语句的效果是修改表中零行或多行中的一列或多列。executeUpdate 的返回值是一个整数(int),指示受影响的行数(即更新计数)。对于 CREATE TABLE 或 DROP TABLE 等不操作行的语句,executeUpdate 的返回值总为零。
rs=stmt.execute(sql);//方法execute:可用于执行任何SQL语句,返回一个boolean值,表明执行该SQL语句是否返回了ResultSet。如果执行后第一个结果是ResultSet,则返回true,否则返回false。但它执行SQL语句时比较麻烦,通常我们没有必要使用execute方法来执行SQL语句,而是使用executeQuery或executeUpdate更适合,但如果在不清楚SQL语句的类型时则只能使用execute方法来执行该SQL语句了。
Statement createStatement()
:普通执行sql对象。PreparedStatement prepareStatement(sql)
:预编译sql的执行sql对象防止sql注入,可以多次执行,只需变更参数值。CallableStatement prepareCall(sql)
:执行存储过程的对象。执行sql语句:
int executeUpdate(sql)
:执行DML,DDL语句,返回DML语句影响的行数,DDL语句执行后,成功也可能返回0。
ResultSet executeQuery(sql)
:执行DQL语句返回值,ResultSet 结果集对象。
预编译sql语句并执行,预防sql注入
// 获取 PreparedStatement 对象
// sql语句中的参数值,使用?占位符替代
String sql = "select * from user where uesrname = ? and password = ?";
// 通过Connection对象获取,并传入对应的sql语句
PreparedStatement pstmt = conn.prepareStatement(sql);
/* 设置参数值
PreparedStatement对象:setXxx(参数1,参数2):给?赋值
Xxx:数据类型:如setInt(参数1,参数2);
参数:
参数1:?的位置编号,从1开始
参数2:?的值
*/
pstmt.setString(1, "zs");
pstmt.setInt(2,123);
// 执行sql
pstmt.executeQuery(); // 不需要传递sql
setAutoCommit(boolean autoCommit)
:开启事务,true为自动提交事务,false为手动。commit()
:提交事务。rollback()
:回滚事务。ResultSet
:封装了DQL查询语句的结果。
获取查询结果:
boolean next()
:将光标向后移动一行,判断当前行是否为有效行xxx getXxx(参数)
:获取数据
JDBC连接类
public class JDBC {
static Connection connection = null;
/*static { 高版本不是必须的,为了兼容性可以写
try {
Class.forName("com.mysql.cj.jdbc.Driver");
} catch (ClassNotFoundException e) {
throw new RuntimeException(e);
}
}*/
private JDBC() {
}
public static Connection getConnection() {
try {
String url = "jdbc:mysql://localhost:3306/test";
String user = "root";
String password = "120125hzy.";
connection = DriverManager.getConnection(url, user, password);
} catch (SQLException e) {
System.out.println("数据库连接失败");
e.printStackTrace();
}
System.out.println("数据库连接成功");
return connection;
}
public static void close() {
try {
if (connection != null && !connection.isClosed()) {
connection.close();
System.out.println("数据库关闭成功");
}
} catch (SQLException e) {
System.out.println("数据库关闭失败");
e.printStackTrace();
}
}
}
实体类 User
public class User {
private int id;
private String name;
private Double balance;
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 Double getBalance() {
return balance;
}
public void setBalance(Double balance) {
this.balance = balance;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", name='" + name + '\'' +
", balance=" + balance +
'}';
}
}
Dao 层
public class UserDao {
public static List<User> select() {
Connection conn = JDBC.getConnection();
try {
PreparedStatement ps = conn.prepareStatement("select * from user2");
ResultSet resultSet = ps.executeQuery();
List<User> ans = new ArrayList<>();
while (resultSet.next()) {
User user = new User();
user.setId(resultSet.getInt("id"));
user.setName(resultSet.getString("name"));
user.setBalance(resultSet.getDouble("balance"));
ans.add(user);
}
return ans;
} catch (SQLException e) {
throw new RuntimeException(e);
} finally {
JDBC.close();
}
}
public static User selectByID(Integer id) {
Connection conn = JDBC.getConnection();
try {
PreparedStatement ps = conn.prepareStatement("select * from user2 where id = ?");
ps.setInt(1, id);
ResultSet resultSet = ps.executeQuery();
User user = new User();
while (resultSet.next()) {
user.setId(resultSet.getInt("id"));
user.setName(resultSet.getString("name"));
user.setBalance(resultSet.getDouble("balance"));
}
return user;
} catch (SQLException e) {
throw new RuntimeException(e);
} finally {
JDBC.close();
}
}
public static String updateByID(User user) {
Connection conn = JDBC.getConnection();
try {
PreparedStatement ps =
conn.prepareStatement("update user2 set name = ?, balance = ? where id = ?");
ps.setString(1, user.getName());
ps.setDouble(2, user.getBalance());
ps.setInt(3, user.getId());
int i = ps.executeUpdate();
return i > 0 ? "成功" : "失败";
} catch (SQLException e) {
throw new RuntimeException(e);
} finally {
JDBC.close();
}
}
}
查询所有
@Test
public void test01(){
// 查询所有
List<User> users = UserDao.select();
for (User user : users){
System.out.println(user);
}
}
根据id查询
@Test
public void test02() {
// 根据id查询
User user = UserDao.selectByID(1);
System.out.println(user);
}
根据id修改
@Test
public void test03() {
// 根据id修改
User user = new User();
user.setId(1);
user.setName("李逍遥");
user.setBalance(2000.00);
System.out.println(UserDao.updateByID(user));
// 根据id查询
user = UserDao.selectByID(1);
System.out.println(user);
}