基本的增删改查
jdbc中,对于增删改来说,都可以用下面这个代码,修改sql即可
public static void main(String[] args) {
Connection c = null;
Statement s = null;
try{
Class.forName("com.mysql.jdbc.Driver");
//System.out.println("加载数据库驱动成功");
c = DriverManager
.getConnection(
"jdbc:mysql://127.0.0.1:3306/test?characterEncoding=UTF-8",
"root", "123456");
s = c.createStatement();
String sql = "insert into hero values(null,"+"'提莫'"+","+313.0f+","+50+")";
s.execute(sql);
//System.out.println("连接成功,获取statement对象: " + s);
}catch (Exception e){
e.printStackTrace();
}finally {
//先关闭statement,再关闭connection
if (s!=null){
try{
s.close();
}catch (SQLException e){
e.printStackTrace();
}
}
if (c!=null){
try{
c.close();
}catch (SQLException e){
e.printStackTrace();
}
}
}
}
对于需要查询的情况来说,查询完毕后会返回resultset保存查询结果,读取数据需要再操作resultset。
Statement s = c.createStatement();) {
String sql = "select * from address";
//
ResultSet rs = s.executeQuery(sql);
while (rs.next()){
//do something
}
statement和PreparedStatement
PreparedStatement的sql语句要用?把待加入字段补全,例如
“insert into hero values(null,?,?,?)”
PreparedStatement优势:
1.不需要进行字符串拼接而是进行参数设置
2.性能有优势,statement执行十条插入要传输十条sql语句,而PreparedStatement只传输参数即可。
3.可防止SQL注入攻击
简要代码如下
try {
Class.forName("com.mysql.jdbc.Driver");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
String sql = "insert into hero values(null,?,?,?)";
try (Connection c = DriverManager.getConnection
("jdbc:mysql://127.0.0.1:3306/text?characterEncoding=UTF-8",
"root", "123456");
PreparedStatement ps = c.prepareStatement(sql);){
ps.setString(1, "ali");
ps.setFloat(2, 313.0f);
ps.setInt(3, 50);
// 执行
ps.execute();
}catch (Exception e){
e.printStackTrace();
}
execute与executeUpdate
这两个的相同点:都可以增删改
不同:execute可以执行查询语句,executeUpdate不能执行查询语句;
execute返回boolean类型,true表示执行的是查询语句,
false表示执行的是insert,delete,update等等
executeUpdate返回的是int,表示有多少条数据受到了影响
事务:
在s.execute的时候,实际上这是自动提交的,没有设置手动提交。
而在有些情况下,有需求让多个操作处于要么都成功,要么都失败的情况,在这时候,就需要用到事务。
首先,设置自动提交关闭 c.setAutoCommit(false);
然后在完成多个操作之后,手动提交 c.commit();
这样在这其中的多个操作要不全部成功,要不全部失败
c.setAutoCommit(false);
// 加血的SQL
String sql1 = "update hero set hp = hp +1 where id = 22";
s.execute(sql1);
// 减血的SQL
// 不小心写错写成了 updata(而非update)
String sql2 = "updata hero set hp = hp -1 where id = 22";
s.execute(sql2);
// 手动提交
c.commit();