关于JDBC使用的一些总结

  首先,先说一下jdbc是什么?jdbc是一套统一的接口规范,方便程序员连接数据库,进行数据库的CRUD。
  然后,我们怎们怎么使用JDBC呢?
  首先,你需要下载JDBC的jar包。以连接Mysql8.0数据库为例,你需要到Mysql的官网下载JDBC的jar包。在下载jar包的时候,要注意jar包的版本,要与你的本地安装的Mysql数据库版本一致,不然就会出错。然后把下载好的jar包导入你的工程,那么准备工作就完成了。
  这是我的数据库login表的数据截图:id是int类型字段,name是string类型字段
在这里插入图片描述
  下面以一个小demo为例,演示一下JDBC操作数据库,执行sql语句的过程。

public class JDBCdemo1 {
    public void test() throws ClassNotFoundException, SQLException {
        Class.forName("com.mysql.cj.jdbc.Driver");
        Connection conn= DriverManager.getConnection("jdbc:mysql://localhost:3306/test?" +
                        "useSSL=false&serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf-8",
                "sa","123456");
        Statement statement=conn.createStatement();
        ResultSet rs=statement.executeQuery("select * from login");
        while(rs.next()){
            System.out.println(rs.getObject(1).getClass());
            System.out.println(rs.getString(2));
        }
        conn.close();
        statement.close();
        rs.close();
    }

    public static void main(String[] args) throws SQLException, ClassNotFoundException {
        JDBCdemo1 j=new JDBCdemo1();
        j.test();
    }
}

  执行结果截图
在这里插入图片描述
  分析一下上面执行的步骤吧
  1、Class.forName()获取数据库驱动;
  2、Connection类建立数据库的连接;
  3、Statement类创建一个执行sql语句的对象。
  4、Resultset类存放Statement类执行sql语句获得的结果集。
  5、释放资源。
  总的来说,就是上面几步,但是在实际开发中,用以上的方法写的话,不停地进行获取驱动、建立连接、释放资源的操作,将会产生大量的冗余代码。所以我们需要封装一个工具类JDBCUtils,来方便我们日常的使用。
  除此之外,使用Statement类进行sql语句的执行,可能会出现sql注入的漏洞。因此我们在下面将使用它的子类PreparedStatement来执行sql语句。
  PreparedStatement是如何解决sql注入漏洞的呢?
  PreparedStatement类首先会预编译你的sql语句,如果你是动态的sql语句,会以占位符?来代替动态变量。然后使用set方法设置动态变量的值,即使你的动态变量中包含有sql关键字,PreparedStatement类也会把他当作是普通字符处理。
  JDBCUtils工具类代码

public class JDBCUtils{
    private static final String driverClassName;
    private static final String url;
    private static final String username;
    private static final String password;
    static {
        Properties properties=new Properties();
        try {
            properties.load(new FileInputStream("src/db.properties"));
        } catch (IOException e) {
            e.printStackTrace();
        }
        driverClassName=properties.getProperty("driverClassName");
        url=properties.getProperty("url");
        username=properties.getProperty("username");
        password=properties.getProperty("password");
    }
    public static void loadDriver(){
        try {
            Class.forName(driverClassName);
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }

    public static Connection getConnection(){
        Connection conn=null;
        loadDriver();
        try {
            conn=DriverManager.getConnection(url,username,password);
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }
        return conn;
    }

    public static void release(PreparedStatement prep,Connection conn) throws SQLException {
        prep.close();
        conn.close();
    }

    public static void release(ResultSet rs,PreparedStatement prep,Connection conn) throws SQLException {
        rs.close();
        prep.close();
        conn.close();
    }
}

  我们可以把数据存放在db.properties文件下,然后使用工具类读取它里面的值。

driverClassName=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/test?useSSL=false&serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=UTF-8
username=sa
password=123456

  主函数调用工具类

public class Run {
    Connection conn=null;
    PreparedStatement prep=null;
    ResultSet rs=null;

    void jdbcutils() throws SQLException {
        conn=JDBCUtils.getConnection();
        String sql="select * from login where id=?";
        prep=conn.prepareStatement(sql);
        prep.setString(1,"1");
        rs=prep.executeQuery();
        while (rs.next()){
            System.out.println(rs.getString("id"));
            System.out.println(rs.getString("name"));
        }
        JDBCUtils.release(rs,prep,conn);
    }

    public static void main(String[] args) {
        Run run=new Run();
        try {
            run.jdbcutils();
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }
    }
}

  执行结果截图
在这里插入图片描述
  PreparedStatement执行sql语句的方法:
  execute方法:返回一个boolean型,当执行sql语句得到的结果集不为空,则返回true,如果执行sql语句得到的结果集为空,则返回false。此方法可以执行任意sql语句。
  executeQuery方法:返回一个或者多个Resultset对象。此方法一般用于执行查询语句,执行其他语句会报错。
  executeUpdate方法:返回一个int型,反映数据库中受影响的行数。此方法一般用于执行插入语句、更新语句、删除语句,执行查询语句会报错。

猜你喜欢

转载自blog.csdn.net/hailongcsdn/article/details/106166221