jdbc学习笔记

基本的增删改查

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();
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值