核心api_JDBC_使用步骤总结
JDBC使用步骤总结
1. 注册驱动
Class.forName("com.mysql.cj.jdbc.Driver");
2. 获取链接
Connection connection =
DriverManager.getConnection(url,user,password);
3. 创建statement
//静态:
Statement statement = connection.createStatement();
//动态:
PreparedStatement preparedstatement = connection.preparedStatement();
//编写sql语句,其中动态值用 ? 代替
String sql = "";
4. 占位符赋值
//下标从1开始
preparedStatement.setObject(index,value);
5. 发送sql语句获取结果集
//非DDL语句
int i = preparedStatement.executeUpdate();
//DDL语句
ResultSet = preparedStatement.executeQuery();
6. 查询结果解析结果集
/*
resulset看成一个表格,里面有行有列,其中含有一个游标,初始指向第1行之前
可以通过next()方法遍历
getObject(columName):获取当前行此列名的对象
resulset 包含 MetaData对象
*/
//构建metaData对象
ResultSetMetaData metaData = resultSet.getMetaData();
//调用方法获取列数
int columnCount = metaData.getColumnCount();
ArrayList<Map> list = new ArrayList<>();
while (resultSet.next()){//遍历行
Map map = new HashMap();
for (int i = 1; i <= columnCount; i++) {//遍历列
Object value = resultSet.getObject(i);
//要用columLabel 不要用 columName,因为columName获取的是真名,无法获取别名
String columnLabel = metaData.getColumnLabel(i);
map.put(columnLabel,value);
}
list.add(map);
}
7. 关闭资源
.close();
其中的几个问题
1.jdbc的概念
Java 数据库连接(Java Database Connectivity,简称 JDBC)是一种用于在Java应用程序中连接和操作数据库的API(应用程序编程接口)。它允许Java应用程序与各种关系型数据库建立连接,并通过执行SQL语句来进行数据的增删改查操作。
2.为什么不使用DriverManager.registerDriver(new Driver());
加载驱动
此方法会注册两次驱动
1.DriverManger.registerDriver() 方法本身会注册一次
2.Driver.static{DriverManager.registerDriver()} 静态代码块也会注册一次
3.静态代码块触发的机制
在类加载之前会被触发:
1.加载: class文件-->jvm的class对象
2. 连接: 验证(语法错误,文件类型) --> 准备(静态变量默认值) --》 解析(触发静态代码块)
3. 初始化(静态属性赋真实值)
4.当sql语句含有动态值的时候,为什么不适合用statement
1.需要拼接字符串,比较麻烦
2.只能处理字符串类型
3.会发生注入攻击
例如:
String sql = "select * from t_user where account = '"+account+"' and password = '"+password+"';";//拼接账号密码
//此时输入密码为:' or '1' = '1 改变了sql语句的原有结构
5.为什么说preparedStatement 不会发生注入攻击?
因为生成preparedStatement的时候,先传输一遍sql语句的结构,无法通过动态值来混淆,改变sql语句的结构。
6.遍历结果集的方法
1.使用next()方法移动游标,while循环遍历行
2.每一行中遍历列(双重循环)
3.将每一列的数据以key = 列名,value = 数据的方式存入Map
4.创建一个List<Map>,将每行的Map保存
7.要用columLabel 不要用 columName
因为columName获取的是真名,无法获取别名