《Spring》(十六)---- JDBC

  一般情况下,都是在DAO类中使用JdbcTemplate,JdbcTemplate在XML配置文件中配置好,直接在DAO中注入即可。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:p="http://www.springframework.org/schema/p"xmlns:context="http://www.springframework.org/schema/context"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd"><context:component-scan base-package="com.ivy"/><context:property-placeholder location="classpath:jdbc.properties"/><bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"destroy-method="close"p:driverClassName="${jdbc.driverClassName}"p:url="${jdbc.url}"p:username="${jdbc.username}"p:password="${jdbc.password}"/><bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"p:dataSource-ref="dataSource"/>
</beans>

在Spring配置文件中配置DAO一般分为4个步骤:

  1. 定义DataSource
  2. 定义JdbcTemplate
  3. 声明一个抽象的bean,以便所有DAO复用配置JdbcTemplate属性的配置。
  4. 配置具体的DAO

 

  基本数据操作

  • 更改数据

尽量使用可绑定参数的SQL,以便数据库可以复用SQL的执行计划,提高数据库的执行效率。

  • 返回数据库的表自增主键值

例如:

final String sqlString = "INSERT INTO t_forum(forum_name, forum_desc) VALUES (?, ?)";KeyHolder keyHolder = new GeneratedKeyHolder();jdbcTemplate.update(new PreparedStatementCreator() {@Overridepublic PreparedStatement createPreparedStatement(Connection conn)throws SQLException {PreparedStatement ps = conn.prepareStatement(sqlString);ps.setString(1, forum.getForumnName());ps.setString(2, forum.getForumnDesc());return ps;}}, keyHolder);forum.setForumnId(keyHolder.getKey().intValue());
  • 批量更新
 

private final String BATCH_INSERT_SQL = "INSERT INTO t_forum(forum_name, forum_desc) VALUES (?, ?)";


public
void addForums(final List<Forum> forums) {jdbcTemplate.batchUpdate(BATCH_INSERT_SQL, new BatchPreparedStatementSetter() {@Overridepublic void setValues(PreparedStatement ps, int index) throws SQLException {Forum forum = forums.get(index);ps.setString(1, forum.getForumName());ps.setString(2, forum.getForumDesc());}@Overridepublic int getBatchSize() {return forums.size();}});}

 

  • 查询数据

  Spring提供了RowCallbackHandler回调接口,通过该接口可以定义如何从结果集中获取数据。

单条结果集处理:

 

private final String SELECT_SQL = "SELECT forum_name, forum_desc FROM t_forum WHERE forum_id=?";


public
Forum getForum(final int forumId) {final Forum forum = new Forum();jdbcTemplate.query(SELECT_SQL, new Object[]{forumId}, new RowCallbackHandler() {@Overridepublic void processRow(ResultSet rs) throws SQLException {forum.setForumId(forumId);forum.setForumDesc(rs.getString("forum_desc"));forum.setForumName(rs.getString("forum_name"));}});return forum;}

多条数据结果集的处理:

 

private final String SELECT_MULTI_SQL = "SELECT forum_id,forum_name, forum_desc FROM t_forum WHERE forum_id between ? and ?";


public
List<Forum> getForums(final int fromId, final int toId) {final List<Forum> forums = new ArrayList<>();jdbcTemplate.query(SELECT_MULTI_SQL, new Object[]{fromId, toId}, new RowCallbackHandler() {@Overridepublic void processRow(ResultSet rs) throws SQLException {Forum forum = new Forum();forum.setForumId(rs.getInt("forum_id"));forum.setForumDesc(rs.getString("forum_desc"));forum.setForumName(rs.getString("forum_name"));forums.add(forum);}});return forums;}

使用RowMapper<T>处理结果集,RowMapper<T>更适合在多行结果集中使用:

 

private final String SELECT_MULTI_SQL = "SELECT forum_id,forum_name, forum_desc FROM t_forum WHERE forum_id between ? and ?";


public
List<Forum> getForumsByRowMapper(final int fromId, final int toId) {return jdbcTemplate.query(SELECT_MULTI_SQL, new Object[]{fromId, toId}, new RowMapper<Forum>() {@Overridepublic Forum mapRow(ResultSet rs, int index) throws SQLException {Forum forum = new Forum();forum.setForumId(rs.getInt("forum_id"));forum.setForumDesc(rs.getString("forum_desc"));forum.setForumName(rs.getString("forum_name"));return forum;}});}

 

RowCallbackHandler vs RowMapper<T>

  从功能上来说,RowCallbackHandler和RowMapper<T>并没有太大的区别,它们都是用于定义结果集行的读取逻辑,将ResultSet中的数据映射到对象或List中。

  当处理大结果集时,如果使用RowMapper,结果集中的所有数据最终都会映射并汇总成一个List<T>对象,占用大量的JVM内存,甚至可直接引发OOM,这时,应该使用RowCallbackHandler接口,用processRow()方法内部处理结果集数据。

 

  • 查询单值数据

int类型的单值查询接口:int queryForInt(String sql)

