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中注入即可. 在 ...
随机推荐
- Ubuntu终端命令行缩短显示路径
平时我们使用linux终端命令行的时候,常常会被一个问题困扰,那就是文件路径过长, 有时候甚至超过了一行,这样看起来非常别扭,其实只要两步就可以解决这个问题: 1,修改.bashrc文件(用户根目录下 ...
- js和java中URI的编码和解码
js中对文字进行编码主要有三个函数:escape,encodeURI,encodeURIComponent: 对应解码为:unescape,decodeURI,decodeURIComponent 这 ...
- 取得Linux系统的各种统计信息
本文基于Linux 2.6.x内核 一.取得CPU信息(相关文件/proc/stat) 在一个系统中的/proct/stat文件内容如下 $ cat /proc/stat cpu 1039426 17 ...
- 《黑白团团队》第七次作业:团队项目设计完善&编码
项目 内容 作业课程地址 任课教师首页链接 作业要求 团队项目 填写团队名称 黑白团团队 填写具体目标 认真负责,完成项目 任务1:团队软件项目设计完善 Github仓库上传<软件设计方案说明书 ...
- 【XSY2384】【GDOI2017】微信
致去年的我:这是道广义SAM模板题啊…… 题意: Description Input Output HINT $1\leq N\leq 20$,$1\leq Q\leq 10^5$,字符串总长$\le ...
- https://stackoverflow.com/questions/16130292/java-lang-outofmemoryerror-permgen-space-java-reflection
https://stackoverflow.com/questions/16130292/java-lang-outofmemoryerror-permgen-space-java-reflectio ...
- C#中的string驻留池
刚开始学习C#的时候,就听说CLR对于String类有一种特别的内存管理机制:有时候,明明声明了两个String类的对象,但是他们偏偏却指向同一个实例.如下: String s1 = "He ...
- 使用 python 读写中文json
读写中文json ) 输出中文的json. 通过使用 ensure_ascii=False,输出原有的语言文字.indent參数是缩进数量. 更改写文件格式 将上一步导出的 string 直接写文 ...
- 串口通讯 ADC0804 数码管
#include<reg52.h> #include<stdio.h> #include<intrins.h> #define uchar unsigned cha ...
- 【手势交互】6. 微动VID
中国 天津 http://www.sharpnow.com/ 微动VID是天津锋时互动科技有限公司开发的中国Leap Motion. 它能够识别并跟踪用户手部的姿态.包含:指尖和掌心的三维空间位置:手 ...