一、Spring对不同的持久化支持:

Spring为各种支持的持久化技术,都提供了简单操作的模板和回调

ORM持久化技术 模板类
JDBC org.springframework.jdbc.core.JdbcTemplate
Hibernate5.0 org.springframework.orm.hibernate5.HibernateTemplate
IBatis(MyBatis) org.springframework.orm.ibatis.SqlMapClientTemplate
JPA org.springfrmaework.orm.jpa.JpaTemplate

其实Spring的JDBCTemplate有点像DBUtils,但是有时候还没有DBUitls好用。这里来学习一下使用Spring的JDBCTemplate来玩一下CRUD。

二、使用JdbcTemplate需要的jar包

在这里使用Spring的JDBCTemplate的时候先要把轮子拿过来:

除此之外,在Java中操作数据库怎么能不要对应的驱动包呢:

三、JdbcTemplate使用的基本步骤

然后再看看Spring的JDBCTemplate的使用大体步骤,这里有一个小例子:

  1 package com.spring.test;
  2
  3 import org.junit.Test;
  4 import org.springframework.jdbc.core.JdbcTemplate;
  5 import org.springframework.jdbc.datasource.DriverManagerDataSource;
  6
  7 public class TestJDBCTemplate {
  8
  9     @Test
 10     public void test1() {
 11
 12         // JDBC模板依赖于连接池来获得数据的连接,所以必须先要构造连接池
 13         DriverManagerDataSource dataSource = new DriverManagerDataSource();
 14         dataSource.setDriverClassName("com.mysql.jdbc.Driver");
 15         dataSource.setUrl("jdbc:mysql://localhost:3306/spring");
 16         dataSource.setUsername("root");
 17         dataSource.setPassword("123456");
 18
 19         // 创建JDBC模板
 20         JdbcTemplate jdbcTemplate = new JdbcTemplate();
 21         // 这里也可以使用构造方法
 22         jdbcTemplate.setDataSource(dataSource);
 23
 24         // sql语句
 25         String sql = "select count(*)  from user";
 26         Long num = (long) jdbcTemplate.queryForObject(sql, Long.class);
 27
 28         System.out.println(num);
 29
 30     }
 31
 32 }

四、进一步的考虑

其实这个例子本身没有什么的,只是演示了一下,其实在学Spring之后,感觉应该形成一种习惯,在new对象的时候我要想到IOC,在使用Set方法的时候,我要想到DI,再去要方便面(哦,不,是切面),我们应该想到用AOP的。这里可以在Spring中配置如下的引用链:

1. 我要有DataSource,DataSource的属性可以通过注入数据库的一些配置属性添加

2. 我要有JdbcTemplate,而Template依赖与DataSource,我要以ref的方式为我的JdbcTemplate注入引用

3. 有了JdbcTemplate之后,我要有Dao,此时我应该在Dao添加一个JdbcTemplate的成员,然后以ref的方式将JdbcTemplate引入到Dao中

4. 我在Action或者是Servlet中都会调用的是Serivce,所以,我在Serivce中要添加一个Dao作为成员,然后由ref在注入Dao到Service中

DataSource --> JdbcTemplate --> Dao --> Service --> Action/Servlet

"-->"表示将左边的对象注入到右边的对象当中

配置文件如下:

  1 <?xml version="1.0" encoding="UTF-8"?>
  2 <beans xmlns="http://www.springframework.org/schema/beans"
  3     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4     xmlns:context="http://www.springframework.org/schema/context"
  5     xmlns:aop="http://www.springframework.org/schema/aop"
  6     xmlns:tx="http://www.springframework.org/schema/tx"
  7     xsi:schemaLocation="http://www.springframework.org/schema/beans
  8     http://www.springframework.org/schema/beans/spring-beans.xsd
  9     http://www.springframework.org/schema/context
 10     http://www.springframework.org/schema/context/spring-context.xsd
 11     http://www.springframework.org/schema/aop
 12     http://www.springframework.org/schema/aop/spring-aop.xsd
 13     http://www.springframework.org/schema/tx
 14     http://www.springframework.org/schema/tx/spring-tx.xsd">
 15
 16     <!-- IOC和DI的注解扫描 -->
 17     <context:component-scan base-package="com.spring" ></context:component-scan>
 18
 19     <!-- 打开AOP的注解 -->
 20     <!-- 这里用的是中间的横线而不是下划线 -->
 21     <aop:aspectj-autoproxy></aop:aspectj-autoproxy>
 22
 23     <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" >
 24         <property name="jdbcUrl" value="jdbc:mysql://localhost:3306/spring_03"></property>
 25         <property name="driverClass" value="com.mysql.jdbc.Driver"></property>
 26         <property name="user" value="root"></property>
 27         <property name="password" value="123456"></property>
 28     </bean>
 29
 30     <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
 31         <property name="dataSource" ref="dataSource"></property>
 32     </bean>
 33
 34     <bean id="userDao" class="com.spring.dao.UserDao">
 35         <property name="jdbcTemplate" ref="jdbcTemplate"></property>
 36     </bean>
 37
 38     <bean id="userService" class="com.spring.service.UserService">
 39         <property name="userDao" ref="userDao"></property>
 40     </bean>
 41
 42 </beans>

