spring的jdbcTemplate的使用
转载:http://1358440610-qq-com.iteye.com/blog/1826816
一、首先配置JdbcTemplate;
要使用Jdbctemplate 对象来完成jdbc 操作。通常情况下,有三种种方式得到JdbcTemplate 对象。
第一种方式:我们可以在自己定义的DAO 实现类中注入一个DataSource 引用来完 成JdbcTemplate 的实例化。也就是它是从外部“注入” DataSource 到DAO 中,然后 自己实例化JdbcTemplate,然后将DataSource 设置到JdbcTemplate 对象中。
第二种方式: 在 Spring 的 IoC 容器中配置一个 JdbcTemplate 的 bean,将 DataSource 注入进来,然后再把JdbcTemplate 注入到自定义DAO 中。
第三种方式: Spring 提供了 org.springframework.jdbc.core.support.JdbcDaoSupport 类 , 这 个 类 中 定 义 了 JdbcTemplate 属性,也定义了DataSource 属性,当设置DataSource 属性的时候,会创 建jdbcTemplate 的实例,所以我们自己编写的DAO 只需要继承JdbcDaoSupport 类, 然后注入DataSource 即可。提倡采用第三种方法。虽然下面的用法中采用了前两种方法
配置方法有3种:
1、
- public class UserServiceImpl implements UserService {
- private JdbcTemplate jdbcTemplate;
- public JdbcTemplate getJdbcTemplate() {
- return jdbcTemplate;
- }
- //注入方法1
- public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
- this.jdbcTemplate = jdbcTemplate;
- }
- //其它方法这里省略……
- }
spring配置文件为:
- <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
- <property name = "dataSource" ref="dataSource">
- </bean>
- <bean id="userService" class="com.hxzy.account.jdbcTemplate.UserServiceImpl">
- <property name="jdbcTemplate" ref="jdbcTemplate"/>
- </bean>
方法2、
- public class UserServiceImpl implements UserService {
- private JdbcTemplate jdbcTemplate;
- //注入方法2
- public void setDataSource(DataSource dataSource) {
- this.jdbcTemplate = new JdbcTemplate(dataSource);
- }
- //其它方法省略……
- }
spring配置文件为:
- <bean id="userService" class="com.hxzy.account.jdbcTemplate.UserServiceImpl">
- <property name="dataSource" ref="dataSource"/>
- </bean>
方法3:继承JdbcDaoSupport,其内部有个JdbcTemplate ,需要注入DataSource 属性来实例化。
- public class UserDaoImpl extends JdbcDaoSupport implements UserDao {
- @Override
- public void save(User user) {
- String sql = null;
- this.getJdbcTemplate().update(sql);
- }
- //其它方法省略……
- }
spring配置文件:
- <bean id="userDao" class="com.hxzy.account.jdbcTemplate.UserDaoImpl">
- <property name="dataSource" ref="dataSource"/>
- </bean>
二、常用方法使用
【注意:】jdbcTemplate 中的sql均是用“?”做占位符的
domain User:
- public class User {
- private int id;
- private String username;
- private String password;
- private String sex;
- //setter和getter方法省略……
- }
UserServiceImpl :
如果采用第三种方式,则下面的用法中将方法中的 jdbcTemplate 换成 this.getJdbcTemplate()即可。
- /**
- * 创建表
- */
- public void create(String tableName){ //tb_test1
- jdbcTemplate.execute("create table "+tableName +" (id integer,user_name varchar2(40),password varchar2(40))");
- }
- //jdbcTemplate.update适合于insert 、update和delete操作;
- /**
- * 第一个参数为执行sql
- * 第二个参数为参数数据
- */
- public void save3(User user) {
- Assert.isNull(user, "user is not null");
- jdbcTemplate.update("insert into tb_test1(name,password) values(?,?)",
- new Object[]{user.getUsername(),user.getPassword()});
- }
- /**
- * 第一个参数为执行sql
- * 第二个参数为参数数据
- * 第三个参数为参数类型
- */
- @Override
- public void save(User user) {
- Assert.isNull(user, "user is not null");
- jdbcTemplate.update(
- "insert into tb_test1(name,password) values(?,?)",
- new Object[]{user.getUsername(),user.getPassword()},
- new int[]{java.sql.Types.VARCHAR,java.sql.Types.VARCHAR}
- );
- }
- //避免sql注入
- public void save2(final User user) {
- Assert.isNull(user, "user is not null");
- jdbcTemplate.update("insert into tb_test1(name,password) values(?,?)",
- new PreparedStatementSetter(){
- @Override
- public void setValues(PreparedStatement ps) throws SQLException {
- ps.setString(1, user.getUsername());
- ps.setString(2, user.getPassword());
- }
- });
- }
- public void save4(User user) {
- Assert.isNull(user, "user is not null");
- jdbcTemplate.update("insert into tb_test1(name,password) values(?,?)",
- new Object[]{user.getUsername(),user.getPassword()});
- }
- //返回插入的主键
- public List save5(final User user) {
- KeyHolder keyHolder = new GeneratedKeyHolder();
- jdbcTemplate.update(new PreparedStatementCreator() {
- @Override
- public PreparedStatement createPreparedStatement(Connection connection) throws SQLException {
- PreparedStatement ps = connection.prepareStatement("insert into tb_test1(name,password) values(?,?)", new String[] {"id"});
- ps.setString(1, user.getUsername());
- ps.setString(2, user.getPassword());
- return ps;
- }
- },
- keyHolder);
- return keyHolder.getKeyList();
- }
- @Override
- public void update(final User user) {
- jdbcTemplate.update(
- "update tb_test1 set name=?,password=? where id = ?",
- new PreparedStatementSetter(){
- @Override
- public void setValues(PreparedStatement ps) throws SQLException {
- ps.setString(1, user.getUsername());
- ps.setString(2, user.getPassword());
- ps.setInt(3, user.getId());
- }
- }
- );
- }
- @Override
- public void delete(User user) {
- Assert.isNull(user, "user is not null");
- jdbcTemplate.update(
- "delete from tb_test1 where id = ?",
- new Object[]{user.getId()},
- new int[]{java.sql.Types.INTEGER});
- }
- @Deprecated //因为没有查询条件,所以用处不大
- public int queryForInt1(){
- return jdbcTemplate.queryForInt("select count(0) from tb_test1");
- }
- public int queryForInt2(User user){
- return jdbcTemplate.queryForInt("select count(0) from tb_test1 where username = ?" ,
- new Object[]{user.getUsername()});
- }
- //最全的参数3个
- public int queryForInt3(User user){
- return jdbcTemplate.queryForInt("select count(0) from tb_test1 where username = ?" ,
- new Object[]{user.getUsername()},
- new int[]{java.sql.Types.VARCHAR});
- }
- //可以返回是一个基本类型的值
- @Deprecated //因为没有查询条件,所以用处不大
- public String queryForObject1(User user) {
- return (String) jdbcTemplate.queryForObject("select username from tb_test1 where id = 100",
- String.class);
- }
- //可以返回值是一个对象
- @Deprecated //因为没有查询条件,所以用处不大
- public User queryForObject2(User user) {
- return (User) jdbcTemplate.queryForObject("select * from tb_test1 where id = 100", User.class); //class是结果数据的java类型
- }
- @Deprecated //因为没有查询条件,所以用处不大
- public User queryForObject3(User user) {
- return (User) jdbcTemplate.queryForObject("select * from tb_test1 where id = 100",
- new RowMapper(){
- @Override
- public Object mapRow(ResultSet rs, int rowNum)throws SQLException {
- User user = new User();
- user.setId(rs.getInt("id"));
- user.setUsername(rs.getString("username"));
- user.setPassword(rs.getString("password"));
- return user;
- }
- }
- );
- }
- public User queryForObject4(User user) {
- return (User) jdbcTemplate.queryForObject("select * from tb_test1 where id = ?",
- new Object[]{user.getId()},
- User.class); //class是结果数据的java类型 实际上这里是做反射,将查询的结果和User进行对应复制
- }
- public User queryForObject5(User user) {
- return (User) jdbcTemplate.queryForObject(
- "select * from tb_test1 where id = ?",
- new Object[]{user.getId()},
- new RowMapper(){
- @Override
- public Object mapRow(ResultSet rs,int rowNum)throws SQLException {
- User user = new User();
- user.setId(rs.getInt("id"));
- user.setUsername(rs.getString("username"));
- user.setPassword(rs.getString("password"));
- return user;
- }
- }); //class是结果数据的java类型
- }
- @Override
- public User queryForObject(User user) {
- //方法有返回值
- return (User) jdbcTemplate.queryForObject("select * from tb_test1 where id = ?",
- new Object[]{user.getId()},
- new int[]{java.sql.Types.INTEGER},
- new RowMapper() {
- @Override
- public Object mapRow(ResultSet rs, int rowNum) throws SQLException {
- User user = new User();
- user.setId(rs.getInt("id"));
- user.setUsername(rs.getString("username"));
- user.setPassword(rs.getString("password"));
- return user;
- }
- }
- );
- }
- @SuppressWarnings("unchecked")
- public List<User> queryForList1(User user) {
- return (List<User>) jdbcTemplate.queryForList("select * from tb_test1 where username = ?",
- new Object[]{user.getUsername()},
- User.class);
- }
- @SuppressWarnings("unchecked")
- public List<String> queryForList2(User user) {
- return (List<String>) jdbcTemplate.queryForList("select username from tb_test1 where sex = ?",
- new Object[]{user.getSex()},
- String.class);
- }
- @SuppressWarnings("unchecked")
- //最全的参数查询
- public List<User> queryForList3(User user) {
- return (List<User>) jdbcTemplate.queryForList("select * from tb_test1 where username = ?",
- new Object[]{user.getUsername()},
- new int[]{java.sql.Types.VARCHAR},
- User.class);
- }
- //通过RowCallbackHandler对Select语句得到的每行记录进行解析,并为其创建一个User数据对象。实现了手动的OR映射。
- public User queryUserById4(String id){
- final User user = new User();
- //该方法返回值为void
- this.jdbcTemplate.query("select * from tb_test1 where id = ?",
- new Object[] { id },
- new RowCallbackHandler() {
- @Override
- public void processRow(ResultSet rs) throws SQLException {
- User user = new User();
- user.setId(rs.getInt("id"));
- user.setUsername(rs.getString("username"));
- user.setPassword(rs.getString("password"));
- }
- });
- return user;
- }
- @SuppressWarnings("unchecked")
- @Override
- public List<User> list(User user) {
- return jdbcTemplate.query("select * from tb_test1 where username like '%?%'",
- new Object[]{user.getUsername()},
- new int[]{java.sql.Types.VARCHAR},
- new RowMapper(){
- @Override
- public Object mapRow(ResultSet rs, int rowNum) throws SQLException {
- User user = new User();
- user.setId(rs.getInt("id"));
- user.setUsername(rs.getString("username"));
- user.setPassword(rs.getString("password"));
- return user;
- }
- });
- }
- //批量操作 适合于增、删、改操作
- public int[] batchUpdate(final List users) {
- int[] updateCounts = jdbcTemplate.batchUpdate(
- "update tb_test1 set username = ?, password = ? where id = ?",
- new BatchPreparedStatementSetter() {
- @Override
- public void setValues(PreparedStatement ps, int i) throws SQLException {
- ps.setString(1, ((User)users.get(i)).getUsername());
- ps.setString(2, ((User)users.get(i)).getPassword());
- ps.setLong(3, ((User)users.get(i)).getId());
- }
- @Override
- public int getBatchSize() {
- return users.size();
- }
- }
- );
- return updateCounts;
- }
- //调用存储过程
- public void callProcedure(int id){
- this.jdbcTemplate.update("call SUPPORT.REFRESH_USERS_SUMMARY(?)", new Object[]{Long.valueOf(id)});
- }
其中,batchUpdate适合于批量增、删、改操作;
update(…):使用于增、删、改操作;
execute():执行一个独立的sql语句,包括ddl语句;
queryForInt :查询出一个整数值
spring的jdbcTemplate的使用的更多相关文章
- Spring利用JDBCTemplate实现批量插入和返回id
1.先介绍一下java.sql.Connection接口提供的三个在执行插入语句后可取的自动生成的主键的方法: //第一个是 PreparedStatement prepareStatement(St ...
- Spring 中jdbcTemplate 实现执行多条sql语句
说一下Spring框架中使用jdbcTemplate实现多条sql语句的执行: 很多情况下我们需要处理一件事情的时候需要对多个表执行多个sql语句,比如淘宝下单时,我们确认付款时要对自己银行账户的表里 ...
- spring使用jdbcTemplate和jdbcdaosupport和namedparameter
jdbcTemplate: 首先连接数据库 <!-- 导入外部文件 --> <context:property-placeholder location="classpat ...
- Spring之JDBCTemplate学习
一.Spring对不同的持久化支持: Spring为各种支持的持久化技术,都提供了简单操作的模板和回调 ORM持久化技术 模板类 JDBC org.springframework.jdbc.core. ...
- spring+spring mvc+JdbcTemplate 入门小例子
大家使用这个入门时候 最好能够去 搜一下 spring mvc 的 原理,我放一张图到这里,自己琢磨下,后面去学习就容易了 给个链接 (网上一把,千万不能懒) https://www.cnblo ...
- spring 学习(四): spring 的 jdbcTemplate 操作
spring 学习(四): spring 的 jdbcTemplate 操作 spring 针对 javaee 的每一层,都提供了相应的解决技术,jdbcTemplate 的主要操作在 dao 层. ...
- Spring的jdbcTemplate 与原始jdbc 整合c3p0的DBUtils 及Hibernate 对比 Spring配置文件生成约束的菜单方法
以User为操作对象 package com.swift.jdbc; public class User { private Long user_id; private String user_cod ...
- spring学习(四)spring的jdbcTemplate(增删改查封装)
Spring的jdbcTemplate操作 1.Spring框架一站式框架 (1)针对javaee三层,每一层都有解决技术 (2)到dao 层,使用 jdbcTemplate 2.Spring对不同的 ...
- Spring:JdbcTemplate使用指南
Spring:JdbcTemplate使用指南 Spring:JdbcTemplate使用指南 前言: 本文指在介绍Spring框架中的JdbcTemplate类的使用方法,涉及基本的Spring反转 ...
- Spring中JdbcTemplate的基础用法
Spring中JdbcTemplate的基础用法 1.在DAO中使用JdbcTemplate 一般都是在DAO类中使用JdbcTimplate,在XML配置文件中配置好后,可以在DAO中注入即可. 在 ...
随机推荐
- ES 20 - 查询Elasticsearch中的数据 (基于DSL查询, 包括查询校验match + bool + term)
目录 1 什么是DSL 2 DSL校验 - 定位不合法的查询语句 3 match query的使用 3.1 简单功能示例 3.1.1 查询所有文档 3.1.2 查询满足一定条件的文档 3.1.3 分页 ...
- 宜信开源|手把手教你安装第一个LAIN应用
LAIN是宜信公司大数据创新中心开发的开源PaaS平台.在金融的场景下,LAIN 是为解放各个团队和业务线的生产力而设计的一个云平台.LAIN 为宜信大数据创新中心各个团队提供了统一的测试和生产环境, ...
- 【shell学习4》》】系统化整理大纲
之前看的runnoob整理,细节太多也没有系统起来,昨天公交上看了一些视频,略作总结: 标题零:学习基础//创建文件touch testVar.sh //vim编辑内容#!/bin/bashvari= ...
- [python] 安装TensorFlow问题 解决Cannot uninstall 'wrapt'. It is a distutils installed project
cmd安装 pip install tensorflow 1.遇到了 ERROR: Cannot uninstall 'wrapt'. It is a distutils installed proj ...
- JBuss--为所有JFinal开发者提供二次开发的后台管理系统
百度搜索:JBuss 或jfinal.com官网https://www.jfinal.com/share/1704 JBuss背景: 2018年6月1日,作者“为道日损”从上海一家xxx公司离职,那时 ...
- 随时发布:REST API文档的代码仓库中的持续集成与协作
本文主要内容:API文档提供了预测客户成功的关键路径:在代码附近的文档上进行协作可以更好地检查代码和文档文件,提高自动化效率,并专门针对文档进行质量测试:提供通用文档框架,标准,自动化和工具,以提高团 ...
- 【测试-测试心得】测试发现BUG后,怎么定位问题?
一.判断前后端 Safari中可以右键,选择“检查元素”,再选择“网络”同样可以抓取到http请求,如图 怎么区分是前端错误还是后端错误? 1.在开发者工具中,如果console中有报错,则表示前端代 ...
- 12306抢票系统——ER图及数据表
12306自动抢票系统——ER图及数据表 1. 抢票系统ER图 数据表 2.抢票系统数据结构表 (1)列车表 Trains table 字段名 数据类型 说明 是否为主键 Train_id strin ...
- spark 源码分析之十四 -- broadcast 是如何实现的?
本篇文章主要剖析broadcast 的实现机制. BroadcastManager初始化 BroadcastManager初始化方法源码如下: TorrentBroadcastFactory的继承关系 ...
- Char.Js 学习使用
<script src="../js/Chart.js"></script> <div " style="float:left;& ...