这篇文章主要介绍“如何使用JDBC核心类控制进行JDBC处理”,在日常操作中,相信很多人在如何使用JDBC核心类控制进行JDBC处理问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”如何使用JDBC核心类控制进行JDBC处理”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!下表概述的操作序列可能最好地显示了Spring框架JDBC
抽象提供的值。该表显示了Spring负责哪些操作以及哪些操作是你需要做的。Spring框架负责处理使JDBC
成为如此乏味的API的所有底层细节。你可以选择几种方法来构成JDBC
数据库访问的基础。除了JdbcTemplate
的三种形式之外,新的SimpleJdbcInsert
和SimpleJdbcCall
方法还优化了数据库元数据,并且RDBMS
Object
样式采用了一种类似于JDO Query
设计的面向对象的方法。一旦开始使用这些方法之一,你仍然可以混合搭配以包含来自其他方法的功能。所有方法都需要兼容JDBC 2.0
的驱动程序,而某些高级功能则需要JDBC 3.0
驱动程序。JdbcTemplate
是经典且最受欢迎的Spring JDBC
方法。这种最低级别的方法和所有其他方法都在幕后使用JdbcTemplate
。NamedParameterJdbcTemplate
包装了一个JdbcTemplate
来提供命名参数,而不是传统的JDBC
?
占位符。当你有多个SQL语句参数时,此方法可提供更好的文档编制和易用性。SimpleJdbcInsert
和SimpleJdbcCall
优化数据库元数据以限制必要的配置量。这种方法简化了编码,因此你仅需要提供表或过程(存储过程)的名称,并提供与列名称匹配的参数映射。仅当数据库提供足够的元数据时,此方法才有效。如果数据库不提供此元数据,则必须提供参数的显式配置。RDBMS
对象(包括MappingSqlQuery
、SqlUpdate
和StoredProcedure
)要求你在数据访问层初始化期间创建可重用且线程安全的对象。此方法以JDO
查询为模型,其中定义查询字符串、声明参数并编译查询。完成后,可以使用各种参数值多次调用execute(...)
、update(...)
和findObject(...)
方法。Spring框架的JDBC
抽象框架由四个不同的包组成:core
: org.springframework.jdbc.core
包含JdbcTemplate
类及其各种回调接口,以及各种相关类。名为org.springframework.jdbc.core.simple
的子包包含SimpleJdbcInsert
和SimpleJdbcCall
类。另一个名为org.springframework.jdbc.core.namedparam
的子包包含NamedParameterJdbcTemplate
类和相关的支持类。请参阅使用JDBC核心类控制基本JDBC处理和错误处理、JDBC批处理操作和使用SimpleJdbc类简化JDBC操作。datasource
: org.springframework.jdbc.datasource
包含一个实用程序类,用于轻松访问DataSource
和各种简单DataSource
实现,可用于在Java EE容器之外测试和运行未修改的JDBC
代码。名为org.springfamework.jdbc.datasource.embedded
的子包提供了对使用Java数据库引擎(例如HSQL
、H2
和Derby
)创建嵌入式数据库的支持。请参阅控制数据库连接和嵌入式数据库支持。object
: org.springframework.jdbc.object
包含一些类,这些类将RDBMS
查询、更新和存储过程表示为线程安全的可重用对象。请参阅将JDBC操作建模为Java对象。尽管查询返回的对象自然会与数据库断开连接,但是JDO
对此方法进行了建模。较高级别的JDBC
抽象依赖于org.springframework.jdbc.core
包中的较低级别的抽象。support
: org.springframework.jdbc.support
包提供了SQLException
转换功能和一些实用程序类。JDBC
处理期间引发的异常将转换为org.springframework.dao
包中定义的异常。这意味着使用Spring JDBC
抽象层的代码不需要实现JDBC
或RDBMS
特定的错误处理。所有转换的异常均为uncheck
异常,这使你可以选择捕获可从中恢复的异常,同时将其他异常传递到调用方。请参见使用SQLExceptionTranslator。本节介绍如何使用JDBC
核心类控制JDBC
处理,包括错误处理。它包括以下主题:使用JdbcTemplate
使用NamedParameterJdbcTemplate
使用SQLExceptionTranslator
执行语句执行查询更新数据库获取自动生成主键JdbcTemplate
JdbcTemplate
是JDBC
的core
包中的核心类。它处理资源的创建和释放,这有助于你避免常见的错误,例如忘记关闭连接。它执行核心JDBC
工作流程的基本任务(例如,语句创建和执行),而使应用程序代码提供SQL并提取结果。JdbcTemplate
类:运行SQL查询更新语句和存储过程调用对ResultSet
实例执行迭代并提取返回的参数值。捕获JDBC
异常并将其转换为org.springframework.dao
包中定义的通用、信息量更大的异常层次结构。 (请参见一致的异常层次结构)当将JdbcTemplate
用于代码时,只需实现回调接口,即可为它们提供明确定义的约定。给定JdbcTemplate
类提供的Connection
、PreparedStatementCreator
回调接口将创建一条准备好的语句,提供SQL和任何必要的参数。对于CallableStatementCreator
接口(创建可调用语句)也是如此。 RowCallbackHandler
接口从ResultSet
的每一行提取值。你可以通过直接实例化DataSource
引用在DAO实现中使用JdbcTemplate
,也可以在Spring IoC容器中对其进行配置,并将其作为Bean引用提供给DAO。应该始终在Spring IoC容器中将DataSource
配置为Bean。在第一种情况下,bean被直接提供给服务。在第二种情况下,将其提供给准备好的模板。此类发出的所有SQL都在DEBUG
级别下记录,该类别对应于模板实例的全限定类名称(通常为JdbcTemplate
,但如果使用JdbcTemplate
类的自定义子类,则可能有所不同)。以下各节提供了JdbcTemplate
用法的一些示例。这些示例不是JdbcTemplate
暴露的所有功能的详尽列表。请参考附带的javadoc。查询(SELECT)以下查询获取关联中的行数:以下查询使用绑定变量:以下查询查找字符串:以下查询查找并填充单个领域对象:以下查询查找并填充领域对象列表:如果最后两个代码段确实存在于同一应用程序中,则删除两个RowMapper
lambda表达式中存在的重复项并将它们提取到单个字段中,然后可以根据需要由DAO方法引用,这是有意义的。例如,使用前面编写的代码段,如下所示:使用JdbcTemplate更新(INSERT,UPDATE和DELETE)您可以使用update(..)方法执行插入,更新和删除操作。参数值通常作为变量参数提供,或者作为对象数组提供。下面的示例插入一个新数据:以下示例更新现有数据:下面的示例删除一条数据:参考代码:org.liyong.dataaccess.starter.JdbcTemplateTransactionManagerIocContainer
其他JdbcTemplate操作你可以使用execute(..)方法来运行任意SQL。因此,该方法经常用于DDL语句。它被接受回调接口、绑定变量数组等的变量重载。下面的示例创建了一个表:下面的示例调用一个存储过程:稍后将介绍更复杂的存储过程支持。JdbcTemplate最佳做法一旦配置,JdbcTemplate
类的实例是线程安全的。它很重要,因为这意味着你可以配置JdbcTemplate
的单个实例,然后将该共享引用安全地注入到多个DAO(或存储库)中。JdbcTemplate
是有状态的,因为它维护对DataSource
的引用,但是此状态不是会话状态。使用JdbcTemplate
类(和关联的NamedParameterJdbcTemplate
类)的常见做法是在Spring配置文件中配置DataSource
,然后将共享的DataSource
bean依赖注入到DAO类中。 JdbcTemplate
在数据源的设置器中创建。这导致类似于以下内容的DAO:以下示例显示了相应的XML配置:显式配置的替代方法是使用组件扫描和注解支持进行依赖项注入。在这种情况下,可以使用@Repository
注释该类(这使其成为组件扫描的候选对象),并使用@Autowired
注解DataSource
setter方法。以下示例显示了如何执行此操作:用@Repository
注释类。用@Autowired
注释DataSource
setter方法。使用DataSource
创建一个新的JdbcTemplate
。以下示例显示了相应的XML配置:如果你使用Spring的JdbcDaoSupport
类,并且从中扩展了各种JDBC支持的DAO类,则你的子类将从JdbcDaoSupport
类继承一个setDataSource(..)
方法。你可以选择是否从此类继承。提供JdbcDaoSupport
类目的只是为了方便。无论你选择使用(或不使用)以上哪种模板初始化样式,都无需在每次要运行SQL时都创建JdbcTemplate
类的新实例。配置完成后,JdbcTemplate
实例是线程安全的。如果你的应用程序访问多个数据库,你可能需要多个JdbcTemplate
实例,这需要多个数据源,然后需要多个不同配置的JdbcTemplate
实例。参考代码:org.liyong.dataaccess.starter.JdbcTemplateBestTransactionManagerIocContainer
NamedParameterJdbcTemplate
?
)编程的JDBC语句相反,NamedParameterJdbcTemplate
类增加了使用命名参数对JDBC语句进行编程的支持。NamedParameterJdbcTemplate
类包装JdbcTemplate
并将其委托给包装的JdbcTemplate
以完成其大部分工作。本节仅描述NamedParameterJdbcTemplate
类的那些与JdbcTemplate
本身不同的部分,通过使用命名参数对JDBC语句进行编程。下面的示例演示如何使用NamedParameterJdbcTemplate
:请注意,在分配给sql变量的值以及插入到namedParameters
变量(MapSqlParameterSource
类型)中的相应值中使用了命名参数符号。或者,你可以使用基于Map的格式将命名参数及其对应的值传递给NamedParameterJdbcTemplate
实例。由NamedParameterJdbcOperations
暴露并由NamedParameterJdbcTemplate
类实现的其余方法遵循类似的模式,此处不再赘述。以下示例说明了基于Map的格式的使用:SqlParameterSource
接口是与NamedParameterJdbcTemplate
相关的一个不错的功能(并且存在于同一Java包中)。你已经在前面的代码片段之一(MapSqlParameterSource
类)中看到了此接口的实现示例。SqlParameterSource
是NamedParameterJdbcTemplate
的命名参数值的源。MapSqlParameterSource
类是一个简单的实现,它是围绕java.util.Map
的适配器,其中键是参数名称、值是参数值。另一个SqlParameterSource
实现是BeanPropertySqlParameterSource
类。此类包装一个任意的JavaBean(即,遵循JavaBean约定的类的实例),并使用包装的JavaBean的属性作为命名参数值的源。以下示例显示了典型的JavaBean:以下示例使用NamedParameterJdbcTemplate
返回上一示例中显示的类的成员数:记住,NamedParameterJdbcTemplate
类包装了经典的JdbcTemplate
模板。如果需要访问包装的JdbcTemplate
实例以访问仅在JdbcTemplate
类中提供的功能,则可以使用getJdbcOperations()
方法通过JdbcOperations
接口访问包装的JdbcTemplate
。另请参阅JdbcTemplate最佳实践,以获取有关在应用程序上下文中使用NamedParameterJdbcTemplate
类的指导。参考代码:org.liyong.dataaccess.starter.NamedParameterTransactionManagerIocContainer
SQLExceptionTranslator
SQLExceptionTranslator
是由可以在SQLExceptions
和Spring自己的org.springframework.dao.DataAccessException
之间进行转换的类实现的接口,该类与数据访问策略无关。为了提高精度,实现可以是通用的(例如,使用SQLState
代码用于JDBC)或专有的(例如,使用Oracle错误代码)。SQLErrorCodeSQLExceptionTranslator
是默认使用的SQLExceptionTranslator
的实现。此实现使用特定的供应商代码。它比SQLState
实现更精确。错误代码的转换基于一个名为SQLErrorCodes
的JavaBean类型类中的代码。此类由SQLErrorCodesFactory
创建和填充,SQLErrorCodesFactory
是工厂,用于基于名为sql-error-codes.xml
的配置文件的内容创建SQLErrorCodes
。此文件使用供应商代码填充,并基于从DatabaseMetaData
中获取的DatabaseProductName
填充。使用你正在使用的实际数据库的代码。SQLErrorCodeSQLExceptionTranslator
按以下顺序应用匹配规则:子类实现的任何自定义转换。通常,将使用提供的具体SQLErrorCodeSQLExceptionTranslator
,因此此规则不适用。仅当你确实提供了子类实现时,它才适用。作为SQLErrorCodes
类的customSqlExceptionTranslator
属性提供的SQLExceptionTranslator
接口的任何自定义实现。搜索CustomSQLErrorCodesTranslation
类的实例列表(为SQLErrorCodes
类的customTranslations
属性提供),以查找匹配项。错误代码匹配被应用。使用后备转换器。 SQLExceptionSubclassTranslator
是默认的后备转换器。如果此转换器不可用,则下一个后备转换器是SQLStateSQLExceptionTranslator
。默认情况下,使用SQLErrorCodesFactory
定义错误代码和自定义异常转换。从类路径的名为sql-error-codes.xml
的文件中查找它们,并根据使用中数据库的数据库元数据中的数据库名称找到匹配的SQLErrorCodes
实例。你可以扩展SQLErrorCodeSQLExceptionTranslator
,如以下示例所示:在前面的示例中,特定的错误代码(-12345)被转换,而其他错误则由默认转换器实现转换。要使用此自定义转换器,必须通过setExceptionTranslator
方法将其传递给JdbcTemplate
,并且必须在需要此转换器的所有数据访问处理中使用此JdbcTemplate
。以下示例显示了如何使用此自定义转换器:定制转换器会传递一个数据源,以便在sql-error-codes.xml
中查找错误代码。Type
转换为作为参数传递的Java类。如果类型转换无效,则抛出InvalidDataAccessApiUsageException。以下示例包含两种查询方法,一种用于int,另一种用于查询String:除了单个结果查询方法外,还有几种方法返回一个列表,其中包含查询返回的每一行的条目。最通用的方法是queryForList(..),它使用列名作为键,返回一个List,其中每个元素是一个Map,其中每个列包含一个条目。如果在前面的示例中添加一种方法来检索所有行的列表,则可能如下所示:返回的列表类似于以下内容:DataSource
使用 DataSourceUtils
实现 SmartDataSource
扩张 AbstractDataSource
使用 SingleConnectionDataSource
使用 DriverManagerDataSource
使用 TransactionAwareDataSourceProxy
使用 DataSourceTransactionManager
DataSource
DataSourceUtils
AbstractDataSource
SingleConnectionDataSource
DriverManagerDataSource
TransactionAwareDataSourceProxy
DataSourceTransactionManager
?
占位符,则传入包含更新值的对象数组的列表。该对象数组在SQL语句中的每个占位符必须具有一个条目,并且它们的顺序必须与SQL语句中定义的顺序相同。以下示例与前面的示例相同,不同之处在于它使用经典的JDBC?
占位符:我们前面介绍的所有批处理更新方法都返回一个int数组,其中包含每个批处理条目的受影响行数。此计数由JDBC驱动程序报告。如果该计数不可用,则JDBC驱动程序将返回值-2。在这种情况下,通过在基础PreparedStatement上自动设置值,需要从给定的Java类型派生每个值的对应JDBC类型。尽管这通常效果很好,但存在潜在的问题(例如,包含Map的空值)。在这种情况下,Spring默认情况下会调用ParameterMetaData.getParameterType,这对于JDBC驱动程序可能会很昂贵。如果遇到性能问题,则应使用最新的驱动程序版本,并考虑将spring.jdbc.getParameterType.ignore属性设置为true(作为JVM系统属性或在类路径根目录中的spring.properties文件中)。如关于Oracle 12c(SPR-16139)的报道。或者,你可以考虑通过BatchPreparedStatementSetter
(如前所示),通过为基于“List
的调用提供的显式类型数组,通过在服务器上的“registerSqlType
调用来显式指定相应的JDBC类型。自定义“MapSqlParameterSource
实例,或者通过BeanPropertySqlParameterSource
实例从Java声明的属性类型中获取SQL类型,即使对于null
值也是如此。
相关推荐: AtomicIntegerArray、AtomicLongArray怎么使用
这篇文章主要介绍了AtomicIntegerArray、AtomicLongArray怎么使用,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。介绍在并发工具包中的原子类的使用。和上一篇一样这几个类…
免责声明:本站发布的图片视频文字,以转载和分享为主,文章观点不代表本站立场,本站不承担相关法律责任;如果涉及侵权请联系邮箱:360163164@qq.com举报,并提供相关证据,经查实将立刻删除涉嫌侵权内容。