其中dataSource和jdbcTemplate都是直接配置的,不用写啥。

然后是UserDao.java

  1 package com.spring.dao;
  2
  3 import org.springframework.jdbc.core.JdbcTemplate;
  4
  5 import com.spring.domain.User;
  6
  7 public class UserDao {
  8
  9     private JdbcTemplate jdbcTemplate;
 10
 11     public JdbcTemplate getJdbcTemplate() {
 12         return jdbcTemplate;
 13     }
 14
 15     public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
 16         this.jdbcTemplate = jdbcTemplate;
 17     }
 18
 19     public void addUser(User user) {
 20
 21         String sql = "insert into user (username, password) values (?, ?)";
 22
 23         jdbcTemplate.update(sql, user.getUsername(), user.getPassword());
 24
 25     }
 26
 27 }

UserSerice.java

  1 package com.spring.service;
  2
  3 import com.spring.dao.UserDao;
  4 import com.spring.domain.User;
  5
  6 public class UserService {
  7
  8     // 加入userDao作为成员变变量
  9     private UserDao userDao;
 10
 11     // 注意这里要增加get和set方法
 12     public UserDao getUserDao() {
 13         return userDao;
 14     }
 15
 16     public void setUserDao(UserDao userDao) {
 17         this.userDao = userDao;
 18     }
 19
 20     public void addUser(User user) {
 21         userDao.addUser(user);
 22     }
 23 }

上面的文件都是用的配置文件来获得对象的,而没有使用注解。

测试类:

  1 package com.spring.test;
  2
  3 import org.junit.Test;
  4 import org.springframework.context.ApplicationContext;
  5 import org.springframework.context.support.ClassPathXmlApplicationContext;
  6 import com.spring.domain.User;
  7 import com.spring.service.UserService;
  8
  9 public class TestJDBCTemplate {
 10
 11     @Test
 12     public void test2() {
 13
 14         ApplicationContext ctx = new ClassPathXmlApplicationContext("bean.xml");
 15         UserService userService = (UserService) ctx.getBean("userService");
 16
 17         User user = new User();
 18         user.setPassword("111");
 19         user.setUsername("小王");
 20
 21         userService.addUser(user);
 22
 23     }
 24
 25 }

哦,对了其中配置的数据源是C3P0的数据源,还要导入C3P0的包:

五、JdbcTemplate的CRUD方法

1. 插入数据

  1 public void addUser(User user) {
  2
  3     String sql = "insert into user (username, password) values (?, ?)";
  4
  5     jdbcTemplate.update(sql, user.getUsername(), user.getPassword());
  6
  7 }

如上,插入代码用的是update方法,其实增删改用的都是update方法,而查询则是和query相关的方法。

2. 删除操作

  1 public void deleteUser( ) {
  2     String sql = "delete from user where username= ?";
  3     jdbcTemplate.update(sql, "小王");
  4 }

3. 修改操作

  1 public void updateUser(User user) {
  2     String sql = "update user set username=? where username= ?";
  3     jdbcTemplate.update(sql,  user.getUsername() + "_new", user.getUsername());
  4 }

4. 查询操作

