1.JDBC
- 作用:作用就是通过JAVA操作数据库,本质是一套规范(接口)
- 解耦:JDBC规范(接口)(DB2,sqlserver,Oracle,mysql,maridb)
JDBC编写步骤
- 导包
- 注册驱动
- 建立连接
- 获取语句执行对象
- 获取ResultSet
- 解析结果
- 关闭资源
2.协议:什么情况会触发类加载
- new
- 使用静态方法
- 加载子类的时候父类被加载
类加载器的作用
将我们编写的class文件,加载到jvm内存中(永久代)
3.Connetion(连接)
- 创建Statement对象
- 管理事务(ACID)
- 原子性 A
- 一致性 C
- 隔离性 I
- 持久性 D
- 创建用户表,添加用户信息
Sql注入攻击
- 作用:利用特殊的sql格式来实现错误密码登录, 最终能够正确查询数据
-
JDBC的概念,JAVA操作关系型数据库的规范
-
主要包含API
- DriverManager
- Connection
- Statement
- ResultSet
-
增删改查
- 查: 和hello 一致
- 改: executeUpdate() : int
- 增:executeUpdate() : int
- 删: executeUpdate() : int
-
JDBC工具类
- 就是简化咱们获取链接以及关闭资源的代码
- 实现步骤:
- 配置文件
- 加载配置文件
- 获取链接方法
- 释放资源方法
-
整合代码到web工程
-
sql注入
- 实现方式就是拼接字符串在密码错误的情况下实现sql能够正常查询数据
SELECT * FROM user WHERE loginname= '' or 1 = 1 -- AND password='" + password + "'
prepareStatement
-
作用: 预编译SQL语句,以防止SQL注入问题
-
使用:
扫描二维码关注公众号,回复: 12015829 查看本文章-
创建:
PrepareStatement ps = connection.prepareStatement("select * from student where id = ?"); ps.setInt(1, 22);
-
执行
- 查询:ps.executeQuery()
- 修改:ps.executeUpdate()
-
事务管理
-
使用对象:Connection对象
-
事务方法:
- 开启事务:setAutoCommit(false)
- 如何提交:commit()
- 回滚:rollback()
-
账户,转账案列
C3P0连接池
步骤
1.导包(还有mysql的驱动包,)
2.配置信息c3p0-config.xml–>连接数据库的信息
参数:
initialPoolSize //初始连接数量 maxPoolSize //最大连接数量 checkTimeOut //等待时间 // 3.直接创建 new combopooledDataSource();
c3p0测试
直接创建CombopooledDataSource
public class C3P0Test1 {
public static void main(String[] args) throws Exception{
//1.创建c3p0的数据库连接池对象
DataSource dataSource = new ComboPooledDataSource();
//2.通过连接池对象获取数据库连接
Connection con = dataSource.getConnection();
//3.执行操作
String sql = "SELECT * FROM student";
PreparedStatement pst = con.prepareStatement(sql);
//4.执行sql语句,接收结果集
ResultSet rs = pst.executeQuery();
//5.处理结果集
while(rs.next()) {
System.out.println(rs.getInt("sid") + "\t" + rs.getString("name") + "\t" + rs.getInt("age") + "\t" + rs.getDate("birthday"));
}
//6.释放资源
rs.close();
pst.close();
con.close();
}
}
druid
步骤
1.导包
2.配置文件:druid.properties
initialSize
maxActive
maxWait
3.通过properties集合,加载配置文件–classloader()
-
获取配置文件的流对象
-
把流对象放在load()中
-
通过连接处工厂类
代码
public static void main(String[] args) throws Exception { InputStream inputStream = Demo2_Druid.class.getClassLoader().getResourceAsStream("druid.properties"); Properties properties = new Properties(); properties.load(inputStream); DataSource dataSource = DruidDataSourceFactory.createDataSource(properties); Connection connection = dataSource.getConnection(); String sql = "select * from student"; Statement statement = connection.createStatement(); ResultSet resultSet = statement.executeQuery(sql); while (resultSet.next()) { System.out.println(resultSet.getInt("sid") + "\t" + resultSet.getString("name") + "\t" + resultSet.getInt("age") + "\t" + resultSet.getDate("birthday")); } statement.close(); resultSet.close(); connection.close(); }
拓展:策略模式
代码:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
- 执行者
- 策略(接口)
- 调用者(调用策略传给执行者)实现类
BeanHandler实现类–>作用:把结果集转换为一个对象
DataBaseMetaData数据库源信息
//获取数据库产品名字
String getDatabaseProductName();
//获取数据库产品版本
int getDatabaseProductVersion();
//1.User--->Musql
preparedStatement.getMetaData()
//2.Mysql--->User
resultSet.getMetaData()
元数据的基本概述
什么是元注解?
给注解加注解的,称为元注解。
什么是元数据?
参数元数据:ParameterMetaData
目标
参数元数据的API和案例
获取ParameterMetaData
PreparedStatement接口中的方法 | 说明 |
---|---|
ParameterMetaData getParameterMetaData() | 通过预编译的语句获取参数元数据 |
接口中的方法
因为是接口,所以需要数据库厂商驱动的支持,mysql对参数元数据的支持不是太理想,但不影响今天的使用
ParameterMetaData接口中的方法 | 说明 |
---|---|
int getParameterCount() | 获取参数的个数 |
String getParameterTypeName(int param) | 获取某一列参数的数据类型,参数就是列号,从1开始 只能获取varchar类型的数据 |
参数元数据:ParameterMetaData
目标
参数元数据的API和案例
获取ParameterMetaData
PreparedStatement接口中的方法 | 说明 |
---|---|
ParameterMetaData getParameterMetaData() | 通过预编译的语句获取参数元数据 |
接口中的方法
因为是接口,所以需要数据库厂商驱动的支持,mysql对参数元数据的支持不是太理想,但不影响今天的使用
ParameterMetaData接口中的方法 | 说明 |
---|---|
int getParameterCount() | 获取参数的个数 |
String getParameterTypeName(int param) | 获取某一列参数的数据类型,参数就是列号,从1开始 只能获取varchar类型的数据 |