JDBC、工具类DBUtils

1. 什么是JDBC

  • Java数据库连接-Java DataBase Connectivity
  • JDBC可让Java通过程序操作关系型数据库
  • JDBC基于驱动程序实现与数据库的连接与操作

1.2. JDBC的优点

  • 统一的API,提供一致的开发过程
  • 易于学习,容易上手,代码结构稳定
  • 功能强大,执行效率高,可处理海量数据

2. JDBC开发流程

  • 导入JDBC驱动包
  • 加载并注册JDBC驱动
  • 创建数据库连接
  • 创建Statement对象
  • 遍历查询结果
  • 关闭连接,释放资源

2.1. 导入JDBC驱动包

repositories {
    mavenCentral()
    maven{
        //查找aliyun maven库(必须添加这个地址,否则无法找到SqlServer数据库jar)
        url'http://maven.aliyun.com/nexus/content/groups/public/'
    }
}
dependencies {
    implementation 'com.microsoft.sqlserver:sqljdbc4:4.0'
}

2.2. 创建数据库连接代码

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
public class JDBC {
    public static void main(String[] args) throws ClassNotFoundException, 
SQLException {
        String dbDriver = "com.microsoft.sqlserver.jdbc.SQLServerDriver"; //JDBC
驱动类
        String dbURL = "jdbc:sqlserver://194.0.11.27:1433;DatabaseName=test"; //
连接字符串
        String dbUsername = "sa"; //数据库用户名
        String dbPassword = "qzzg491166159"; //数据库密码
        //1.加载并初始化JDBC驱动
        Class.forName(dbDriver);
        //2.创建数据库连接
        Connection connection = DriverManager.getConnection(dbURL,
                dbUsername, dbPassword);
    }
}

2.3. Class.forName的作用

Class.forName用于加载指定的JDBC驱动类
Class.forName本质是通知JDBC注册这个驱动类
驱动由数据库厂商自行开发,连接字符串也不同

2.4. DriverManager

Connection对象用于JDBC与数据库的网络通信对象
java.sql.Connection是一个接口,具体由驱动厂商实现
所有数据库的操作都建立在Connection基础上
2.5. Connection对象

Connection对象用于JDBC与数据库的网络通信对象
java.sql.Connection是一个接口,具体由驱动厂商实现
所有数据库的操作都建立在Connection基础上

SQLSERVER连接字符串

  • 格式:jdbc:sqlserver://主机ip/数据库名?参数列表
  • 主机ip与端口是可选设置,默认值为127.0.0.1与1433
  • 参数列表采用url编码,格式:参数1=值1&参数2=值2&...
  • 3. 连接数据库的常见问题

ClassNotFoundException - 类未找到异常
Connection refuse - 数据库连接被拒绝异常
Access denied for user - 用户名与密码错误异常

4. 数据库查询操作

import java.sql.*;
public class JDBC {
    public static void main(String[] args) throws ClassNotFoundException, 
SQLException {
        String dbDriver = "com.microsoft.sqlserver.jdbc.SQLServerDriver"; //JDBC
驱动类
        String dbURL = "jdbc:sqlserver://194.0.11.27:1433;DatabaseName=test"; //
连接字符串
        String dbUsername = "sa"; //数据库用户名
        String dbPassword = "qzzg491166159"; //数据库密码
        //1.加载并初始化JDBC驱动
        Class.forName(dbDriver);
        //2.创建数据库连接
        Connection connection = DriverManager.getConnection(dbURL,
                dbUsername, dbPassword);
        //3. 创建Statement对象
        Statement stmt = connection.createStatement();
        //4. 执行SQL语句,得到查询结果集ResultSet
        ResultSet rs = stmt.executeQuery("SELECT * FROM users"); //执行SQL语句
    }
}

4.1. 遍历查询结果

import java.sql.*;
public class JDBC {
    public static void main(String[] args) throws ClassNotFoundException, 
SQLException {
        String dbDriver = "com.microsoft.sqlserver.jdbc.SQLServerDriver"; //JDBC
驱动类
        String dbURL = "jdbc:sqlserver://194.0.11.27:1433;DatabaseName=test"; //
连接字符串
        String dbUsername = "sa"; //数据库用户名
        String dbPassword = "qzzg491166159"; //数据库密码
        //1.加载并初始化JDBC驱动
        Class.forName(dbDriver);
        //2.创建数据库连接
        Connection connection = DriverManager.getConnection(dbURL,
                dbUsername, dbPassword);
        //3. 创建Statement对象
        Statement stmt = connection.createStatement();
        //4. 执行SQL语句,得到查询结果集ResultSet
        ResultSet rs = stmt.executeQuery("SELECT * FROM users"); //执行SQL语句
        //遍历查询结果,
        while(rs.next()){
            Integer id = rs.getInt(1);//得到每行第1列数据,id
            String user_name = rs.getString("user_name"); //得到每行员工姓名列
            String pass_word = rs.getString("pass_word"); //每行员工姓名
            System.out.println(id + "-" + user_name + "-" + pass_word);
        }
    }
}

4.2. Statement对象

Statement是用于执行SQL的工具
查询方法: ResultSet executeQuery(String sql)
注意: sql参数必须是SELECT 查询SQL语句

4.3. ResultSet对象

ResultSet结果集对象,保存查询结果
ResultSet采用迭代方式逐行获取每一行表数据
每一次迭代,使用ResultSet对象的getXXX()方法获取列数据

5. 释放数据库资源

 try {
            //创建Statement , 执行SQL语句 , 处理ResultSet得到结果
            rs.close();
            stmt.close();
        } catch (Exception e) {
            //y异常处理
            e.printStackTrace(); 
        } finally {
if (connection != null) { 
                //5. 释放数据库连接
                try {
                    connection.close();
                } catch (Exception ex) {
                }
            }
        }

