spring的JdbcTemplate
一、首先配置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)});
- }
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中注入即可. 在 ...
随机推荐
- 洛谷P1540 机器翻译 水题 模拟
注意一下细节,尤其是更新minv时不要更新错. Code: #include<vector> #include<iostream> #include<cstdio> ...
- NTP学习路线
NTP了解路线 基础 ntp配置中的tinker参数? ntp的同步方式slew step的区别? restrict含义?restrict -6 default ignore含义? fudge 127 ...
- Linux设备驱动--块设备(三)之程序设计(转)
http://blog.csdn.net/jianchi88/article/details/7212701 块设备驱动注册与注销 块设备驱动中的第1个工作通常是注册它们自己到内核,完成这个任务的函数 ...
- 【ACM-ICPC 2018 南京赛区网络预赛 E】AC Challenge
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 写个DP 设f[j]表示已经做的题的状态为j的情况下接着选能获得的最大分数. 显然是个倒推. 记忆化搜索一波 dfs(i,j) 表示 ...
- --- Error: failed to execute '.\ARMCC\bin\ArmAsm'
1.KEIL4在开发STM32程序时报: Error: failed to execute '.\ARMCC\bin\ArmAsm' 或是Error: failed to execute '.\ARM ...
- JavaScript原生值与JSON的转换
---------------------------------- ---------------------------- stringify方法的另外两种参数: ---------------- ...
- 使用angularjs的$http.post异步提交数据时,服务器接收不了的问题
一,在正常情况下,使用表单的post方法提交数据,默认请求头的Content-Type:application/x-www-form-urlencoded类型, 提交数据格式如下: 二,使用angul ...
- Linux Mint (应用软件— 虚拟机:Virtualbox续)
我已经在当前的电脑中安装好了虚拟机.并且在虚拟机中安装了Ubuntu14.04LTS系统.接下来能够開始自己的折腾之旅了. 開始使用的时候总是感觉显示有问题,根据经验来看同,是系统分辨率设置不当引起的 ...
- Oracle 数据库勒索病毒 RushQL 处理办法
处理办法来自Oracle 官方: https://blogs.oracle.com/cnsupport_news/%E5%AF%B9%E6%95%B0%E6%8D%AE%E5%BA%93%E7%9A% ...
- Redis学习笔记(二) Redis 数据类型
Redis 支持五种数据类型:string(字符串).list(列表).hash(哈希).set(集合)和 zset(有序集合),接下来我们讲解分别讲解一下这五种类型的的使用. String(字符串) ...