import java.sql.Connection;import java.sql.DriverManager;import java.sql.Statement;public class JdbcDemo { public static void main(String[] args) throws Exception { // 注册驱动,可以不写 Class.forName("com.mysql.jdbc.Driver"); // 获取链接 String url = "jdbc:mysql://127.0.0.1:3306/db1?useSSL=false"; String username = "root"; String password = "123456"; Connection conn = DriverManager.getConnection(url, username, password); // 定义sql String sql = "update tb_user set password=123456 where id=1"; // 获取sql执行语句对象 Statement statement = conn.createStatement(); // 执行sql语句 int count = statement.executeUpdate(sql); System.out.println(count); // 释放资源 conn.close(); statement.close(); }}
① DriverManager(驱动管理类)作用: 1.注册驱动,2.获取数据库连接
② Connection(数据库连接对象)作用
-获取执行SQL的对象,1.普通执行SQL对象:Statement,2.预编译SQL的执行SQL对象,防止SQL注入:PreparedStatement,3.执行存储过程的对象:CallableStatement
③ 管理事务
1.MySQL 事务管理
-开启事务:BEGIN;/START TRANSACTION
-提交事务:ICOMMIT
-回滚事务:ROLLBACK
2.JDBC 事务管理:Connection接口中定义了3个对应的方法
-开启事务:setAutoCommit(boolean autoCommit): true为自动提交事务;false为手动提交事务,即为开启事务
-提交事务:commit()
-回滚事务:rollback()
import java.sql.Connection;import java.sql.DriverManager;import java.sql.SQLException;import java.sql.Statement;/** * JDBC API 详解:事务 */public class JDBCWork { public static void main(String[] args) throws Exception { //1. 注册驱动 //Class.forName("com.mysql.jdbc.Driver"); //2. 获取连接:如果连接的是本机mysql并且端口是默认的 3306 可以简化书写 String url = "jdbc:mysql:///db1?useSSL=false"; String username = "root"; String password = "1234"; Connection conn = DriverManager.getConnection(url, username, password); //3. 定义sql String sql1 = "update account set money = 3000 where id = 1"; String sql2 = "update account set money = 3000 where id = 2"; //4. 获取执行sql的对象 Statement Statement stmt = conn.createStatement(); try { // 开启事务 conn.setAutoCommit(false); //5. 执行sql int count1 = stmt.executeUpdate(sql1);//受影响的行数 //6. 处理结果 System.out.println(count1); int i = 3/0; //5. 执行sql int count2 = stmt.executeUpdate(sql2);//受影响的行数 //6. 处理结果 System.out.println(count2); // 提交事务 conn.commit(); } catch (Exception throwables) { // 回滚事务 conn.rollback(); throwables.printStackTrace(); } //7. 释放资源 stmt.close(); conn.close(); }}
③ Statement,执行SQL语句
import org.junit.Test;import java.sql.Connection;import java.sql.DriverManager;import java.sql.SQLException;import java.sql.Statement;/** * JDBC API 详解:Statement */public class JDBCDStatement { /** * 执行DML语句 * @throws Exception */ @Test public void testDML() throws Exception { //1. 注册驱动 //Class.forName("com.mysql.jdbc.Driver"); //2. 获取连接:如果连接的是本机mysql并且端口是默认的 3306 可以简化书写 String url = "jdbc:mysql:///db1?useSSL=false"; String username = "root"; String password = "1234"; Connection conn = DriverManager.getConnection(url, username, password); //3. 定义sql String sql = "update account set money = 3000 where id = 1"; //4. 获取执行sql的对象 Statement Statement stmt = conn.createStatement(); //5. 执行sql int count = stmt.executeUpdate(sql);//执行完DML语句,受影响的行数 //6. 处理结果 System.out.println(count); //7. 释放资源 stmt.close(); conn.close(); }}
④ ResultSet(结果集对象)作用,封装了DQL查询语句的结果
import org.junit.Test;import java.sql.Connection;import java.sql.DriverManager;import java.sql.ResultSet;import java.sql.Statement;import java.util.ArrayList;import java.util.List;/** * JDBC API 详解:ResultSet */public class JDBCDResultSet { /** * 执行DQL * @throws Exception */ @Test public void testResultSet() throws Exception { //1. 注册驱动 //Class.forName("com.mysql.jdbc.Driver"); //2. 获取连接:如果连接的是本机mysql并且端口是默认的 3306 可以简化书写 String url = "jdbc:mysql:///db1?useSSL=false"; String username = "root"; String password = "1234"; Connection conn = DriverManager.getConnection(url, username, password); //3. 定义sql String sql = "select * from account"; //4. 获取statement对象 Statement stmt = conn.createStatement(); //5. 执行sql ResultSet rs = stmt.executeQuery(sql); // 6.1 光标向下移动一行,并且判断当前行是否有数据 while (rs.next()){ //6.2 获取数据 getXxx() int id = rs.getInt("id"); String name = rs.getString("name"); double money = rs.getDouble("money"); System.out.println(id); System.out.println(name); System.out.println(money); } //7. 释放资源 rs.close(); stmt.close(); conn.close(); }}
⑤ PreparedStatement,预编译SQL语句并执行:预防SQL注入问题
import org.junit.Test;import java.sql.*;import java.util.Date;/** * API详解:PreparedStatement */public class JDBCDemo7_PreparedStatement { @Test public void testPreparedStatement2() throws Exception { //1. 注册驱动 //Class.forName("com.mysql.jdbc.Driver"); //2. 获取连接:如果连接的是本机mysql并且端口是默认的 3306 可以简化书写 // useServerPrepStmts=true 参数开启预编译功能 String url = "jdbc:mysql:///db1?useSSL=false&useServerPrepStmts=true"; String username = "root"; String password = "1234"; Connection conn = DriverManager.getConnection(url, username, password); // 接收用户输入 用户名和密码 String name = "zhangsan"; String pwd = "' or '1' = '1"; // 定义sql String sql = "select * from tb_user where username = ? and password = ?"; // 获取pstmt对象 PreparedStatement pstmt = conn.prepareStatement(sql); // 设置?的值 pstmt.setString(1,name); pstmt.setString(2,pwd); ResultSet rs = null; // 执行sql rs = pstmt.executeQuery(); // 判断登录是否成功 if(rs.next()){ System.out.println("登录成功~"); }else{ System.out.println("登录失败~"); } //7. 释放资源 rs.close(); pstmt.close(); conn.close(); }}
① 数据库连接池是个容器,负责分配、管理数据库连接(Connection)
② 它允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个
③ 释放空闲时间超过最大空闲时间的数据库连接来避免因为没有释放数据库连接而引起的数据库连接遗漏
④ Druid
import com.alibaba.druid.pool.DruidDataSourceFactory;import javax.sql.DataSource;import java.io.FileInputStream;import java.sql.Connection;import java.util.Properties;/** * Druid数据库连接池演示 */public class DruidDemo { public static void main(String[] args) throws Exception { //1.导入jar包 //2.定义配置文件 //3. 加载配置文件 Properties prop = new Properties(); prop.load(new FileInputStream("jdbc-demo/src/druid.properties")); //4. 获取连接池对象 DataSource dataSource = DruidDataSourceFactory.createDataSource(prop); //5. 获取数据库连接 Connection Connection connection = dataSource.getConnection(); System.out.println(connection); }}