上面三个都比较简单,查询倒是有些复杂。在使用比较基础的持久化工具的时候,比如DBUtils都会针对查询结果给我们提供一些封装的接口和类,但是JdbcTemplate只给我们提供了接口,并没有可用的类,所以我们需要自己写实现类来进行封装。这里会学习使用JdbcTemplate进行三种查询操作:

4.a. 查询表的记录数

  1 @Test
  2 public void test5() {
  3     ApplicationContext ctx = new ClassPathXmlApplicationContext("bean.xml");
  4     JdbcTemplate jdbcTemplate = (JdbcTemplate) ctx.getBean("jdbcTemplate");
  5     String sql = "select count(*) from user";
  6     Long row = jdbcTemplate.queryForObject(sql, Long.class);
  7     System.out.println("查询出来的记录数为:" + row);
  8 }

4.b. 查询返回对象

  1 @Test
  2 public void test6() {
  3     // 获得jdbcTemplate对象
  4     ApplicationContext ctx = new ClassPathXmlApplicationContext("bean.xml");
  5     JdbcTemplate jdbcTemplate = (JdbcTemplate) ctx.getBean("jdbcTemplate");
  6     String sql = "select username, password from user where username = ?";
  7     // 设定参数
  8     Object[] object = {"mary_new"};
  9     // 进行查询
 10     User user = jdbcTemplate.queryForObject(sql, object,  new UserMapper());
 11     System.out.println(user);
 12 }

除此之外要实现结构RowMapper来新建一个映射类:

  1 package com.spring.test;
  2
  3 import java.sql.ResultSet;
  4 import java.sql.SQLException;
  5
  6 import org.springframework.jdbc.core.RowMapper;
  7
  8 import com.spring.domain.User;
  9
 10 public class UserMapper implements RowMapper<User>{
 11
 12     @Override
 13     public User mapRow(ResultSet resultSet, int rows) throws SQLException {
 14         User user = new User();
 15         user.setUsername(resultSet.getString(1));
 16         user.setPassword(resultSet.getString(2));
 17
 18         return user;
 19     }
 20
 21 }

要注意这个UserMapper.java应该要和具体的Sql语句对应。

4.c. 查询并返回List集合

  1 @Test
  2 public void test7() {
  3     // 获得jdbcTemplate对象
  4     ApplicationContext ctx = new ClassPathXmlApplicationContext("bean.xml");
  5     JdbcTemplate jdbcTemplate = (JdbcTemplate) ctx.getBean("jdbcTemplate");
  6
  7     // sql语句
  8     String sql = "select * from user";
  9     List<User> users = jdbcTemplate.query(sql, new UserMapper());
 10
 11     for(User u: users) {
 12         System.out.println(u);
 13     }
 14 }

总结:

1. Spring全套管理各种组件,注入、控制反转等,将组件之间的关系以配置文件的形式串联起来,最大程度的对应用解耦和

2. Spring的JdbcTemplate中的CRUD操作还好,比较常规,但是也只对JDBC的持久化操作的演示,还没用其他的呢

3. 多练习下配置文件编写,注入的方式、写法还不是很熟

