JdbcTemplate实现对数据库增删改查

步骤

  1. 导入Jar包

mysql-connector-java-8.0.28.jar:mysql数据库连接的相关依赖

spring-tx-5.2.6.RELEASE.jar:Spring对数据库事务操作封装的相关依赖

spring-jdbc-5.2.6.RELEASE.jar:Spring对数据库连接操作封装的相关依赖

spring-orm-5.2.6.RELEASE.jar:Spring整合其他框架如Mybatis、Template需要用到的依赖。

druid-1.1.9.jar:德鲁伊连接池依赖

  1. 在Spring配置文件中配置数据库连接池
    <context:property-placeholder location="JDBC.properties"></context:property-placeholder>

    <bean id="DruidDataSource" class="com.alibaba.druid.pool.DruidDataSource">
<property name="driverClassName" value="${p.driverClassName}"></property>
<property name="url" value="${p.url}"></property>
<property name="username" value="${p.username}"></property>
<property name="password" value="${p.password}"></property>
</bean>
  1. 配置JdbcTemplate对象,并注入DataSource

xml

    <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
<property name="driverClassName" value="${p.driverClassName}"></property>
<property name="url" value="${p.url}"></property>
<property name="username" value="${p.username}"></property>
<property name="password" value="${p.password}"></property>
</bean> <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="dataSource"></property>
</bean>

BookDaoImpl

@Repository
public class BookDaoImpl implements BookDao {
@Autowired
@Qualifier(value = "jdbcTemplate")
private JdbcTemplate jdbcTemplate;
@Override
public int add(Book book) {
String sql = "insert into book(book_name, book_author) values (?, ?)";
int result = jdbcTemplate.update(sql, book.getBookName(), book.getAuthor());
return result;
}
  1. 创建service和dao类,在service注入Dao,然后在dao里注入JdbcTemplate进行数据库操作
@Service
public class BookService {
@Autowired
private BookDao bookDao; public void add(Book book) {
bookDao.add(book);
} public BookDao getBookDao() {
return bookDao;
} public void setBookDao(BookDao bookDao) {
this.bookDao = bookDao;
}

BookDao

public interface BookDao {
int add(Book book);
}
  1. 测试
@Test
public void test() {
ApplicationContext context =
new ClassPathXmlApplicationContext("bean.xml");
BookService bookService = (BookService) context.getBean("bookService");
// System.out.println(bookService.bookDao);
Book book = new Book();
book.setBookName("黑猫");
book.setAuthor("爱·伦坡");
bookService.add(book);
}

修改和删除

BookDaoImpl

@Repository
public class BookDaoImpl implements BookDao {
@Autowired
@Qualifier(value = "jdbcTemplate")
private JdbcTemplate jdbcTemplate; @Override
public int add(Book book) {
String sql = "insert into book(book_name, book_author) values (?, ?)";
int result = jdbcTemplate.update(sql, book.getBookName(), book.getAuthor());
return result;
} @Override
public int modify(int id, Book book) {
String sql = "update book set book_name=?, book_author=? where book_id=?";
int result = jdbcTemplate.update(sql, book.getBookName(), book.getAuthor(), id);
return result;
} @Override
public int delete(int id) {
String sql = "delete from book where book_id=?";
int result = jdbcTemplate.update(sql, id);
return result;
} @Override
public int findCount() {
String sql = "select count(*) from book";
int result = jdbcTemplate.queryForObject(sql, Integer.class);
return result;
} @Override
public Book findOne(int id) {
String sql = "SELECT book_name bookName, book_author author FROM book WHERE book_id = ?";
Book book = jdbcTemplate.queryForObject(sql, new BeanPropertyRowMapper<Book>(Book.class), id);
return book;
} @Override
public List<Book> findAll() {
String sql = "select book_name bookName, book_author author from book";
List<Book> list = jdbcTemplate.query(sql, new BeanPropertyRowMapper<Book>(Book.class));
return list;
} }

BookDao

public interface BookDao {
int add(Book book);
int modify(int id, Book book);
int delete(int id);
}

BookService

@Service
public class BookService {
@Autowired
private BookDao bookDao;
public void add(Book book) {
bookDao.add(book); public void modifyBook(int id, Book book) {
bookDao.modify(id, book);
} public void deleteBook(int id) {
bookDao.delete(id);
}
}

测试

@Test
public void test() {
ApplicationContext context =
new ClassPathXmlApplicationContext("bean.xml");
BookService bookService = (BookService) context.getBean("bookService");
// Book book = new Book();
// book.setBookName("白夜行");
// book.setAuthor("东野圭吾");
// bookService.add(book);
bookService.deleteBook(4);
} @Test
public void test2() {
ApplicationContext context =
new ClassPathXmlApplicationContext("bean.xml");
BookService bookService = (BookService) context.getBean("bookService"); Book book = new Book();
book.setBookName("ABC谋杀案");
book.setAuthor("阿加莎·克里斯蒂"); bookService.modifyBook(2, book);
}

返回聚合函数的某个值:public T queryForObject(String sql, Class requiredType)

