Spring之JDBCTemplate

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到教程。

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

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

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

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

二、使用JdbcTemplate需要的jar包

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

image

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

image

三、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     @Test10     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/beans8     http://www.springframework.org/schema/beans/spring-beans.xsd9     http://www.springframework.org/schema/context10     http://www.springframework.org/schema/context/spring-context.xsd11     http://www.springframework.org/schema/aop12     http://www.springframework.org/schema/aop/spring-aop.xsd13     http://www.springframework.org/schema/tx14     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     @Test12     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的包:

image

五、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. 查询表的记录数

image

复制代码
  1 @Test2 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. 查询返回对象

image

复制代码
  1 @Test2 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     @Override13     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集合

image

复制代码
  1 @Test2 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 }
复制代码

 

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

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

相关文章

从蚂蚁金服实践入手,带你深入了解 Service Mesh

本文整理自蚂蚁金服高级技术专家敖小剑在 QCon 上海 2018 上的演讲。我是来自蚂蚁金服中间件团队的敖小剑&#xff0c;目前是蚂蚁金服 Service Mesh 项目的 PD。我同时也是 Servicemesher 中国技术社区的创始人&#xff0c;是 Service Mesh 技术在国内最早的布道师。我今天给大…

线程组之间的JMeter传递变量

下面&#xff0c;我们将看看如何在线程组之间共享和传递变量。在开发高级JMeter脚本时&#xff0c;很可能您将拥有多个线程组。每个线程组将执行不同的请求。一个很好的例子是我们需要使用Bearer Tokens对用户进行身份验证。一个线程组执行身份验证并保存令牌。另一个线程组需要…

python第九天(9-33)

一&#xff1a;进程 进程概念 进程就是一个程序运行在一个数据集上的一次动态执行过程进程一般由程序&#xff0c;数据集&#xff0c;进程控制块组成进程控制块&#xff1a; 进程控制块用来记录进程的外部特征&#xff0c;描述进程的执行变化过程&#xff0c;系统可以利用它来控…

Python 数据类型--Bytes类型

一、Bytes类型 在Python3以后&#xff0c;字符串和bytes类型彻底分开了。字符串是以字符为单位进行处理的&#xff0c;bytes类型是以字节为单位处理的。 bytes数据类型在所有的操作和使用甚至内置方法上和字符串数据类型基本一样&#xff0c;也是不可变的序列对象。 bytes对象只…

文件结构

C语言文件名命名的规则 1、文件标识符分为两部分&#xff0c;即文件名前缀和后缀。文件名前缀的最前面要使用范围限定符——模块名&#xff08;文件名&#xff09;缩写。 2、采用小写字母命名文件&#xff0c;避免使用一些比较通俗的文件名&#xff0c;如&#xff1a;publi…

POJ 1187 陨石的秘密 (线性DP)

题意&#xff1a; 公元11380年&#xff0c;一颗巨大的陨石坠落在南极。于是&#xff0c;灾难降临了&#xff0c;地球上出现了一系列反常的现象。当人们焦急万分的时候&#xff0c;一支中国科学家组成的南极考察队赶到了出事地点。经过一番侦察&#xff0c;科学家们发现陨石上刻…

bzoj2561 最小生成树

题意&#xff1a;给你无向图&#xff0c;给定一条边&#xff0c;求至少在原图中删去多少边才能使它同时在某个最大生成树和某个最小生成树中。 解&#xff1a; 假装我们把边排序了&#xff0c;然后把所有边权小于给定边的边都加进去了。 那么我们要删的就是s到t的一个割。 最大…

robotframework基础学习(8)

变量的使用 在 Edit 标签页中主要分&#xff1a;加载外部文件、定义内部变量、定义元数据等三个部分。 &#xff08;1&#xff09;&#xff1a;加载外部文件Add Library&#xff1a;加载测试库&#xff0c;主要是[PYTHON 目录]\Lib\site-packages 里的测试库 Add Resource&…

[蓝桥杯]ALGO-188.算法训练_P0504

Anagrams指的是具有如下特性的两个单词&#xff1a;在这两个单词当中&#xff0c;每一个英文字母&#xff08;不区分大小写&#xff09;所出现的次数都是相同的。例如&#xff0c;Unclear和Nuclear、Rimon和MinOR都是Anagrams。编写一个程序&#xff0c;输入两个单词&#xff0…