JDBCTemplate简化JDBC的操作(二)的更多相关文章

  1. 使用Spring JDBCTemplate简化JDBC的操作

    使用Spring JDBCTemplate简化JDBC的操作 接触过JAVA WEB开发的朋友肯定都知道Hibernate框架,虽然不否定它的强大之处,但个人对它一直无感,总感觉不够灵活,太过臃肿了. ...

  2. JDBCTemplate简化JDBC的操作(一)

    接触过JAVA WEB开发的朋友肯定都知道Hibernate框架,虽然不否定它的强大之处,但个人对它一直无感,总感觉不够灵活,太过臃肿了. 今天来说下Spring中关于JDBC的一个辅助类(JDBC ...

  3. JDBCTemplate简化JDBC的操作(三)需要注意的地方

    一,代码 List<String> cols = orgJdbcTemplate .queryForList( "SELECT COLUMN_NAME FROM informat ...

  4. 使用JdbcTemplate简化JDBC操作 实现数据库操作

    使用Spring JDBC框架方遍简单的完成JDBC操作,满足性能的需求且灵活性高. Spring JDBC框架由4个部分组成,即core.datasource.object.support. org ...

  5. [原创]java WEB学习笔记109:Spring学习---spring对JDBC的支持:使用 JdbcTemplate 查询数据库,简化 JDBC 模板查询,在 JDBC 模板中使用具名参数两种实现

    本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...

  6. 使用元数据简化jdbc代码---查询操作(用到反射)

    使用元数据简化jdbc代码---查询操作(用到反射) 一  思路分析 简化就是把共同的地方提取出来并放到一个方法里,在用到时只要调用就ok了,上一篇介绍了更新的操作,而查询的操作相对来说比较复杂,因为 ...

  7. 深入浅出学习Hibernate框架(二):JDBC基础操作

    上篇博客<深入浅出学习Hibernate框架(一):从实例入手初识Hibernate框架>简单介绍了一下Hibernate框架,并且举了一个实例来了解Hibernate.这篇博客将介绍JD ...

  8. JDBC的操作步骤

    JDBC的操作步骤 一.什么是JDBC JDBC(Java DataBase Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问 ...

  9. springboot之整合基本的jdbc并操作Mysql数据库

    对于数据访问层,无论是SQL还是NOSQL,springboot默认采用整合spring data方式进行统一处理,添加大量自动配置,屏蔽了许多设置,引入各种xxxTemplate,xxxReposi ...

随机推荐

  1. BZOJ 3309: DZY Loves Math [莫比乌斯反演 线性筛]

    题意:\(f(n)\)为n的质因子分解中的最大幂指数,求\(\sum_{i=1}^n \sum_{j=1}^m f(gcd(i,j))\) 套路推♂倒 \[ \sum_{D=1}^n \sum_{d| ...

  2. POJ Ikki's Story IV - Panda's Trick [2-SAT]

    题意: 圆上n个点,m对点之间连边,连在园内或园外,所有边不相交是否可行 发现两对点连线都在内相交则都在外也相交,那么只有一个在内一个在外啦,转化为$2-SAT$问题 #include <ios ...

  3. 算法&数据结构系列 -- 堆(优先队列)

    前言 话说新开的博客十分好用... 所以,我打算开一个坑,名曰[算法系列]. 什么意思--从名字泥应该就猜得出来... 废话不多说,进入正文~~ 正文 原理 首先,堆是一颗棵二叉树.. 其次,堆是一棵 ...

  4. C# 使用 Lotus notes 公共邮箱发送邮件

    公司的邮件系统用的是反人类的 Lotus notes, 你敢信? 最近要实现一个功能,邮件提醒功能,就是通过自动发送提醒邮件 前前后后这个问题搞了2天,由于公司的诸多条件限制,无法直接调用到公司发送邮 ...

  5. phpstorm使用之——常用快捷键

    phpstorm使用之--常用快捷键 使用IDE的根本所在乃是为了提高工作效率. windows下phpstorm的快捷键 ctrl+shift+n查找文件 ctrl+shift+f 在一个目录里查找 ...

  6. Conemu, Msys2 工具整合,提升windows下控制台工作效率

    与windows cmd相比较git-bash这类的console工具好用很多,但是git-bash的命令和功能相对简单,功能扩展起来不方便,git-bash本身也是基于msys的. 昨天发现使用Ms ...

  7. com.mysql.jdbc.Driver和com.mysql.cj.jdbc.Driver的区别

    概述:com.mysql.jdbc.Driver是mysql-connector-java 5中的,而com.mysql.cj.jdbc.Driver是mysql-connector-java 6中的 ...

  8. hdu3480 Division(dp平行四边形优化)

    题意:将n个数分成m段,每段的代价为最大值减最小值的平方,为代价最小是多少n<=10000 ,m<=5000 题解:先拍好序,从小到大,这样绝对是花费最小的,不过怎么样来做呢?一定很容易想 ...

  9. 轻松搭建Git服务器(Ubuntu)

    搭建Git服务器 在远程仓库节中,我们讲了远程仓库实际上和本地仓库没啥不同,纯粹为了7x24小时开机并交换大家的修改. GitHub就是一个免费托管开源代码的远程仓库.但是对于某些视源代码如生命的商业 ...

  10. Linux下添加自定义脚本到开机自启动,标准rpm,举例:设置Apache自启动

    写一个脚本,名字为:autostart.sh,放在/etc/init.d/目录下,赋予权限chmod +x /etc/init.d/autostart.sh 代码如下 #!/bin/sh #chkco ...