6. JDBC中的事务管理

6.1. 什么是事务

  • 事务是以一种可靠的、一致的方式,访问和操作数据库的程序单元
  • 说人话:要么把事情做完,要么什么都不做,不要做一半
  • 事务依赖于数据库实现,MySQL通过事务区作为数据缓冲地带

6.2. JDBC两种事务模式

DBC允许两种事务模式
自动提交事务模式
手动提交事务模式
6.3. 自动提交事务模式

自动提交模式是指每执行一次写操作SQL,自动提交事务
自动提交开启方法: conn.setAutoCommit(true)
自动事务是JDBC默认行为,此模式无法保证多数据一致性
6.4. 手动提交事务模式

手动提交模式是指显式调用commit()与rollback()方法管理事务
手动提交开启方法: conn.setAutoCommit(false)
手动提交事务可保证多数据一致性,但必须手动调用提交/回滚方法
connection.commit()提交事务

  String dbDriver = "com.microsoft.sqlserver.jdbc.SQLServerDriver"; //JDBC
驱动类
        String dbURL = "jdbc:sqlserver://194.0.11.27:1433;DatabaseName=test"; //
连接字符串
        String dbUsername = "sa"; //数据库用户名
        String dbPassword = "qzzg491166159"; //数据库密码
        //1.加载并初始化JDBC驱动
 Class.forName(dbDriver);
        //2.创建数据库连接
        Connection connection = DriverManager.getConnection(dbURL,
                dbUsername, dbPassword);
        //手动提交开启方法
        connection.setAutoCommit(false);
        //3. 创建Statement对象
        Statement stmt = connection.createStatement();
        String sql = "insert into users(user_name,pass_word) values(?,?)";
        PreparedStatement pstmt = connection.prepareStatement(sql);
        pstmt.setString(1, "张三");
        pstmt.setString(2,"zshang123" );
        //executeUpdate方法返回记录数
        int cnt = pstmt.executeUpdate();
        //提交事务
        connection.commit();
        //事务回滚
        connection.rollback();

6.5. 事务回滚

如果事务中的某个点发生故障,则所有更新都可以回滚到事务开始之前的状态。
如果没有发生故障,则通过以完成状态提交事务来完成更新。
connection.rollback()事务回滚

7. Apache Commons DBUtils

commons-dbutils是 Apache提供的开源 JDBC工具类库
它是对JDBC的简单封装,学习成本极低
使用commons-dbutils可以极大简化JDBC编码工作量
7.1. 导入DBUtils依赖包

  dependencies {
    implementation 'com.microsoft.sqlserver:sqljdbc4:4.0'
    implementation 'net.sourceforge.jtds:jtds:1.3.1'
    implementation 'commons-dbutils:commons-dbutils:1.7'
}

7.2. 引入DbUtil公共类

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
class DbUtil {
    private static String url = "jdbc:jtds:sqlserver://localhost:1433/test";
    private static String username = "sa";
    private static String password = "qzzg491166159";
 public static Connection getConnection() {
        Connection conn = null;
        try {
            Class.forName("net.sourceforge.jtds.jdbc.Driver");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        try {
            conn = DriverManager.getConnection(url, username, password);
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return conn;
    }
}

7.3. 增刪改查示例

public class DBUtilsTest {
    public static void testQuery() {
        //创建连接
        Connection conn = DbUtil.getConnection();
        //创建SQL执行工具
        QueryRunner queryRunner = new QueryRunner();
        List list = null;
        try {
            //执行SQL查询,并获取结果
            list = queryRunner.query(conn, "select * from users", new 
BeanListHandler<>         (Users.class));
        } catch (SQLException e) {
            e.printStackTrace();
        }
        if (list != null) {
            //输出查询结果
            list.forEach(System.out::println);
        }
        //关闭数据库连接
        DbUtils.closeQuietly(conn);
    }
    public static void testUpdate() {
        //创建连接
        Connection conn = DbUtil.getConnection();
        //创建SQL执行工具
        QueryRunner queryRunner = new QueryRunner();
        int rows = 0;
        try {
            //执行SQL插入
            rows = queryRunner.update(conn, "update  users  set pass_word=? 
where               user_name=?", "24", "阡陌");
        } catch (SQLException e) {
            e.printStackTrace();
        }
        System.out.println("成功更新" + rows + "条数据!");
        //关闭数据库连接
        DbUtils.closeQuietly(conn);
}
    public static void testDelete() {
        //创建连接
        Connection conn = DbUtil.getConnection();
        //创建SQL执行工具
        QueryRunner queryRunner = new QueryRunner();
        int rows = 0;
        try {
            //执行SQL插入
            rows = queryRunner.update(conn, "delete  users where user_name=?", 
"阡陌");
        } catch (SQLException e) {
            e.printStackTrace();
        }
        System.out.println("成功刪除" + rows + "条数据!");
        //关闭数据库连接
        DbUtils.closeQuietly(conn);
    }
    public static void testInsert() {
        //创建连接
        Connection conn = DbUtil.getConnection();
        //创建SQL执行工具
        QueryRunner queryRunner = new QueryRunner();
        int rows = 0;
        try {
            //执行SQL插入
            rows = queryRunner.update(conn, "INSERT INTO users  (user_name, 
pass_word)          VALUES  (?, ?)", "阡陌", "24");
        } catch (SQLException e) {
            e.printStackTrace();
        }
        System.out.println("成功插入" + rows + "条数据!");
        //关闭数据库连接
        DbUtils.closeQuietly(conn);
    }
    public static void main(String[] args) {
        testInsert();
        testUpdate();
        testDelete();
        testQuery();
    }
}

你可能感兴趣的:(后端sql)