栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

JDBC简单小结

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

JDBC简单小结

一、JDBC 1.1概念
	JDBC(Java Database Connectivity) Java 连接数据库的规范(标准),可以使用 Java 语言连接数据库完成 CRUD 操作。
1.2 API
类型权限定名简介
classjava.sql.DriverManager管理多个数据库驱动类,提供了获取数据库连接的方法
interfacejava.sql.Connection代表一个数据库连接(当connection不是null时,表示已连接数据库)
interfacejava.sql.Statement发送SQL语句到数据库工具
interfacejava.sql.ResultSet保存SQL查询语句的结果数据(结果集)
classjava.sql.SQLException处理数据库应用程序时所发生的异常
1.3 环境搭建
    在项目下新建一个lib目录,在目录中导入相关的jar包,直接复制进目录(注意mysql版本,不同版本不同驱动)
    将mysql-connector-java-5.1.19 添加到项目库,右键 Add as Libraay,点击 OK。

二、开发步骤 2.1 注册驱动
//mysql 5.X 版本
Class.forName("com.mysql.jdbc.Driver");//加载驱动
2.2 获取连接对象

通过 DriverManager.getConnection(url,user,password) 获取数据库连接对象

URL:jdbc:mysql://localhost:3306/databaseusername:rootpassword:1234

Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/jdbc", "root", "123456");
2.3 获取发送 SQL 的对象

通过 Connection 对象获得 Statement 对象,用于对数据库进行通用访问。

Statement statement = connection.createStatement();
2.4 执行SQL 语句

执行 SQL 语句并接收执行结果。

String sql = "INSERT INTO `user`( `name`, `password`) VALUES ('ahao', '123456')";
        int i = statement.executeUpdate(sql);

注意:在编写 DML 语句时,一定要注意字符串参数的符号是单引号 ‘值’DML 语句:增删改时,返回受影响行数(int 类型)。DQL 语句:查询时,返回结果数据(ResultSet 结果集)。 2.5 处理结果

接受处理操作结果。

if(i == 1){
	System.out.println("受影响的行: "+i);
}

受影响行数:逻辑判断、方法返回。查询结果集:迭代、依次获取。 2.6 释放资源

遵循先开后关原则,释放所使用到的资源对象。

statement.close();
connection.close();
三、CRUD 案例

数据库表结构素材:

-- ----------------------------
-- Table structure for user
-- ----------------------------
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user`  (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `username` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
  `password` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
  `address` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 12 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;

SET FOREIGN_KEY_CHECKS = 1;

3.1 插入数据
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;

public class InsertDemo {
    public static void main(String[] args) throws ClassNotFoundException, SQLException {
        //1.加载驱动
        Class.forName("com.mysql.jdbc.Driver");
        //2.获取连接对象
        Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/jdbc?useUnicode=true&characterEncoding=utf-8", "root", "123456");
        //3.获取statement对象
        Statement statement = connection.createStatement();
        //4.执行sql
        String sql = "INSERT INTO `user`( `username`, `password`) VALUES ('ahao', '123456')";
        int i = statement.executeUpdate(sql);
        //5.处理结果
        if (i>0){
            System.out.println("受影响的行:"+i);
        }
        //6.关闭资源
        statement.close();
        connection.close();
    }
}
3.2 删除数据(根据id)
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;

public class DeleteDemo {
    public static void main(String[] args) throws ClassNotFoundException, SQLException {
        //1.加载驱动
        Class.forName("com.mysql.jdbc.Driver");
        //2.获取连接对象
        Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/jdbc?useUnicode=true&characterEncoding=utf-8", "root", "123456");
        //3.获取statement对象
        Statement statement = connection.createStatement();
        //4.执行sql  删除id为1 的数据
        String sql = "DELETE FROM USER WHERe id=1";
        int i = statement.executeUpdate(sql);
        //5.处理结果
        if (i>0){
            System.out.println("受影响的行:"+i);
        }
        //6.关闭资源
        statement.close();
        connection.close();
    }
}
3.3 更新数据(修改)
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;

public class UpdateDemo {
    public static void main(String[] args) throws ClassNotFoundException, SQLException {
        //1.加载驱动
        Class.forName("com.mysql.jdbc.Driver");
        //2.获取连接对象
        Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/jdbc?useUnicode=true&characterEncoding=utf-8", "root", "123456");
        //3.获取statement对象
        Statement statement = connection.createStatement();
        //4.执行sql  将id为2的用户名改为 法外狂徒
        String sql = "update user set username='法外狂徒' where id=2";
        int i = statement.executeUpdate(sql);
        //5.处理结果
        if (i>0){
            System.out.println("受影响的行:"+i);
        }
        //6.关闭资源
        statement.close();
        connection.close();
    }
}
3.4 查询
import java.sql.*;

public class SelectDemo {
    public static void main(String[] args) throws ClassNotFoundException, SQLException {
        //1.加载驱动
        Class.forName("com.mysql.jdbc.Driver");
        //2.获取连接对象
        Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/jdbc?useUnicode=true&characterEncoding=utf-8", "root", "123456");
        //3.获取statement对象
        Statement statement = connection.createStatement();
        //4.执行sql  查询user表中的所有数据
        String sql = "select * from user";
        ResultSet rs = statement.executeQuery(sql);
        //5.处理结果
        while (rs.next()){
            int id = rs.getInt("id");
            String username = rs.getString("username");
            String password = rs.getString("password");
            String address = rs.getString("address");
            System.out.println(id+"t"+username+"t"+password+"t"+address);
        }
        //6.关闭资源
        statement.close();
        connection.close();
    }
}
四、 SQL注入 4.1 什么是 SQL 注入

用户输入的数据中有 SQL 关键字或语法并且参与了 SQL 语句的编译,导致 SQL 语句编译后的条件含义为 true,一直得到正确的结果。这种现象称为 SQL 注入。

4.2 如何避免 SQL 注入

使 SQL 语句在用户输入数据前就已进行编译成完整的 SQL 语句,再进行填充数据。

五、prepareStatement 5.1 PreparedStatement的应用

预编译SQL 语句,效率高。安全,避免SQL注入 。可以动态的填充数据,执行多个同构的 SQL 语句。 5.1.1 参数标记

//1.预编译 SQL 语句
PreparedStatement  ps = connection.prepareStatement("insert into user (username,password,address) values (?,?,?)");

注意:JDBC中的所有参数都由 ?符号占位,这被称为参数标记。在执行SQL语句之前,必须为每个参数提供值。 5.1.2 动态参数绑定

ps.setXxx(下标,值) 参数下标从 1 开始,为指定参数下标绑定值

//1.预编译 SQL 语句
PreparedStatement  ps = connection.prepareStatement("insert into user (username,password,address) values (?,?,?)"); 
//2.为参数下标赋值
ps.setString(1, user.getUsername());
ps.setString(2, user.getPassword());
ps.setString(3, user.getAddress());
六、封装DBUtils工具类 6.1 重用
import java.sql.*;

public class DBUtils {

    static {//类加载,执行一次
        try {
            Class.forName("com.mysql.jdbc.Driver");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }

    //获取连接对象
    public static Connection getConnection(){
        Connection connection = null;
        try {
            connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/jdbc?useUnicode=true&characterEncoding=utf-8", "root", "123456");
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return connection;
    }

    //释放资源
    public static void close(ResultSet resultSet){
        if (resultSet!=null){
            try {
                resultSet.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }

    public static void close(PreparedStatement ps){
        if (ps!=null){
            try {
                ps.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }

    public static void close(Connection con){
        if (con!=null){
            try {
                con.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/785833.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号