        @Override
public int findCount() {
String sql = "select count(*) from book";
int result = jdbcTemplate.queryForObject(sql, Integer.class);
return result;
}

查询返回某个对象:public T queryForObject(String sql, RowMapper rowMapper, @Nullable Object... args)

rowMapper是一个接口,new BeanPropertyRowMapper(Book.class)为其接口实现类

@Override
public Book findOne(int id) {
String sql = "SELECT book_name bookName, book_author author FROM book WHERE book_id = ?";
Book book = jdbcTemplate.queryForObject(sql, new BeanPropertyRowMapper<Book>(Book.class), id);
return book;
}

这里sql语句中对字段加入了别名,防止数据库字段名与类名不一致,实际上方法实现了对属性映射的封装,使得能够根据属性名和值得到一个实例

返回集合:public List query(String sql, RowMapper rowMapper)

@Override
public List<Book> findAll() {
String sql = "select book_name bookName, book_author author from book";
List<Book> list = jdbcTemplate.query(sql, new BeanPropertyRowMapper<Book>(Book.class));
return list;
}

JdbcTemplate实现批量添加功能:

public int[] batchAdd(List<Object[]> batchArgs),Object数组元素为包含多个字段的一个记录

BookDaoImpl

    @Override
public int[] batchAdd(List<Object[]> batchArgs) {
String sql = "insert into book(book_name, book_author) values (?, ?)";
int[] is = jdbcTemplate.batchUpdate(sql, batchArgs);
return is;
}

测试

    @Test
public void batchAddTest() {
List<Object[]> list = new ArrayList<>();
Object[] o1 = {"米泽穗信", "冰菓"};
Object[] o2 = {"有栖川有栖", "孤岛之谜"};
Object[] o3 = {"岛田庄司", "斜屋犯罪"};
list.add(o1);
list.add(o2);
list.add(o3); ApplicationContext context =
new ClassPathXmlApplicationContext("bean.xml");
BookService bookService = context.getBean("bookService", BookService.class);
int[] is = bookService.batchAdd(list);
System.out.println(Arrays.toString(is));
}

【Spring5】JdbcTemplate的更多相关文章

  1. 【spring】jdbcTemplate之sql参数注入

