JDBC API详解

JDBC API详解

Diver Manager

先添加对应版本的mysql驱动jar包到lib文件夹
再右键 Add as Library

注册驱动

在myusql5驱动后的jar包 可以省略以下语句
Class.forName("com.mysql.jdbc.Driver");
或高版本用
Class.forName("com.mysql.cj.jdbc.Driver");
要在主方法抛出异常

取数据库连接

String url = "jdbc:mysql://127.0.0.1:3306/db1"
端口号/数据库名
Tips:
如果连接的是本机Mysql服务器,并且Mysql服务默
认端口是3306,则Url可以简写为:Jdbc:Mysql:///数
据库名称?参数键值对
配置 Usessl=False 参数,禁用安全连接方式,解决
警告提示
String username = "root"
数据库用户名
String password = "1234"
数据库用户名
Connection conn = DriverManager.getConnection(url, username, password);
获取数据库连接


Connection

获取执行SQL的对象

  1. 普通执行SQL对象
    Statement createStatment()
  2. 预编译SQL的执行SQL对象:防止SQL注入
    PreparedStetement prepareStatement(sql)
  3. 执行存储过程的对象
    CallableStatement prepareCall(sql)不常用

事务管理

eg:两条语句需一起成功 如一条捕捉到异常 则回滚事务
事务管理的操作:
开启事务 : BEGIN; 或者 START TRANSACTION;
提交事务 : COMMIT;
回滚事务 : ROLLBACK
Mysql默认自动提交事务

try{
//开启事务
conn.setAutoCommit(false);
执行SQL1;
执行SQL2;
//提交事务
//程序运行到此处,说明没有出现任何问题,则需求提交事务,数据库数据改变
conn.commit();
}catch (Exception e) {
//回滚事务
//程序如果捕捉到异常时会执行到这个地方,此时就需要回滚事务,数据库数据不改变
conn.rollback();
//打印异常
e.printStackTrace();
}


Statement

作用:执行SQL语句

int executeUpdate(sql);执行DML,DDL语句
eg:
Statement stmt = conn.createStatement();获取sql的对象 statement
int count = stmt.executeUpdate(sql);返回行数
返回值:(1)DML语句影响的行数(2)DDL语句执行成功也可能返回0
Result executeQuery(sql);执行DDL语句
返回值:ResultSet结果集对象



ResultSet(结果集对象)

作用

  1. 封装了DQL查询语句的结果
    ResultSet executeQuery(sql):
    执行DQL 语句,返回ResultSet 对象
  2. 获取查询结果
  • boolean next()
    将光标从当前位置向前移动一行
    判断当前行是否为有效行
  • 方法返回值说明:
    true : 有效航,当前行有数据
    false : 无效行,当前行没有数据
  • xxx getXxx(参数):获取数据
    xxx : 数据类型;如: int getInt(参数) ;String getString(参数)
  • 参数:
    int类型的参数:列的编号,从1开始
    String类型的参数: 列的名称

使用步骤

  1. 游标向下移动一行,并且判断该行是否有数据:next()
  2. 获取数据:getXxx(参数)
while(rs.next()){
//判断当前行是否有数据,有则get参数,无则跳出循环
rs.getXxx(参数)
}

eg:

int id = rs.getInt(1);//第一列
String name = rs.getString(2);//第二列
double money = rs.getDouble(3);//第三列
///列的数据类型要对应

int id = rs.getInt("id");//第一列
String name = rs.getString("name");//第二列
double money = rs.getDouble("money");//第三列
//也可使用列的名称

rs.close;
stmt.close;
conn.close;
//依次释放资源

ResultSet案例

(将数据封装为Account对象中,并且存储到ArrayList集合中)

过程

  1. 定义Account实体类
    (需要查询的id,name,money)(setter getter toString方法)
public class Account {
    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Double getMoney() {
        return money;
    }

    public void setMoney(Double money) {
        this.money = money;
    }

    private Integer id;
    private String name;
    private Double money;

    @Override
    public String toString() {
        return "Account{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", money=" + money +
                '}';
    }
}
  1. 查询数据 封装到Account对象中
List <Sccount> list = new Account<>();///第三点
while(rs.next()){
	//new Account对象
	Account account = new Account();
	//获取数据
	int id = rs.getInt("id");//第一列
	String name = rs.getString("name");//第二列
	double money = rs.getDouble("money");//第三列
	//赋值
	account.setId(id);
	account.setName(name);
	account.setMoney(money);
	
	//存入集合
	list.add(account);//第三点
}
  1. 将Account存入到集合中
///List<实体类名>
List <Account> list = new ArrayList<>();//这条放在第二点前面
//存入集合
list.add(account);


PreparedStatement

作用:预编译SQL语句并执行,防止SQL注入问题
SQL注入:SQL注入是通过操作输入来修改事先定义好的SQL语句,用以达到执行代码对服务器进行攻击的方法。如密码: ' or '1' ='1

怎么用:

  1. 获取PreparedStatement对象
// SQL语句中的参数值,使用?占位符替代
String sql = "select * from user where username = ? and password = ?";
// 通过Connection对象获取,并传入对应的sql语句
PreparedStatement pstmt = conn.prepareStatement(sql);
  1. 设置参数值(?的值)

PreparedStatement对象:setXxx(参数1,参数2):给 ? 赋值

  • Xxx:数据类型 ; 如 setInt (参数1,参数2)

  • 参数:

    • 参数1: ?的位置编号,从1 开始

    • 参数2: ?的值

eg:

        pstm.setString(1,name);
        pstm.setString(2,pwd);
  1. 执行SQL语句

executeUpdate(); 执行DDL语句和DML语句

executeQuery(); 执行DQL语句

注意:

  • 调用这两个方法时不需要传递SQL语句,因为获取SQL语句执行对象时已经对SQL语句进行预编译了。
    ResultSet rs = pstm.executeQuery();
posted @ 2022-07-08 12:01  Crazy_chicken  阅读(67)  评论(0)    收藏  举报