JDBCTemplate执行增删改查(CDUR)操作
1、JdbcTemplate简介
(1)Spring提供的一个操作数据库的技术JdbcTemplate,是对Jdbc的封装。语法风格非常接近DBUtil。
- JdbcTemplate可以直接操作数据库,加快效率,而且学这个JdbcTemplate也是为声明式事务做准备,毕竟要对数据库中的数据进行操纵!
- JdbcTemplate中并没有提供一级缓存,以及类与类之间的关联关系!就像是spring提供的一个DBUtils。
- Spring对数据库的操作使用JdbcTemplate来封装JDBC,结合Spring的注入特性可以很方便的实现对数据库的访问操作。使用JdbcTemplate可以像JDBC一样来编写数据库的操作代码
(2)为啥要使用Jdbc_template进行开发呢?
- Spring对数据库的操作在jdbc上面做了深层次的封装,使用spring的注入功能,可以把DataSource注册到JdbcTemplate之中。
- Spring提供的JdbcTemplate对jdbc做了封装,大大简化了数据库的操作。
找到Spring JdbcTemplate源码,可以看到如下方法:
Connection con = DataSourceUtils.getConnection(getDataSource());
如果直接使用JDBC的话,需要我们加载数据库驱动、创建连接、释放连接、异常处理等一系列的动作;繁琐且代码看起来不直观。
此外,Spring提供的JdbcTempate能直接数据对象映射成实体类,不再需要获取ResultSet去获取值/赋值等操作,提高开发效率;
如下:return (User) jdbcTemplate.queryForObject("select * from tb_test1 where id = 100", User.class)
(3)配置环境
①导入jar包
- IOC容器需要的jar包-------------------------资源目录--->jar包资源--->Spring相关jar包
- commons-logging-1.1.3.jar
- spring-aop-4.0.0.RELEASE.jar //注解会使用到的包
- spring-beans-4.0.0.RELEASE.jar
- spring-context-4.0.0.RELEASE.jar
- spring-core-4.0.0.RELEASE.jar
- spring-expression-4.0.0.RELEASE.jar
- MySQL驱动、C3P0jar包-------------------------资源目录--->jar包资源-->c3p0-0.9.1.2jar包和mysqlConnection jar包
- c3p0-0.9.1.2.jar
- mysql-connector-java-5.1.42-bin.jar
- JdbcTemplate需要的jar包-------------------------资源目录--->jar包资源-->JdbcTemplate相关jar包
- spring-jdbc-4.0.0.RELEASE.jar
- spring-orm-4.0.0.RELEASE.jar
- spring-tx-4.0.0.RELEASE.jar
②在IOC容器中配置数据源
<!-- 加载properties文件中 信息 -->
<context:property-placeholder location="classpath:jdbc.properties"/>
<!-- 配置数据源 -->
<bean id="comboPooledDataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="user" value="${jdbc.user}"></property>
<property name="password" value="${jdbc.passowrd}"></property>
<property name="jdbcUrl" value="${jdbc.url}"></property>
<property name="driverClass" value="${jdbc.driver}"></property>
</bean>
其中jdbc.properties文件内容:
- jdbc.user=root
- jdbc.passowrd=mysql
- jdbc.url=jdbc:mysql://localhost:3306/test
- jdbc.driver=com.mysql.jdbc.Driver
③在IOC容器(applicationContext.xml)中配置JdbcTemplate对象的bean,并将数据源对象装配到JdbcTemplate对象中
<!-- 配置JdbcTemplate对应的bean, 并装配dataSource数据源属性-->
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="comboPooledDataSource"></property>
</bean>
2、案例演示
(1)首先,新建数据库 jdbc_template,新建表 employee,并插入几条测试数据
USE `jdbc_template`;
DROP TABLE IF EXISTS `employee`;
CREATE TABLE `employee` (
`emp_id` int(11) NOT NULL AUTO_INCREMENT,
`emp_name` char(100) DEFAULT NULL,
`salary` double DEFAULT NULL,
PRIMARY KEY (`emp_id`)
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=gb2312;
将数据库连接信息改为:jdbc.url=jdbc:mysql://localhost:3306/jdbc_template
(2)在bean包下新建 Employee.java
public class Employee {
private Integer emp_id;
private String emp_name;
private Double salary;
public Employee() {
super();
}
public Employee(Integer emp_id, String emp_name, double salary) {
super();
this.emp_id = emp_id;
this.emp_name = emp_name;
this.salary = salary;
}
public int getEmp_id() {
return emp_id;
}
public void setEmp_id(int emp_id) {
this.emp_id = emp_id;
}
public String getEmp_name() {
return emp_name;
}
public void setEmp_name(String emp_name) {
this.emp_name = emp_name;
}
public double getSalary() {
return salary;
}
public void setSalary(double salary) {
this.salary = salary;
}
@Override
public String toString() {
return "Employee [emp_id=" + emp_id + ", emp_name=" + emp_name + ", salary=" + salary + "]";
}
}
Employee.java
(3)新建JUnit测试类进行测试 TestJdbcTemp.java
public class TestJdbcTemp {
//声明两个对象ioc和JdbcTemplate
private ApplicationContext ioc = new ClassPathXmlApplicationContext("applicationContext.xml");
private JdbcTemplate template = ioc.getBean(JdbcTemplate.class);
}
① 测试数据源 DataSource
@Test
public void testDataSource() {
DataSource bean = ioc.getBean(DataSource.class);
try {
System.out.println(bean.getConnection());//com.mchange.v2.c3p0.impl.NewProxyConnection@223aa2f7
} catch (SQLException e) {
e.printStackTrace();
}
}
② 将emp_id=5的记录的salary字段更新为1300.00【更新操作】
@Test
public void testUpdate() {
String sql = "UPDATE employee SET salary = ? WHERE emp_id = ?";
template.update(sql, 1300, 5);//第一个是sql语句,后面的按着顺序传入参数即可,update方法能接收的可变参数!
}
可以看到,该操作不用我们自己再去获取数据库连接信息了,而是直接传递sql语句及其参数就可以了!
③ 批量插入
@Test
public void testBatch() {
String sql = "INSERT INTO employee(`emp_name`,`salary`) VALUES(?,?)";
// 执行sql语句需要传递的参数
List<Object[]> list = new ArrayList<Object[]>();
list.add(new Object[] { "Tom2015", 1000 });
list.add(new Object[] { "Tom2016", 2000 });
list.add(new Object[] { "Tom2017", 3000 });
template.batchUpdate(sql, list);
}
④ 查询emp_id=5的数据库记录,封装为一个Java对象返回,
分析:封装为一个对象返回的话,首先我们需要有一个与数据表对应的实体类!
@Test
public void testFindById(){
//需要注意的是:sql语句中的别名要与对应实体类的属性名保持一致!ps:这里不用别名也可以
String sql = "SELECT emp_id AS emp_id,emp_name AS emp_name,salary FROM employee WHERE emp_id=?";
//RowMapper是一个接口,我们使用其子类,把查出来的数据封装成一个bean对象
RowMapper<Employee> rowMapper = new BeanPropertyRowMapper<Employee>(Employee.class);
//最后一个参数是可变参数,用于向sql语句中依次传递参数!
Employee employee = template.queryForObject(sql, rowMapper, 5);
System.out.println(employee);//Employee [emp_id=5, emp_name=Kasier, salary=1300.0]
}
⑤ 查询salary>4000的数据库记录,封装为List集合返回
@Test
public void testEmployeeList(){
//需要注意的是:sql语句中的别名要与对应实体类的属性名保持一致!ps:这里不用别名也可以
String sql = "SELECT emp_id AS emp_id,emp_name AS emp_name,salary FROM employee WHERE salary > ?";
//RowMapper是一个接口,这里我们使用其子类,把查出来的数据封装成一个bean对象
RowMapper<Employee> rowMapper = new BeanPropertyRowMapper<Employee>(Employee.class);
//该query方法查询出来的是一个list列表,query方法的最后一个参数是可变参数!
List<Employee> list = template.query(sql, rowMapper, 4000);
for (Employee employee : list) {
System.out.println(employee);
//Employee [emp_id=1, emp_name=Susan, salary=5000.23]
//Employee [emp_id=2, emp_name=Julian, salary=4234.77]
//Employee [emp_id=3, emp_name=Papu, salary=9034.51]
//Employee [emp_id=4, emp_name=Babala, salary=8054.33]
//Employee [emp_id=6, emp_name=Owen, salary=7714.11]
}
}
查询结果是一个实体还是一个list列表是靠template对象的不同方法实现的!
⑥ 查询最大salary【返回单值】
@Test
public void testMaxSalary(){
String sql = "SELECT MAX(salary) FROM employee";
//需要指定返回值的类型,而且类型必须是包装类型,可带可变参数
Double maxSalary = template.queryForObject(sql, Double.class);
System.out.println(maxSalary);//9034.51
}
⑦ 使用带有具名参数的SQL语句插入一条员工记录,并以Map形式传入参数值
具名参数:是指基于名称的,前面我们使用的都是用?作为占位符,然后是使用基于位置的
如果要使用具名参数的sql语句就必须在spring配置文件中配置NamedParameterJdbcTemplat这个模板类,而不能使用原来的JdbcTemplate,因为JdbcTemplate不能完成这样的任务!
在 applicationContext.xml 中新增配置信息
<!-- 加载properties文件中的信息 -->
<context:property-placeholder location="classpath:jdbc.properties" />
<!-- 配置数据源 -->
<bean id="comboPooledDataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass" value="${jdbc.driver}"></property>
<property name="jdbcUrl" value="${jdbc.url}"></property>
<property name="user" value="${jdbc.user}"></property>
<property name="password" value="${jdbc.password}"></property>
</bean>
<!-- 配置JdbcTemplate对应的bean, 并装配dataSource数据源属性-->
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="comboPooledDataSource"></property>
</bean>
<!-- 为了执行带有具名参数的SQL语句,需要配置NamedParameterJdbcTemplate -->
<!-- 该NamedParameterJdbcTemplate类没有无参构造器,需要传入JdbcTemplate对象或者数据源对象[DataSource] -->
<bean id="namedParameterJdbcTemplate" class="org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate">
<!-- 不能使用property标签配置哦 -->
<constructor-arg ref="jdbcTemplate"></constructor-arg>
</bean>
测试
@Test
public void testParam(){
String sql="INSERT INTO employee VALUES(null,:paramName,:paramSalary)";
Map<String,Object> paramMap = new HashMap<String,Object>();
paramMap.put("paramName","LiMing" );
paramMap.put("paramSalary",1000);
namedJdbcTemplate.update(sql, paramMap);
}
⑧ 重复实验 ⑦,以 SqlParameterSource 形式传入参数值
@Test
public void testParameterSource(){
String sql="INSERT INTO employee(`emp_name`,`salary`) VALUES(:emp_name,:salary)";
//该BeanPropertySqlParameterSource类构造器需要一个对象参数,该对象参数是一个封装了sql语句参数的对象!
//此时要求对象的属性名要和sql中的参数名保持一致!这里我们使用Employee对象来完成
Employee employee= new Employee(null, "Danny", 1500);
//以实体对象的形式封装具名参数和值
SqlParameterSource source = new BeanPropertySqlParameterSource(employee);
namedJdbcTemplate.update(sql, source);
}
⑨ 创建 EmployeeDao,自动装配 JdbcTemplate 对象
创建 EmployeeDao 类
@Repository//加载到IOC容器
public class EmployeeDao {
@Autowired//注入JdbcTemplate对象
private JdbcTemplate jdbcTemplate;
//更新工资,加1000元
public void updateSaraly(Integer id){
String sql = "update employee set salary=salary+1000 where emp_id=?";
jdbcTemplate.update(sql, id);
}
//查询所有员工信息
public List<Employee> findAll(){
String sql = "select * from employee";
RowMapper<Employee> rowMapper = new BeanPropertyRowMapper<Employee>(Employee.class);
return jdbcTemplate.query(sql, rowMapper);
}
}
配置spring的配置文件的配置文件 applicationContext.xml
<!-- 配置扫描的包 -->
<context:component-scan base-package="com.bwlu.dao"></context:component-scan>
<!-- 加载properties文件中的信息 -->
<context:property-placeholder location="classpath:jdbc.properties"/>
<!-- 配置数据源 -->
<bean id="comboPooledDataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="user" value="${jdbc.user}"></property>
<property name="password" value="${jdbc.passowrd}"></property>
<property name="jdbcUrl" value="${jdbc.url}"></property>
<property name="driverClass" value="${jdbc.driver}"></property>
</bean>
<!-- 配置JdbcTemplate对应的bean,并装配dataSource数据源属性-->
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="comboPooledDataSource"></property>
</bean>
测试Dao
@Test
public void testUpdateSalary(){
EmployeeDao employeeDao = ioc.getBean(EmployeeDao.class);
employeeDao.updateSaraly(11);
}
@Test
public void testFindAll(){
EmployeeDao employeeDao = ioc.getBean(EmployeeDao.class);
List<Employee> list = employeeDao.findAll();
for (Employee employee : list) {
System.out.println(employee);
}
}
JDBCTemplate执行增删改查(CDUR)操作的更多相关文章
- JdbcTemplate实现增删改查操作
JdbcTemplate介绍 为了使 JDBC 更加易于使用,Spring 在 JDBCAPI 上定义了一个抽象层, 以此建立一个JDBC存取框架,Spring Boot Spring Data-JP ...
- 用dom4j解析xml文件并执行增删改查操作
转自:https://www.aliyun.com/jiaocheng/1339446.html xml文件: <?xml version="1.0" encoding=&q ...
- 学习MyBatis必知必会(5)~了解myBatis的作用域和生命周期并抽取工具类MyBatisUtil、mybatis执行增删改查操作
一.了解myBatis的作用域和生命周期[错误的使用会导致非常严重的并发问题] (1)SqlSessionFactoryBuilder [ 作用:仅仅是用来创建SqlSessionFactory,作用 ...
- spring学习(四)spring的jdbcTemplate(增删改查封装)
Spring的jdbcTemplate操作 1.Spring框架一站式框架 (1)针对javaee三层,每一层都有解决技术 (2)到dao 层,使用 jdbcTemplate 2.Spring对不同的 ...
- 使用DOM进行xml文档的crud(增删改查)操作<操作详解>
很多朋友对DOM有感冒,这里我花了一些时间写了一个小小的教程,这个能看懂,会操作了,我相信基于DOM的其它API(如JDOM,DOM4J等)一般不会有什么问题. 后附java代码,也可以下载(可点击这 ...
- 使用控制台对Redis执行增删改查命令
使用控制台对Redis执行增删改查命令 在上一篇里,我们已经安装了redis.这一篇我们将一起来学习如何使用"控制台"管理Redis 首先肯定是打开一个控制台,在windows系统 ...
- mysql增删改查相关操作
mysql增删改查相关操作 以前用mysql用的少,对于数据库相关的操作不熟悉,现在开始要接触数据库了,记录一下相关的基础操作吧. 1.数据库的授权操作 # mysql -u root -p Ente ...
- ssm 框架实现增删改查CRUD操作(Spring + SpringMVC + Mybatis 实现增删改查)
ssm 框架实现增删改查 SpringBoot 项目整合 一.项目准备 1.1 ssm 框架环境搭建 1.2 项目结构图如下 1.3 数据表结构图如下 1.4 运行结果 二.项目实现 1. Emplo ...
- BaseDao代码,用于连接数据库实行增删改查等操作
在学习JavaWeb时会用到此代码,用于实行增删改查操作 1 package com.bdqn.dao; import java.sql.Connection; import java.sql.Dri ...
随机推荐
- 编写高质量代码--改善python程序的建议(三)
原文发表在我的博客主页,转载请注明出处! 建议十三:警惕eval()的安全漏洞 相信经常处理文本数据的同学对eval()一定是欲罢不能,他的使用非常简单: eval("1+1==2" ...
- ajax 传递数组类型参数后台接收不到的问题
在做排序功能的时候需要将一个数组的数据传递到后台,(当时怎么没用json,如果用json就没有那么多的事情了),数据提交采用ajax! 先看代码 js: submitbtn: function () ...
- 【BZOJ3166】[Heoi2013]Alo 可持久化Trie树+set
[BZOJ3166][Heoi2013]Alo Description Welcome to ALO ( Arithmetic and Logistic Online).这是一个VR MMORPG , ...
- 爬虫实战【10】利用Selenium自动登陆京东签到领金币
今天我们来讲一下如何通过python来实现自动登陆京东,以及签到领取金币. 如何自动登陆京东? 我们先来看一下京东的登陆页面,如下图所示: [插入图片,登陆页面] 登陆框就是右面这一个框框了,但是目前 ...
- 【微信】QQ邮箱助手不提醒解决
1.问题及原因: 微信上的QQ邮箱提醒功能失效了,收到信后不提醒.忘了是使用了TIM,还是使用了QQ邮箱之后才出现的. 不过原因是:QQ邮箱提醒被设置为仅在QQ邮箱客户端提醒 2.解决: 重新安装QQ ...
- 改变label中的某字体颜色
NSString *allString=@"你家在哪里,需要我送你么"; NSString *subString=@"在哪里"; UILabel *string ...
- python array
python中通常情况下for循环会枚举各个元素不会访问下标,例如: l = [1,2,4,6] for val in l: print l 但是有时候我们会需要在便利数组的同时访问下标,这时候可以借 ...
- Java基础语法 - 面向对象 - 局部变量
如果在一个成员方法内定义一个变量,那么这个变量就被称为局部变量. 局部变量在方法执行时被创建,在方法执行结束时被销毁.局部变量在使用时必须进行赋值操作或被初始化,否则会出现编译错误 package m ...
- 我的Android进阶之旅------>Android Studio使用statistics插件统计项目代码总行数
今天公司说要统计一下项目总共了多少行代码,于是上网看了一下使用statistic插件可以统计代码总行数,下面给大家分享一下 ! 1.下载[statistic]插件 首先当然要把名为[statistic ...
- sql server自动化运维脚本
数据库运维中盛传一个小段子,我误删除了数据库,改怎么办?有备份还原备份,没有备份就准备简历!听起来有趣但发生在谁身上,谁都笑不起来.接触了很多的客户发现90%客户的运维策略都不是很完善.本篇就分享一些 ...