private final String COUNT_SQL = "SELECT COUNT(*) FROM t_forum";
public int getForumNum() {return jdbcTemplate.queryForInt(COUNT_SQL);}

long类型的单值查询接口:long queryForLong(String sql)

其他类型的单值查询接口:<T> T queryForObject(String sql, Class<T> requiredType);

 

使用RowMapper获取单值对象:

public class TopicDao {@Autowiredprivate JdbcTemplate jdbcTemplate;public double getReplyRate(int userId) {String sql = "SELECT topic_replies, topic_views FROM t_topic WHERE user_id=?";double rate = jdbcTemplate.queryForObject(sql, new Object[]{userId}, new RowMapper<Double>() {@Overridepublic Double mapRow(ResultSet rs, int index) throws SQLException {// TODO Auto-generated method stubint replies = rs.getInt("topic_replies");int views = rs.getInt("topic_views");if (views > 0) {return new Double((double)replies/views);} else {return new Double(0.0);}}});return rate;}
}

 

调用存储过程

创建一个存储过程:

delimiter //CREATE PROCEDURE P_GET_TOPIC_NUM(IN in_user_id INT, OUT out_num INT)
BEGINSELECT COUNT(*) INTO out_num FROM t_topic WHERE user_id=in_user_id;
END
//
delimiter ;
public int getUserTopicNum(final int userId) {String sql = "{call P_GET_TOPIC_NUM(?,?)}";Integer num = jdbcTemplate.execute(sql, new CallableStatementCallback<Integer>() {@Overridepublic Integer doInCallableStatement(CallableStatement cs)throws SQLException, DataAccessException {// TODO Auto-generated method stubcs.setInt(1, userId);cs.registerOutParameter(2, Types.INTEGER);cs.execute();return cs.getInt(2);}});return num;}

 

转载于:https://www.cnblogs.com/IvySue/p/6513423.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/488931.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

直接点oracle表编辑器,DbForge Studio for Oracle入门教程:如何在表编辑器中创建表...

dbForge Studio for Oracle是一个功能强大的集成开发环境(IDE)&#xff0c;它提供了通用的数据编辑工具来管理数据库内和外部数据&#xff0c;能够帮助Oracle开发者提高PL/SQL的编码速度。【dbForge Studio for Oracle 最新试用版下载】在本文示例中&#xff0c;我们将创建一个…

设置窗口置顶_这三个应用,每一个都能让你置顶。

| 当你有多个窗口同时打开&#xff0c;置顶其中某个或某些&#xff0c;能够方便你对比、学习、抄写……但不是所有软件都有这个功能&#xff0c;所以你需要今天的小干货。|-----------你的高效生活视频书。将窗口置顶&#xff0c;可以方便我们对比、写作、修改文案或代码&#…

汽车传感器科普

来源&#xff1a;湖杉资本先进驾驶辅助系统&#xff08;Advanced Driver Assistant System&#xff09;&#xff0c;简称ADAS&#xff0c;是利用安装于车上的各式各样的传感器&#xff0c; 在第一时间收集车内外的环境数据&#xff0c; 进行静、动态物体的辨识、侦测与追踪等技…

人工智能的现状与未来

来源&#xff1a; CIO之家几十年来计算速度飞速提高&#xff0c;从最初的科学数学计算演变到了现代的各种计算机应用领域&#xff0c;诸如多媒体应用&#xff0c;计算机辅助设计&#xff0c;数据库&#xff0c;数据通信&#xff0c;自动控制等等&#xff0c;人工智能是计算机科…

php分页技术的作用,分页原理技术细节剖析(php+mysql)实例

提到分页&#xff0c;大家都不陌生&#xff0c;在我们日常浏览网页时常遇到&#xff0c;尤其新闻文章列表等都有分页&#xff0c;如下图所示&#xff1a;分页实例下面&#xff0c;通过一个实例为大家剖析一下分页原理上技术细节。一、功能开发思路在分页功能的实现前&#xff0…

python idle 中文_Python IDLE 中文乱码问题

最近忙完了一个比较大的 GIS 软件系统&#xff0c;于是闲暇之余想研究一下开源的技术&#xff0c;纵观当前开源桌面 GIS 软件领域&#xff0c;最牛叉的莫过于大名鼎鼎的 Quantum GIS&#xff0c;简称 QGIS。做过 GIS 的人都知道&#xff0c;ESRI ArcGIS 是 GIS 软件领域迄今为止…

常见浏览器兼容性问题及解决方案

常见浏览器兼容性问题及解决方案&#xff1a; 1.不同浏览器的默认内外边距和内外补丁不同。 解决方案&#xff1a;css设置 *{margin:0; padding:0;} *是通配符&#xff0c;匹配所有html标签。 2.块级元素float之后&#xff0c;又有横向margin时&#xff0c;IE6显示margin比设置…

2020年物联网发展现状与趋势预测

来源&#xff1a;北京物联网智能技术应用协会一、综述物联网源于互联网领域&#xff0c;是信息科学技术产业的第三次革命。物联网是基于互联网&#xff0c;让所有物体能够独立寻址的普通物理对象实现互联互通的网络。简单说&#xff0c;就是通过安装信息传感设备&#xff0c;如…

shell中执行某条语句失败能不能重复执行_如何理解Mysql中的事务隔离级别?

要说清楚Mysql中的事务隔离级别&#xff0c;我们先从事务的定义说起。事务&#xff0c;是一个或一组sql语句组成的一个执行单元&#xff0c;这个执行单元要么全部执行&#xff0c;要么全部不执行。整个单独单元作为一个不可分割的整体&#xff0c;如果单元中某条sql语句一旦执行…

oracle 试图访问已经在使用的事物处理临时表,解决ORA-14450:试图访问已经在使用的事务处理临时表...

在开发使用过程中&#xff0c;一个存储过程用到表TMP_DA_GMS,允许程序的时候报错&#xff0c;后台查询到错误原因是因为表里有个字段需要设置为可以为N在开发使用过程中&#xff0c;一个存储过程用到表TMP_DA_GMS,允许程序的时候报错&#xff0c;后台查询到错误原因是因为表里有…

linux 下环境变量设置

Ubuntu Linux系统包含两类环境变量&#xff1a;系统环境变量和用户环境变量。系统环境变量对所有系统用户都有效&#xff0c;用户环境变量仅仅对当前的用户有效。 修改用户环境变量 用户环境变量通常被存储在下面的文件中&#xff1a; ~/.profile ~/.bash_profile 或者 ~./bas…

《数字孪生体技术白皮书(2019)》(简版)全文

来源&#xff1a;《数字孪生体实验室原创》12月27日&#xff0c;数字孪生体实验室与安世亚太联合正式发布了《数字孪生体技术白皮书&#xff08;2019&#xff09;》。白皮书的第一部分关注对数字孪生体的抽象和总结。无论是参考架构、成熟度模型还是关键技术&#xff0c;都以“…

oracle批量构造数据,oracle批量构造数据方法 - rd_clp的个人空间 - 51Testing软件测试网 51Testing软件测试网-软件测试人的精神家园...

1.一种是只要数据条数&#xff0c;至于里面内容可以是序列方式&#xff0c;另外可能几个表中相互id的关联&#xff0c;那建议用存诸过程写.表a(id,name)有学员的信息表b(id,testid,subject,score)有学员的考试成绩假设表a与表b的id都是有seq的自增长系列&#xff1b;表b.testid…

sql 删除字段中下划线_SQL基础教程知识点总结

1. ●列 ●字段 ●行 ●记录 2. SQL 语句及其种类 DDL DDL(Data Definition Language&#xff0c;数据定义语言)用来创建或者删除存储 数据用的数据库以及数据库中的表等对象。DDL 包含以下几种指令。 CREATE:创建数据库和表等对象 DROP: 删除数据库和表等对象 ALTER: 修改数据…

代码实现从键盘接收一个字符串, 程序对其中所有字符进行排序,例如键盘输入: helloitcast程序打印:acehillostt...

package com.loaderman.test;import java.util.Comparator; import java.util.Scanner; import java.util.TreeSet;public class Test {/*** 从键盘接收一个字符串, 程序对其中所有字符进行排序,例如键盘输入: helloitcast程序打印:acehillostt* 分析:* 1,键盘录入字符串,Scann…

王恩东院士:AI计算是未来的核心生产力

来源&#xff1a;蓝海长青智库12月27日&#xff0c;以“超算无界、智创未来”为主题的2019国际超级计算产业博览会在济南召开。中国工程院院士、浪潮集团首席科学家王恩东在大会发表《智慧计算 未来动力》主题演讲。王恩东指出&#xff0c;人工智能正在驱动前所未有的社会变革&…

php 501解决办法,PHP 使用错误处理解析

这篇文章主要为大家详细介绍了PHP 使用错误处理解析&#xff0c;具有一定的参考价值&#xff0c;可以用来参考一下。对使用PHP的错误处理感兴趣的小伙伴&#xff0c;下面一起跟随512笔记的小编两巴掌来看看吧&#xff01;在web 上所有常见的错误之一就是无效的链接。一旦从其它…

“阿基里斯与乌龟”的终结性思考

“阿基里斯与乌龟”是公元前五世纪古希腊芝诺提出的悖论&#xff0c;想必大家都已耳熟能详了。 乌龟只要还在阿基里斯前头&#xff0c;那么阿基里斯是一直处于追的状态&#xff0c;换句话说在这种状态下他一直没追上。 哪怕乌龟的领先优势越来越小&#xff0c;直至很小&#xf…

指纹识别 python_python 网站指纹识别

{"moduleinfo":{"card_count":[{"count_phone":1,"count":1}],"search_count":[{"count_phone":4,"count":4}]},"card":[{"des":"阿里技术人对外发布原创技术内容的最大平台&…

Linux系统常用函数,浅谈linux下的一些常用函数的总结(必看篇)

1.exit()函数exit(int n) 其实就是直接退出程序&#xff0c;因为默认的标准程序入口为int main(int argc, char** argv)&#xff0c;返回值是int型的。一般在shell下面&#xff0c;运行一个程序&#xff0c;然后使用命令echo $?就能得到该程序的返回值&#xff0c;也就是退出…