JDBC学习笔记(三)

PreparedStatement
一个预编译的 SQL 语句,是 Statement 接口的子接口,继承于父接口中所有的方法。

Connection 创建 PreparedStatement 对象
PreparedStatement prepareStatement(String sql)
创建一个语句对象

接口中的方法
int executeUpdate()
执行 DML,增删改的操作,返回影响的行数
ResultSet executeQuery()
执行 DQL,查询的操作,返回结果集

使用步骤
1)编写 SQL 语句,未知内容使用?占位:“SELECT * FROM user WHERE name=? AND password=?”;
2) 获得 PreparedStatement 对象
3) 设置实际参数:setXxx(占位符的位置, 真实的值)
4) 执行参数化 SQL 语句
5) 关闭资源

package com.lqg;
import com.itheima.utils.JdbcUtils;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Scanner;
/**
* 使用 PreparedStatement
*/
public class Demo8Login {
    //从控制台上输入的用户名和密码
    public static void main(String[] args) throws SQLException {
    Scanner sc = new Scanner(System.in);
    System.out.println("请输入用户名");
    String name = sc.nextLine();
    System.out.println("请输入密码:");
    String password = sc.nextLine();
    login(name, password);
}
/**
* 登录的方法
* @param name
16 / 21
* @param password
*/
private static void login(String name, String password) throws SQLException {
    Connection connection = JdbcUtils.getConnection();
    //写成登录 SQL 语句,没有单引号
    String sql = "select * from user where name=? and password=?";
    //得到语句对象
    PreparedStatement ps = connection.prepareStatement(sql);
    //设置参数
    ps.setString(1, name);
    ps.setString(2,password);
    ResultSet resultSet = ps.executeQuery();
    if (resultSet.next()) {
    System.out.println("登录成功:" + name);
    }
    else {
    System.out.println("登录失败");
    }
    //释放资源,子接口直接给父接口
    JdbcUtils.close(connection,ps,resultSet);
    } 
}

使用 PreparedStatement 查询一条数据,封装成一个学生 Student 对象

package com.lqg;
import com.lqg.entity.Student;
import com.lqg.utils.JdbcUtils;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class Demo9Student {
public static void main(String[] args) throws SQLException {
    //创建学生对象
    Student student = new Student();
    17 / 21
    Connection connection = JdbcUtils.getConnection();
    PreparedStatement ps = connection.prepareStatement("select * from student where              id=?");
    //设置参数
    ps.setInt(1,2);
    ResultSet resultSet = ps.executeQuery();
    if (resultSet.next()) {
    //封装成一个学生对象
    student.setId(resultSet.getInt("id"));
    student.setName(resultSet.getString("name"));
    student.setGender(resultSet.getBoolean("gender"));
    student.setBirthday(resultSet.getDate("birthday"));
    }
    //释放资源
    JdbcUtils.close(connection,ps,resultSet);
    //可以数据
    System.out.println(student);
    } 
}

将多条记录封装成集合 List,集合中每个元素是一个 JavaBean 实体类

package com.lqg;
import com.lqg.entity.Student;
import com.lqg.utils.JdbcUtils;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
public class Demo10List {
public static void main(String[] args) throws SQLException {
    //创建一个集合
    List<Student> students = new ArrayList<>();
    Connection connection = JdbcUtils.getConnection();
    PreparedStatement ps = connection.prepareStatement("select * from student");
    //没有参数替换
    ResultSet resultSet = ps.executeQuery();
    while(resultSet.next()) {
    //每次循环是一个学生对象
    Student student = new Student();
    //封装成一个学生对象
    student.setId(resultSet.getInt("id"));
    18 / 21
    student.setName(resultSet.getString("name"));
        student.setGender(resultSet.getBoolean("gender"));
    student.setBirthday(resultSet.getDate("birthday"));
    //把数据放到集合中
    students.add(student);
    }
    //关闭连接
    JdbcUtils.close(connection,ps,resultSet);
    //使用数据
    for (Student stu: students) {
    System.out.println(stu);
        } 
    }
 }

