【Spring5】JdbcTemplate
JdbcTemplate实现对数据库增删改查
步骤
- 导入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:德鲁伊连接池依赖
- 在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>
- 配置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;
}
- 创建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);
}
- 测试
@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的更多相关文章
- 【spring】jdbcTemplate之sql参数注入
demo @Repository("jdbcDao") public class JdbcTemplateDao { @Autowired private JdbcTemplate ...
- 【Spring】JdbcTemplate的使用,查询,增、删、改
数据库名:taobaodb 配置文件: JdbcTemplate主要提供以下五类方法: execute方法:可以用于执行任何SQL语句,一般用于执行DDL语句: update方法及batchUpdat ...
- 【spring】(填坑)sql注入攻击 - 持久层参数化
结果 填坑失败,并没有看懂是如何检测sql攻击的. 只能说的是: 建议都使用参数化传递sql语句参数.(所以,用hibernate.mybatis等框架的真不用太担心sql攻击问题.) 前言 本文 ...
- 【转载】Spring JdbcTemplate详解
JdbcTemplate简介 Spring对数据库的操作在jdbc上面做了深层次的封装,使用spring的注入功能,可以把DataSource注册到JdbcTemplate之中. JdbcTempla ...
- 【ssm】spring功能讲解
概览 Spring5框架包含许多特性,负责管理项目中的所有对象,并被很好地组织在下图所示的模块中 核心容器:由spring-beans.spring-core.spring-context.sprin ...
- 【转】Spring学习---Bean配置的三种方式(XML、注解、Java类)介绍与对比
[原文]https://www.toutiao.com/i6594205115605844493/ Spring学习Bean配置的三种方式(XML.注解.Java类)介绍与对比 本文将详细介绍Spri ...
- 框架整合小小总结【SSH】注解式
Spring 注解式注册 bean: 大致分为以下几步: 开启 context 空间支持 开启自动扫描功能,指定扫描包路径 使用注解配置 bean (使用@Component 注解) 给 bean 注 ...
- 【Spring】Junit加载Spring容器作单元测试(整理)
[Spring]Junit加载Spring容器作单元测试 阅读目录 >引入相关Jar包 > 配置文件加载方式 > 原始的用法 > 常见的用法 > 引入相关Jar包 一.均 ...
- 【Spring】编程式事务和声明式事务
一.概述 二.准备工作 1. 创建表 2. 创建项目并引入Maven依赖 3. 编写实体类 4. 编写Dao层 5. 业务层 6. XML中的配置 7. 测试 三.编程式事务 1. 在业务层代码上使用 ...
- springboot知识点【笔记】
# **一.**Spring Boot 入门 ## 1.Spring Boot 简介 > 简化Spring应用开发的一个框架:>> 整个Spring技术栈的一个大整合:>> ...
随机推荐
- CentOS7 进入修复模式的办法
有时候配置Centos文件修改错误会导致系统无法登录,可以通过修复模式进行单用户运行模式,进行修复. 具体操作如下: 1.重启服务器,在选择内核界面使用上下箭头移动 2.选择内核并按"e&q ...
- 【CSS】CSS字体图标iconfont
CSS字体图标iconfont展示的是图标,本质上还是字体 使用字体图标步骤: 字体图标的下载 将字体图标引入到HTML 字体图标的追加(以后添加新的小图标) 推荐下载网站 icomoon字库http ...
- 微信小程序 图片预览 wx.previewImage
官网地址: go官网 效果展示: list: [ 'http://img5.imgtn.bdimg.com/it/u=3300305952,1328708913&fm=26&gp=0. ...
- Spring整合Redis学习笔记
1 Spring-Data-Redis 1.1 Spring-Data-Redis简介 Spring-Data-Redis(简称SDR)对Redis的Key-Value数据存储操作提供了更高层次的 ...
- java相关部分配置
一.mybatis逆向工程 ① generator.properties jdbc.driverLocation=D:/testDir/Maven/repository_g/mysql/mysql-c ...
- python之自动化连连看脚本-第二关下移-小记
(如想转载,请联系博主或贴上本博地址) 参考前一篇基础上,做出第二关下移逻辑判断,写的比较啰嗦. 下移和第一关不动基础代码是一样的.需要注意同列下移和不同列下移2种情况,同列下移需要注意相邻的2个和不 ...
- Kotlin 基础
Kotlinbase.kt @file:JvmName("kotlinbaseTest") import kotlin.math.roundToInt as atoInt fun ...
- Javaweb学习笔记第十六弹--Vue、Element
Vue(一套前端框架,MVVM主要用于实现数据的双向绑定) Vue快速入门 //新建HTML页面,引入Vue.js文件 <script src="js.Vue.js"> ...
- 499div2-E Border :裴蜀定理
这个定理就像类似学扩展欧几里得判断是否有解的条件,当时是ax+by = c:仅当c = k*gcd(a,b)时有解,其实也就是只要是公约数的倍数就行. 而裴蜀定理是多个未知量x1*a1+x2*a2+. ...
- 「学习笔记」平衡树基础:Splay 和 Treap
「学习笔记」平衡树基础:Splay 和 Treap 点击查看目录 目录 「学习笔记」平衡树基础:Splay 和 Treap 知识点 平衡树概述 Splay 旋转操作 Splay 操作 插入 \(x\) ...