jdbc java database connectivity java数据库连接
Class.forName(“com.mysql.jdbc.Driver”)
DriverManager 获取 Connection 在获取Statement 执行者对象(普通crateStatement() 预编译执行者对象 prepareStatement(sql))
Connection 接口有以下功能
jdbc事物管理
开启事务setAutoCommit(boolean) false 代表开启事务
提交事物commit()
回滚事物 rollback()
close() 关闭资源
Statement 执行sql语句(有sql注入的风险)
DML: int executeUpdate(String sql)(sql 参数:insert\update\delete)
DQL: 查询语句 ResultSet executeQuery(String sql)
ResultSet 封装查询的结果
ResultSet 结果集对象
判断结果集是否还有数据 Boolean next()
获取结果集中的数据
xxx getXxx(“列名”)
dao层 约束实现类的接口
service层 业务处理层(事物处理控制在该层)
controller 层 控制层
domain 层存放实体对象
jdbc 工具类
1、创建配置文件 config.properties 写好 driverClass=com.mysql.jdbc.driver 等
2、创建JDBCUtils类
a:私有构造方法
B: 声明所需要的的配置变量
c: 提供静态代码块读取配置文件的信息为变量赋值、注册驱动
(获取 InputStream 流 、new Propertis()读取配置文件信息、注册驱动)
d: 提供数据库连接方法
e :释放资源的方法
SQL 注入攻击
原理
按照正常道理来说我们在输入密码处输入的所有内容都应该认为是密码的组成部分
但是现在Statement对象在执行语句时,将密码的一部分内容当做查询条件来执行了
例子:
username: aaa password: aaa or ‘1=1’
PreparedStatement 预编译执行者对象(防sql注入)
在执行sql语句之前将sql语句提前编译,明确sql语句的格式,
剩余的内用都会认为是参数而不会作为执行条件了
String sql=“select * from student where name=? and password=?” ;
//?位置从1开始 这里name 占位符为1号 password占位符为2号
PreparedStatement pstm=connection.prepareStatement(sql)
pstm.setString=(1,“zhangsan”)
pstm.setString=(2,“z123456”)
ResultSet rs=pstm.executeQuery();