beta第二天

团队成员 郑西坤 031602542 &#xff08;队长&#xff09; 陈俊杰 031602504陈顺兴 031602505张胜男 031602540廖钰萍 031602323雷光游 031602319吴志鸿 0316206341.昨天的困难 陈顺兴&#xff1a;无 廖钰萍&#xff1a;无 吴志鸿&#xff1a;没有 雷光游&#xff1a;无 郑西坤…

C语言符号

C语言运算符的优先级 一、运算符的优先级表 C 语言的符号众多&#xff0c;由这些符号又组合成了各种各样的运算符。既然是运算符就一定有其特定的优先级&#xff0c;下表就是C 语言运算符的优先级表&#xff1a; 注&#xff1a;同一优先级的运算符&#xff0c;运算次序由结合…

burp过期了,换一个

先从吾爱破解论坛下载工具&#xff1a;https://down.52pojie.cn/Tools/Network_Analyzer/Burp_Suite_Pro_v1.7.37_Loader_Keygen.zip 工具运行需要Java环境&#xff0c;请自行安装&#xff0c;此处不赘述。解压完后双击keygen 填一下License Text(随意)&#xff0c;然后点击Run…

hbase 概念

在hbase里面有几个通俗的名称会经常出现 1&#xff09;Hregion region 2&#xff09;Hregionserver regionserver 3&#xff09;Hmaster master 4&#xff09;Hmamstore memstore 5&#xff09;Hfile storeFile 1、什么是hbase&#xff1f; 1&#xff09;它是基于稀疏的、…

beta冲刺第三天

团队成员 郑西坤 031602542 &#xff08;队长&#xff09; 陈俊杰 031602504陈顺兴 031602505张胜男 031602540廖钰萍 031602323雷光游 031602319吴志鸿 0316206341.昨天的困难 陈顺兴&#xff1a;理解别人的代码 廖钰萍&#xff1a; 吴志鸿&#xff1a;无 雷光游&#xff1a; …

模块化

我那进了"模块化研究"小组.所以嘞.研究模块化以及如何让项目的模块化更加合理和高效是我们小组的主要目的.首先&#xff0c;在实行模块化之前,得先巩固模块化开发的理论基础,因为理论是实践的基础。只有这样&#xff0c;在过程中理论与实践相结合,才有可能达到最满意…

1566:基础练习 十六进制转八进制

题目地址&#xff1a;https://acmore.cc/problem/LOCAL/1566 1 #include <iostream>2 #include <string>3 4 using namespace std;5 6 string HexToBin(string s) //16进制转2进制7 {8 string str "";9 for (int i 0; i < s.size(); i) 10…

java命令--jmap命令使用(查找内存泄漏对象)

转自&#xff1a;https://www.cnblogs.com/kongzhongqijing/articles/3621163.html jdk安装后会自带一些小工具&#xff0c;jmap命令(Java Memory Map)是其中之一。主要用于打印指定Java进程(或核心文件、远程调试服务器)的共享对象内存映射或堆内存细节。 jmap命令可以获得运行…

tr069相关协议说明

截图自easycwmp官网&#xff1a;http://easycwmp.org/转载于:https://www.cnblogs.com/kiss-passion/p/10362029.html

Beta 冲刺(6/7)

队名 火箭少男100组长博客 林燊大哥作业博客 Beta 冲鸭鸭鸭&#xff01;成员冲刺阶段情况 林燊&#xff08;组长&#xff09; 过去两天完成了哪些任务 协调组内工作最终测试文稿编写展示GitHub当日代码/文档签入记录(组内共享)接下来的计划 协助开发组完成标签制作展示视频制作…

Android Bluetooth BLE相关开发资源汇总

Android开启蓝牙开关 转载自Android&#xff1a;Bluetooth 的打开和关闭 检查系统蓝牙是否开启 BluetoothManager bluetoothManager (BluetoothManager) this. getSystemService(Context.BLUETOOTH_SERVICE); BluetoothAdapter mBluetoothAdapter bluetoothManager.getAdapt…