java学习笔记 JDBC(一) 增删改查,预编译statement

建立与数据库的connection连接:

try {
    Class.forName("com.mysql.jdbc.Driver");
    Connection conn = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/how2java?               characterEncoding=UTF-8",
                         "root", "admin");
catch (ClassNotFoundException e) {
            // TODO Auto-generated catch block
     e.printStackTrace();
} catch (SQLException e) {
            // TODO Auto-generated catch block
     e.printStackTrace();
}

创建statement:

statement是用于执行sql语句的,比如增删改查。

Statement s = conn.createStatement();
  

增、删、改都是使用 s.execute来执行sql语句的。

关闭连接:

数据库连接的是有限资源,相关操作结束后,要养成关闭数据库的好习惯,这里可以自己写finally部分关闭,

先关闭statement

后关闭connection

.close()关闭即可。

自动关闭连接:

就像之前学习的io流部分,这里只需要把statement和connection的获取写入try()的括号里,那在执行完之后就会自动关闭数据库连接。

增删改查:

增删改查的sql语句要记得。

不同的地方是,增删改的statement执行语句都是execute。

而查询语句的执行语句是executeQuery,并且查询会有返回值,可以使用ResultSet结果集来获取查询的返回值

ResultSet rs = s.executeQuery(sql);
      while (rs.next()) {
            int id = rs.getInt("id");// 可以使用字段名
            String name = rs.getString(2);// 也可以使用字段的顺序
            float hp = rs.getFloat("hp");
            int damage = rs.getInt(4);
            System.out.printf("%d\t%s\t%f\t%d%n", id, name, hp, damage);

然后通过rs得到查询数据,要注意的地方是获取数据的get方法,是基1的,第一条就是getString(1)。

这也是java里面唯二 基1的地方。另外一个基1的地方是preparedStatement,下面会提到。

预编译statement:PreparedStatement

之前说到statement是用来执行sql语句的,但是在字符串拼接sql的时候是相当的麻烦,

那这里的preparedstatement也是执行sql语句的,与statement不同的地方在于创建的时候需要有sql语句作为参数;

除此之外,还可以通过设置参数,指定相应的值,避免了字符串拼接。

而且!!!它也是基1的。

String sql = "insert into hero values(null,?,?,?)";
        try (Connection c = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/how2java?characterEncoding=UTF-8","root", "admin");
            // 根据sql语句创建PreparedStatement
            PreparedStatement ps = c.prepareStatement(sql);
        ) {
             
            // 设置参数
            ps.setString(1, "提莫");
            ps.setFloat(2, 313.0f);
            ps.setInt(3, 50);
            // 执行
            ps.execute();
  
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

在看着舒服的同时,ps还拥有预编译机制,性能比statement更快

Statement执行10次,需要10次把SQL语句传输到数据库端

数据库要对每一次来的SQL语句进行编译处理

PreparedStatement 执行10次,只需要1次把SQL语句传输到数据库端

数据库对带?的SQL进行预编译

每次执行,只需要传输参数到数据库端

   1. 网络传输量比Statement更小

   2. 数据库不需要再进行编译,响应更快

是真的棒奥。

还有一个优点就是他可以防止sql注入式攻击,这个我没看懂先不总结了。

学习网址:https://how2j.cn/p/4019

发布了58 篇原创文章 · 获赞 20 · 访问量 5213

猜你喜欢

转载自blog.csdn.net/qq_41658124/article/details/103389088