欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 教育 > 培训 > Java学习Day30:Mysql 第三章:玄阶高级斗技:八极崩!

Java学习Day30:Mysql 第三章:玄阶高级斗技:八极崩!

2024/10/24 13:22:12 来源:https://blog.csdn.net/weixin_51721783/article/details/141326618  浏览:    关键词:Java学习Day30:Mysql 第三章:玄阶高级斗技:八极崩!

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注入

  1. Statement对象 用于执行静态SQL语句并返回生成的结果的对象
  2. 在建立连接后,需要对数据库进行访问,执行 命名或是SQL语句 可以通过
    1. Statement
    2. PreparedStatement
    3. CallableStatement
  3. Statement对象在执行SQL语句时,存在SQL注入风险
  4. SQL注入
    1. 是利用某些系统没有对用户输入的数据进行充分的检查,而在输入数据中注入非法的SQL语句段或命令

5.预处理PreparedStatement

6.JDBC——API汇总

  1. DriverManager——驱动管理类
    1. getConnection(url,user,pwd) 获取连接
  2. Connection接口
    1. createStatement 创建statement对象
    2. createPreparedStatement(sql) 创建预处理对象
  3. Statement接口
    1. excuteUpdate(sql)执行dml语句,返回影响行数
    2. excuteQuery(sql)执行查询,返回Result对象
    3. excute(sql)执行任意sql,返回布尔值
  4. PreparedStatement接口
    1. excuteUpdate(sql)执行dml语句,返回影响行数
    2. excuteQuery(sql)执行查询,返回Result对象
    3. excute(sql)执行任意sql,返回布尔值
      1.    如果execute执行的是insert或update语句没有结果集,返回的是false,如果执行的是select语句有结果集,返回的就是true
    4. SetXxx(占位符索引,占位符的值),解决SQL注入
    5. SetObject(占位符索引,占位符的值0)
  5. Result 结果集
    1. next() 向下移动一行,没有则返回false
    2. previous()向上移动一行,没有则返回false
    3. getXxx(列的索引或者列名) 返回对应列的值,返回类型Xxx
    4. getObject(列的索引或者列名)返回对应列的值,返回类型Xxx

7.数据库连接池(jar包,配置文件,核心类,核心方法)

  1. 可以容纳一定数量的连接,当需要建立数据库连接时,只需从连接池中取出一个,使用完毕后在放回去
    1. 只需要匹配验证一次,提供一定数量(自己设置的)连接
  2. 数据库连接池负责 分配、管理和释放数据库连接
    1. 管理整个数据库连接过程
  3. 允许重复使用一个现有的数据库连接,不用在重新建立一个
    1. 获取一个连接,插入操作;更新操作!
  4. 当连接的请求数量超过连接池内的连接数量时,这些请求会被加入到等待队列

1.2 连接池种类介绍

  • JDBC的数据库连接池使用 javax.sql.DateSource表示,DateSource只是个接口,该接口通常由第三方提供实现
  1. C3P0数据库连接池,速度相对较慢,稳定性很好
  2. DBCP数据库连接池,速度相对C3P0较快,但不稳定:JavaWeb
  3. Proxool数据库连接池,由监控连接池状态的功能,电脑稳定性叫C3P0差一点
  4. BonCP 数据库连接池,速度快
  5. Druid(德鲁伊)是阿里提供的连接池,集2,3,4优点于一身

1.2.1 C3P0

jar包如下:

导入时导入1,3,4

配置文件通过将数据库连接池的配置信息放在外部的配置文件中,而不是硬编码在代码中,实现了配置与代码的分离。这样,当需要修改数据库连接信息或调整连接池参数时,只需修改配置文件而无需修改代码,从而降低了代码与配置之间的耦合度

核心类:

ComboPooledDataSource

  • 作用:ComboPooledDataSource是C3P0连接池的核心类,它实现了DataSource接口,用于创建和管理数据库连接池。通过该类,可以配置数据库连接池的各种参数,如最大连接数、初始连接数、最大空闲时间等。

核心方法

ComboPooledDataSource类提供了多个核心方法,用于管理数据库连接池和获取数据库连接。以下是一些常用的方法:

  1. 构造函数
    • ComboPooledDataSource():无参构造函数,用于创建一个新的ComboPooledDataSource实例,并使用默认配置。
    • ComboPooledDataSource(String configName):接受一个字符串参数configName,用于指定配置文件中的配置名称。这将加载并使用与指定名称相匹配的配置信息来初始化ComboPooledDataSource实例。
  2. 设置数据库连接信息
    • 虽然ComboPooledDataSource类本身没有直接提供设置数据库连接信息(如URL、用户名、密码等)的方法,但这些信息通常通过配置文件或编程方式(通过ComboPooledDataSource提供的setter方法)进行设置。在配置文件中,可以使用<property>标签来指定数据库连接信息。
  3. 连接池管理
    • setInitialPoolSize(int initialPoolSize):设置连接池初始化时创建的连接数。
    • setMaxPoolSize(int maxPoolSize):设置连接池能够容纳的最大连接数。
    • setMinPoolSize(int minPoolSize):设置连接池维持的最小空闲连接数(如果提供了这个参数)。
    • setMaxIdleTime(int maxIdleTime):设置连接在连接池中保持空闲而不被逐出的最长时间(以秒为单位)。
  4. 获取数据库连接
    • Connection getConnection():从连接池中获取一个数据库连接。如果连接池中没有可用的连接,则根据配置创建新的连接(如果连接数未达到最大值)。
  5. 关闭连接池
    • 通常,关闭连接池并不是通过ComboPooledDataSource类直接提供的方法完成的,而是通过确保没有活动的连接或调用数据源的close()方法(如果它支持)来间接完成的。然而,在C3P0中,更常见的是让应用程序管理数据库连接的生命周期,并在不再需要时关闭它们,而连接池本身则负责管理连接的重用和释放。