执行 DML 操作

package com.lqg;
import com.lqg.utils.JdbcUtils;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
public class Demo11DML {
public static void main(String[] args) throws SQLException {
    //insert();
    //update();
    delete();
    }
    //插入记录
    private static void insert() throws SQLException {
    Connection connection = JdbcUtils.getConnection();
    PreparedStatement ps = connection.prepareStatement("insert into student
    values(null,?,?,?)");
    ps.setString(1,"小白龙");
    ps.setBoolean(2, true);
    ps.setDate(3,java.sql.Date.valueOf("1999-11-11"));
    int row = ps.executeUpdate();
    System.out.println("插入了" + row + "条记录");
    JdbcUtils.close(connection,ps);
    }
    //更新记录: 换名字和生日
    private static void update() throws SQLException {
    Connection connection = JdbcUtils.getConnection();
    PreparedStatement ps = connection.prepareStatement("update student set name=?,         birthday=?
    where id=?");
    ps.setString(1,"黑熊怪");
    ps.setDate(2,java.sql.Date.valueOf("1999-03-23"));
    ps.setInt(3,5);
    int row = ps.executeUpdate();
    System.out.println("更新" + row + "条记录");
    JdbcUtils.close(connection,ps);
    }
    19 / 21
    //删除记录: 删除第 5 条记录
    private static void delete() throws SQLException {
    Connection connection = JdbcUtils.getConnection();
    PreparedStatement ps = connection.prepareStatement("delete from student where id=?");
    ps.setInt(1,5);
    int row = ps.executeUpdate();
    System.out.println("删除了" + row + "条记录");
    JdbcUtils.close(connection,ps);
    } 
}

JDBC的事务处理
准备数据

CREATE TABLE account (
id INT PRIMARY KEY AUTO_INCREMENT,
NAME VARCHAR(10),
balance DOUBLE
);
-- 添加数据
INSERT INTO account (NAME, balance) VALUES ('Jack', 1000), ('Rose', 1000);

API
void setAutoCommit(boolean autoCommit)
参数是 true 或 false
如果设置为 false,表示关闭自动提交,相当于开启事务
void commit()
提交事务
void rollback()
回滚事务

步骤
1)获取连接
2) 开启事务
3) 获取到 PreparedStatement
4) 使用 PreparedStatement 执行两次更新操作
5) 正常情况下提交事务
6) 出现异常回滚事务
7) 最后关闭资源

package com.lqg;
import com.lqg.utils.JdbcUtils;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
public class Demo12Transaction {
    //没有异常,提交事务,出现异常回滚事务
    public static void main(String[] args) {
    20 / 21
    //1) 注册驱动
    Connection connection = null;
    PreparedStatement ps = null;
    try {
    //2) 获取连接
    connection = JdbcUtils.getConnection();
    //3) 开启事务
    connection.setAutoCommit(false);
    //4) 获取到 PreparedStatement
    //从 jack 扣钱
    ps = connection.prepareStatement("update account set balance = balance - ? where
    name=?");
    ps.setInt(1, 500);
    ps.setString(2,"Jack");
    ps.executeUpdate();
    //出现异常
    System.out.println(100 / 0);
    //给 rose 加钱
    ps = connection.prepareStatement("update account set balance = balance + ? where
    name=?");
    ps.setInt(1, 500);
    ps.setString(2,"Rose");
    ps.executeUpdate();
    //提交事务
    connection.commit();
    System.out.println("转账成功");
    } catch (Exception e) {
    e.printStackTrace();
    try {
    //事务的回滚
    connection.rollback();
    } catch (SQLException e1) {
    e1.printStackTrace();
    }
    System.out.println("转账失败");
    }
    finally {
    //7) 关闭资源
    JdbcUtils.close(connection,ps);
        } 
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值