1.JDBC快速入门:
2.Drivermanager
3.statement
4.resultset
2.JDBC连接数据库的五种方式
1.获取Driver 实现类
2.通过反射获取 Driver 实现类
3.DriverManager代替Driver
4. DriverManager的注册驱动简化
、
5 mysql的注册驱动简化
3.结果集(ResultSet)
String select = "select * from students";
//获取 resultSet 结果集
ResultSet resultSet = statement.executeQuery(select);
//查看数据
while (resultSet.next()) {
int id = resultSet.getInt(1);
String name = resultSet.getString(2);
System.out.println(id+"\t"+name); }
4. Statemen 和 SQL注入
- Statement对象 用于执行静态SQL语句并返回生成的结果的对象
- 在建立连接后,需要对数据库进行访问,执行 命名或是SQL语句 可以通过
- Statement
- PreparedStatement
- CallableStatement
- Statement对象在执行SQL语句时,存在SQL注入风险
- SQL注入
- 是利用某些系统没有对用户输入的数据进行充分的检查,而在输入数据中注入非法的SQL语句段或命令
5.预处理PreparedStatement
6.JDBC——API汇总
- DriverManager——驱动管理类
- getConnection(url,user,pwd) 获取连接
- Connection接口
- createStatement 创建statement对象
- createPreparedStatement(sql) 创建预处理对象
- Statement接口
- excuteUpdate(sql)执行dml语句,返回影响行数
- excuteQuery(sql)执行查询,返回Result对象
- excute(sql)执行任意sql,返回布尔值
- PreparedStatement接口
- excuteUpdate(sql)执行dml语句,返回影响行数
- excuteQuery(sql)执行查询,返回Result对象
- excute(sql)执行任意sql,返回布尔值
- 如果execute执行的是insert或update语句没有结果集,返回的是false,如果执行的是select语句有结果集,返回的就是true
- SetXxx(占位符索引,占位符的值),解决SQL注入
- SetObject(占位符索引,占位符的值0)
- Result 结果集
- next() 向下移动一行,没有则返回false
- previous()向上移动一行,没有则返回false
- getXxx(列的索引或者列名) 返回对应列的值,返回类型Xxx
- getObject(列的索引或者列名)返回对应列的值,返回类型Xxx
7.数据库连接池(jar包,配置文件,核心类,核心方法)
- 可以容纳一定数量的连接,当需要建立数据库连接时,只需从连接池中取出一个,使用完毕后在放回去
- 只需要匹配验证一次,提供一定数量(自己设置的)连接
- 数据库连接池负责 分配、管理和释放数据库连接
- 管理整个数据库连接过程
- 允许重复使用一个现有的数据库连接,不用在重新建立一个
- 获取一个连接,插入操作;更新操作!
- 当连接的请求数量超过连接池内的连接数量时,这些请求会被加入到等待队列
1.2 连接池种类介绍
- JDBC的数据库连接池使用 javax.sql.DateSource表示,DateSource只是个接口,该接口通常由第三方提供实现
- C3P0数据库连接池,速度相对较慢,稳定性很好
- DBCP数据库连接池,速度相对C3P0较快,但不稳定:JavaWeb
- Proxool数据库连接池,由监控连接池状态的功能,电脑稳定性叫C3P0差一点
- BonCP 数据库连接池,速度快
- Druid(德鲁伊)是阿里提供的连接池,集2,3,4优点于一身
1.2.1 C3P0
jar包如下:
导入时导入1,3,4
配置文件通过将数据库连接池的配置信息放在外部的配置文件中,而不是硬编码在代码中,实现了配置与代码的分离。这样,当需要修改数据库连接信息或调整连接池参数时,只需修改配置文件而无需修改代码,从而降低了代码与配置之间的耦合度。
核心类:
ComboPooledDataSource
- 作用:ComboPooledDataSource是C3P0连接池的核心类,它实现了DataSource接口,用于创建和管理数据库连接池。通过该类,可以配置数据库连接池的各种参数,如最大连接数、初始连接数、最大空闲时间等。
核心方法
ComboPooledDataSource类提供了多个核心方法,用于管理数据库连接池和获取数据库连接。以下是一些常用的方法:
- 构造函数
ComboPooledDataSource()
:无参构造函数,用于创建一个新的ComboPooledDataSource实例,并使用默认配置。ComboPooledDataSource(String configName)
:接受一个字符串参数configName
,用于指定配置文件中的配置名称。这将加载并使用与指定名称相匹配的配置信息来初始化ComboPooledDataSource实例。
- 设置数据库连接信息
- 虽然ComboPooledDataSource类本身没有直接提供设置数据库连接信息(如URL、用户名、密码等)的方法,但这些信息通常通过配置文件或编程方式(通过ComboPooledDataSource提供的setter方法)进行设置。在配置文件中,可以使用
<property>
标签来指定数据库连接信息。
- 虽然ComboPooledDataSource类本身没有直接提供设置数据库连接信息(如URL、用户名、密码等)的方法,但这些信息通常通过配置文件或编程方式(通过ComboPooledDataSource提供的setter方法)进行设置。在配置文件中,可以使用
- 连接池管理
setInitialPoolSize(int initialPoolSize)
:设置连接池初始化时创建的连接数。setMaxPoolSize(int maxPoolSize)
:设置连接池能够容纳的最大连接数。setMinPoolSize(int minPoolSize)
:设置连接池维持的最小空闲连接数(如果提供了这个参数)。setMaxIdleTime(int maxIdleTime)
:设置连接在连接池中保持空闲而不被逐出的最长时间(以秒为单位)。
- 获取数据库连接
Connection getConnection()
:从连接池中获取一个数据库连接。如果连接池中没有可用的连接,则根据配置创建新的连接(如果连接数未达到最大值)。
- 关闭连接池
- 通常,关闭连接池并不是通过ComboPooledDataSource类直接提供的方法完成的,而是通过确保没有活动的连接或调用数据源的
close()
方法(如果它支持)来间接完成的。然而,在C3P0中,更常见的是让应用程序管理数据库连接的生命周期,并在不再需要时关闭它们,而连接池本身则负责管理连接的重用和释放。
- 通常,关闭连接池并不是通过ComboPooledDataSource类直接提供的方法完成的,而是通过确保没有活动的连接或调用数据源的
通过配置文件建立连接
1.2.2德鲁伊连接池
jar包
核心类:
德鲁伊连接池的核心类是DruidDataSource
,它实现了javax.sql.DataSource
接口,用于创建和管理数据库连接
核心方法:
DruidDataSource
类提供了许多用于配置和管理数据库连接池的方法。以下是一些核心方法的概述:
- 初始化配置
- 构造函数:
DruidDataSource()
提供了一个无参构造函数,允许你在创建实例后通过setter方法配置连接池。需要工厂类获取链接池; - 通过配置文件初始化:虽然Druid不直接支持像C3P0那样的XML配置文件,但你可以通过编程方式读取配置文件(如properties文件),并使用这些配置来初始化
DruidDataSource
实例。
- 构造函数:
- 设置数据库连接信息
setUrl(String jdbcUrl)
:设置JDBC URL。setUsername(String username)
:设置数据库用户名。setPassword(String password)
:设置数据库密码。- 这些方法用于指定数据库连接的基本信息。
- 连接池管理
setInitialSize(int initialSize)
:设置连接池初始化时创建的连接数。setMaxActive(int maxActive)
:设置连接池能够容纳的最大活动连接数。setMinIdle(int minIdle)
:设置连接池中最小的空闲连接数。setMaxWait(long maxWait)
:设置获取连接时最大等待时间,单位毫秒。- 这些方法用于管理连接池的大小和性能。
- 连接监控和过滤
- Druid提供了强大的连接监控和过滤功能,但这不是通过
DruidDataSource
类直接暴露的方法。相反,你需要通过配置Druid的监控和过滤器来利用这些功能。
- Druid提供了强大的连接监控和过滤功能,但这不是通过
- 获取和关闭连接
Connection getConnection()
:从连接池中获取一个数据库连接。- 注意:关闭连接是通过
Connection
对象的close()
方法完成的,但通常你不需要(也不应该)显式关闭从连接池获取的连接,因为连接池会管理连接的打开和关闭。
- 关闭连接池
close()
:关闭连接池并释放所有资源。然而,在大多数应用程序中,你不需要显式调用此方法,因为应用程序的关闭过程(如JVM关闭)通常会触发资源清理。
步骤
- 导入配置文件(properties类型)
- 创建一个数据配置文件类
- 读取德鲁伊配置文件
- 调用德鲁伊的静态方法返回连接池
DruidDataSourceFactory.createDataSource(Properties properties)
5.连接池调用获取连接方法
6.执行sql语句
7.释放连接
翻来覆去就两句
properties.load(druidUtils.class.getClassLoader().getResourceAsStream("druid.properties")); 加载配置文件 工厂设计模式 dataSource= DruidDataSourceFactory.createDataSource(properties);
load方法可以从流中读取数据(键值对)
getClassLoader()
:Class
对象有一个getClassLoader()
方法,它返回该类的类加载器(ClassLoader
),获取类加载器是为了能够加载资源文件。
getResourceAsStream(String name)
方法,它尝试按照给定的资源名(在本例中是"druid.properties"
)来查找资源,并返回一个InputStream
对象
8 .Apache—DBUtils
传统使用ResultSet的缺点是一旦connection关闭,resultset结果集也就关闭;
改进方法
自定义一个类,所有属性对应表中的所有字段因为,ResultSet集每次读取也是一条数据,所以每个该类的对象就是一条数据,创建一个ArrayList集合,泛型为1.中的类这样就将ResultSet集,中的数据放到了集合中;
DbUtils 的核心类主要包括:
-
QueryRunner
:这是 DbUtils 中最重要的类之一,它简化了 SQL 查询的执行,包括执行更新(INSERT、UPDATE、DELETE)和查询(SELECT)操作。QueryRunner
提供了重载的query()
和update()
方法,用于执行不同类型的数据库操作。 -
ResultSetHandler
:这是一个接口,用于处理ResultSet
对象的结果。QueryRunner
的query()
方法需要一个ResultSetHandler
实现来告诉它如何处理 SQL 查询返回的ResultSet
。DbUtils 提供了一些ResultSetHandler
的实现,如BeanHandler
、BeanListHandler
、ScalarHandler
等,用于将ResultSet
转换为 Java 对象。 - RowProcessor
- 功能:RowProcessor用于处理行记录,将ResultSet的当前行转换为Java对象。
- 实现:DbUtils中的BasicRowProcessor是一个默认实现,用于将SQL行转换为Map或JavaBean。
核心方法
虽然 QueryRunner
类本身并不直接包含“核心方法”(因为它的方法是基于其用途和参数重载的),但以下是一些你经常会用到的 QueryRunner
方法:
-
query(Connection conn, String sql, ResultSetHandler<T> rsh, Object... params)
:执行一个查询,并返回一个对象,该对象是通过提供的ResultSetHandler
实现的handle(ResultSet rs)
方法从ResultSet
中提取的。这个方法允许你传递查询参数。 -
update(Connection conn, String sql, Object... params)
:执行一个更新(INSERT、UPDATE、DELETE)操作,并返回受影响的行数。这个方法也允许你传递更新语句的参数。 -
batch(Connection conn, String sql, BatchPreparedStatementSetter pss)
:执行一批更新操作。这个方法需要一个BatchPreparedStatementSetter
实现,该实现用于为每个更新操作设置参数。
Apache—DBUtils的查询操作注意事项
- domain类中,属性的名称与mysql中字段必须一模一样,不然出现乱码
- 数据库中的名字不能是关键字,不然可能导致获取为null
- get和set必须要有
- domain类中,必须要有无参构造器
Apache—DBUtils的不足
- SQl语句是固定的,不能通过参数传入,通用性不好,需要进行改进,更方便的执行增删改查
- 对于select操作,如果有返回值,返回类型是不确定的,需要使用泛型
- 对于业务需求复杂的情况,不方便实现
9. BasicDao类(解耦)
BasicDao类
13.1基本介绍
BasicDao简称DAO:date access object 数据访问对象
- 这样的通用类,称为 BasicDao ,是专门和数据库交互的,即完成对数据库(表)的 crud 操作
- 在 BaiscDao 的基础上,实现一张表对应一个 Dao,更好的完成功能,比如 Customer表 --- Customer.java类(javabean) --- CustomerDao.java
-
解耦: 通过将数据库操作逻辑从业务逻辑中分离,
BasicDao
有助于降低代码耦合。业务逻辑不需要关心具体的数据库实现细节,只需要通过BasicDao
提供的接口进行操作。 -
复用性: 提供通用的数据访问方法(如
save
,,update
delete
,`查找findById
等),可以在多个 DAO 实现类中复用,减少重复代码。 -
易于维护: 由于数据访问逻辑集中在
BasicDao
中,当数据库操作需要更改时,只需修改BasicDao
或其子类即可,而无需更改业务逻辑代码。 -
扩展性