    demo @Repository("jdbcDao") public class JdbcTemplateDao { @Autowired private JdbcTemplate ...

  2. 【Spring】JdbcTemplate的使用,查询,增、删、改

    数据库名:taobaodb 配置文件: JdbcTemplate主要提供以下五类方法: execute方法:可以用于执行任何SQL语句,一般用于执行DDL语句: update方法及batchUpdat ...

  3. 【spring】(填坑)sql注入攻击 - 持久层参数化

    结果   填坑失败,并没有看懂是如何检测sql攻击的. 只能说的是: 建议都使用参数化传递sql语句参数.(所以,用hibernate.mybatis等框架的真不用太担心sql攻击问题.) 前言 本文 ...

  4. 【转载】Spring JdbcTemplate详解

    JdbcTemplate简介 Spring对数据库的操作在jdbc上面做了深层次的封装,使用spring的注入功能,可以把DataSource注册到JdbcTemplate之中. JdbcTempla ...

  5. 【ssm】spring功能讲解

    概览 Spring5框架包含许多特性,负责管理项目中的所有对象,并被很好地组织在下图所示的模块中 核心容器:由spring-beans.spring-core.spring-context.sprin ...

  6. 【转】Spring学习---Bean配置的三种方式(XML、注解、Java类)介绍与对比

    [原文]https://www.toutiao.com/i6594205115605844493/ Spring学习Bean配置的三种方式(XML.注解.Java类)介绍与对比 本文将详细介绍Spri ...

  7. 框架整合小小总结【SSH】注解式

    Spring 注解式注册 bean: 大致分为以下几步: 开启 context 空间支持 开启自动扫描功能,指定扫描包路径 使用注解配置 bean (使用@Component 注解) 给 bean 注 ...

  8. 【Spring】Junit加载Spring容器作单元测试(整理)

    [Spring]Junit加载Spring容器作单元测试 阅读目录 >引入相关Jar包 > 配置文件加载方式 > 原始的用法 > 常见的用法 > 引入相关Jar包 一.均 ...

  9. 【Spring】编程式事务和声明式事务

    一.概述 二.准备工作 1. 创建表 2. 创建项目并引入Maven依赖 3. 编写实体类 4. 编写Dao层 5. 业务层 6. XML中的配置 7. 测试 三.编程式事务 1. 在业务层代码上使用 ...

  10. springboot知识点【笔记】

    # **一.**Spring Boot 入门 ## 1.Spring Boot 简介 > 简化Spring应用开发的一个框架:>> 整个Spring技术栈的一个大整合:>> ...

随机推荐

  1. 龙中华著《Spring Boot实战派》读书笔记之入门篇

    第一章 进入Spring Boot的世界 理念:默认大于配置.有很多集成好的方案,开箱即用.针对痛点:环境配置耗时. 1.1 Spring Boot 的特色: 使用简单 注解方式实现类的定义和功能开发 ...

  2. python2 selenium

    参考blog: https://www.cnblogs.com/xiaozhiblog/p/5378723.html http://www.cnblogs.com/fnng/ 一.项目结构介绍 下面逐 ...

  3. MySQL使用bin-log将数据恢复到某个时间点

    binlog的三种模式 statement:记录每一条修改数据的sql row:保存哪条记录被修改 mixed:兼顾前两者的优点. # 查看binlog有没有开启 SHOW VARIABLES LIK ...

  4. 2020/03/24 HTML基础复习笔记

    2020-03-24 15:49:30 下午好! 这是我开通博客的第二天也是在钉钉上网课的又一天,为了应对考试现在复习到了HTML基础知识,本打算用VS敲想了想还是用了XMind(真的好用!!!)文件 ...

  5. springboot中redis使用和工具

    application.properties #Redis相关配置 spring.data.redis.host=localhost #端口 spring.data.redis.port=6379 # ...

  6. 西电oj245 成绩统计 结构体数组使用

    #include<stdio.h> struct student{ //定义一个结构体数组 int num; char name[11]; float g1; float g2; floa ...

  7. c# Visual Studio|There is no editor available for ***,make sure the application for the file type(.vb) is installed问题解决方法

    这个问题出现在在使用VS编码当中,电脑意外关机,导致的文件的缺失或者损坏. 使用反编译软件(如:ILSpy)对编译后的 .EXE文件进行反编译,在翻遍的结果中将相关代码拷贝至目标路径下,替换所需文件. ...

  8. nginx学习之路

    nginx反向代理服务器 1.技术选型 nginx主要能实现的功能有负载均衡,反向代理,动静分离.选择nginx主要为了实现反向代理以及负载均衡功能, *为什么要实现反向代理 传统项目直接暴露在外网入 ...

  9. (3)这是一个简单的html页面,请保持为字符串,完成后面的计算要求。

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  10. OSPF v3与v2的区别