1、掌握JDBC的基本使用与工具类的封装
2、掌握Statement对象与Result对象的使用
3、掌握PreparedStatement对象的使用(重点学习,在JDBC中使用很频繁的一个对象)
ORM编程思想
package com.bzcxy.jdbc;
import java.io.IOException;
import java.lang.reflect.Field;
import java.sql.*;
import java.util.ArrayList;
import java.util.List;
/**
* ORM(Object Relational Mapping对象关系映射)编程思想
* --一个数据表对应一个Java类
* --表中的一条记录对应Java类的一个对象
* --表中的一列对应Java类的一个属性
*
* 针对User表通用查询设计
*/
public class PreparedStatement_test2 {
public static void main(String[] args) throws Exception {
String sql = "select * from user where id <?";
List<User> users = PreparedStatement_test2.UserQuery(sql, 7);
for (User u:users){
System.out.println(u);
}
}
public static List<User> UserQuery(String sql,Object...args) throws Exception{
List<User> users = new ArrayList<>();
//1.获取数据库连接
Connection conn = JDBC_utils.getConnection();
//2.预编译sql语句,返回PreparedStatement对象
PreparedStatement ps = conn.prepareStatement(sql);
//3.填充?
for (int i = 0;i<args.length;i++){
ps.setObject(i+1,args[i]);//小心参数声明错误
}
//4.执行
ResultSet rs = ps.executeQuery();
//5.获取结果集元数据
ResultSetMetaData metaData = rs.getMetaData();
//6.通过元数据获取结果集中的列数
int columnCount = metaData.getColumnCount();
//7.保存(数据库每条记录)至(List<User>)中
while(rs.next()){
//创建User对象,用于保存每行记录
User user = new User();
//处理结果集中的列,将每列的值保存到user对象中对应的属性中
for (int i=0;i<columnCount;i++){
//获取该列的值
Object columnValue = rs.getObject(i + 1);
//获取该列的列名
String columnName = metaData.getColumnName(i + 1);
//通过反射将User的ColumnName赋值为ColumnValue
//获取该字段相关属性
Field field = user.getClass().getDeclaredField(columnName);
//提升权限
field.setAccessible(true);
//赋值
field.set(user,columnValue);
}
//将赋值后的user添加进List
users.add(user);
}
return users;
}
}
SQL注入攻击
- 是什么:SQL注入是指利用某些系统没有对用户输入的数据进行充分的检查,而在用户输入的数据中注入了非法SQL语句段或者命令,从而利用SQL引擎完成恶意行为的做法
- 根本原因:(Statement)用户提供的信息包含SQL关键字,并且这些关键字参与SQL编译过程
- 解决方法:(通过PreparedStarement预编译),将用户提供的信息作为一个整体的字符串参数设置到SQL中,那么即使含有SQL关键字,仍然不起作用
- 典型场景:Web系统用户登录功能,根据用户输入的用户名和密码,我们需要去后端数据库核实信息
4、掌握JDBC的事务处理、项目的应用程序分层与基类的封装