建立与数据库的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注入式攻击,这个我没看懂先不总结了。