通过配置文件建立连接

1.2.2德鲁伊连接池

jar包

核心类:

德鲁伊连接池的核心类是DruidDataSource,它实现了javax.sql.DataSource接口,用于创建和管理数据库连接

核心方法:

DruidDataSource类提供了许多用于配置和管理数据库连接池的方法。以下是一些核心方法的概述:

  1. 初始化配置
    • 构造函数:DruidDataSource() 提供了一个无参构造函数,允许你在创建实例后通过setter方法配置连接池。需要工厂类获取链接池;
    • 通过配置文件初始化:虽然Druid不直接支持像C3P0那样的XML配置文件,但你可以通过编程方式读取配置文件(如properties文件),并使用这些配置来初始化DruidDataSource实例。
  2. 设置数据库连接信息
    • setUrl(String jdbcUrl):设置JDBC URL。
    • setUsername(String username):设置数据库用户名。
    • setPassword(String password):设置数据库密码。
    • 这些方法用于指定数据库连接的基本信息。
  3. 连接池管理
    • setInitialSize(int initialSize):设置连接池初始化时创建的连接数。
    • setMaxActive(int maxActive):设置连接池能够容纳的最大活动连接数。
    • setMinIdle(int minIdle):设置连接池中最小的空闲连接数。
    • setMaxWait(long maxWait):设置获取连接时最大等待时间,单位毫秒。
    • 这些方法用于管理连接池的大小和性能。
  4. 连接监控和过滤
    • Druid提供了强大的连接监控和过滤功能,但这不是通过DruidDataSource类直接暴露的方法。相反,你需要通过配置Druid的监控和过滤器来利用这些功能。
  5. 获取和关闭连接
    • Connection getConnection():从连接池中获取一个数据库连接。
    • 注意:关闭连接是通过Connection对象的close()方法完成的,但通常你不需要(也不应该)显式关闭从连接池获取的连接,因为连接池会管理连接的打开和关闭。
  6. 关闭连接池
    • close():关闭连接池并释放所有资源。然而,在大多数应用程序中,你不需要显式调用此方法,因为应用程序的关闭过程(如JVM关闭)通常会触发资源清理。

步骤

  1. 导入配置文件(properties类型)
  2. 创建一个数据配置文件类
  3. 读取德鲁伊配置文件
  4. 调用德鲁伊的静态方法返回连接池

     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 的核心类主要包括:

  1. QueryRunner:这是 DbUtils 中最重要的类之一,它简化了 SQL 查询的执行,包括执行更新(INSERT、UPDATE、DELETE)和查询(SELECT)操作。QueryRunner 提供了重载的 query() 和 update() 方法,用于执行不同类型的数据库操作。

  2. ResultSetHandler:这是一个接口,用于处理 ResultSet 对象的结果。QueryRunner 的 query() 方法需要一个 ResultSetHandler 实现来告诉它如何处理 SQL 查询返回的 ResultSet。DbUtils 提供了一些 ResultSetHandler 的实现,如 BeanHandlerBeanListHandlerScalarHandler 等,用于将 ResultSet 转换为 Java 对象。

  3. 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的查询操作注意事项

  1. domain类中,属性的名称与mysql中字段必须一模一样,不然出现乱码
  2. 数据库中的名字不能是关键字,不然可能导致获取为null
  3. get和set必须要有
  4. domain类中,必须要有无参构造器

Apache—DBUtils的不足

  1. SQl语句是固定的,不能通过参数传入,通用性不好,需要进行改进,更方便的执行增删改查
  2. 对于select操作,如果有返回值,返回类型是不确定的,需要使用泛型
  3. 对于业务需求复杂的情况,不方便实现

9. BasicDao类(解耦)

BasicDao类

13.1基本介绍

BasicDao简称DAO:date access object 数据访问对象

  1. 这样的通用类,称为 BasicDao ,是专门和数据库交互的,即完成对数据库(表)的 crud 操作
  2. 在 BaiscDao 的基础上,实现一张表对应一个 Dao,更好的完成功能,比如 Customer表 --- Customer.java类(javabean) --- CustomerDao.java
  3. 解耦: 通过将数据库操作逻辑从业务逻辑中分离,BasicDao 有助于降低代码耦合。业务逻辑不需要关心具体的数据库实现细节,只需要通过 BasicDao 提供的接口进行操作。

  4. 复用性: 提供通用的数据访问方法(如 save,,updatedelete,`查找findById 等),可以在多个 DAO 实现类中复用,减少重复代码。

  5. 易于维护: 由于数据访问逻辑集中在 BasicDao 中,当数据库操作需要更改时,只需修改 BasicDao 或其子类即可,而无需更改业务逻辑代码。

  6. 扩展性

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com