SpringBoot整合持久层技术之搭建JDBCTemplate项目实战

简介: 现在有了MyBatis之后很少人使用JDBCTemplate来整合项目了,要么就是JPA技术,要么就是Mybatis来操作数据库,今天我搭建一个springboot的template项目,看看其和JPA、Mybatis有什么不同的地方,方便大家一起学习。

SpringBoot整合持久层技术之搭建SpringJDBCTemplate项目实战

现在有了MyBatis之后很少人使用JDBCTemplate来整合项目了,要么就是JPA技术,要么就是Mybatis来操作数据库,今天我搭建一个springboot的template项目,看看其和JPA、Mybatis有什么不同的地方,方便大家一起学习。

什么是JDBCTemplate

JdbcTemplate是Spring提供的一套JDBC模板框架,它主要就是利用AOP技术来解决直接使用JDBC时大量的重复代码的问题,JDBCTemplate虽然没有Mybais那么灵活,但是在处理JDBC上有了很大的一个提升,因为SpringBoot对JDBCTemplate的使用提供了自动化的配置类JdbcTemplateAutoConfiguration。

创建数据库和表

20200619215034472.png

这里是我创建的数据库和表,接下来就是创建SpringBoot项目,具体的创建方法看我上一篇文章:解读SpringBoot整合持久层技术之搭建并整合Spring Data JPA项目实战

pom.xml

引入的pom.xml文件如下所示:

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.1.9</version>
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
application.properties

然后就是数据库的配置,这里还是在application.properties中进行配置,具体的代码如下所示:

spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.url=jdbc:mysql://localhost:3306/book
spring.datasource.username=root
spring.datasource.password=root
Book实体类

创建Book实体

public class Book {
    private Integer id;
    private String name;
    private String author;
    private Float price;
    private String description;
//get与set自己加上哈
}
Dao层

数据库访问层

@Repository
public class BookMapper {
    @Autowired
    JdbcTemplate jdbcTemplate;
    public int addBook(Book book){
        return jdbcTemplate.update("INSERT INTO bookinfo (name,author,price,description) values (?,?,?,?)",book.getName(),book.getAuthor(),book.getPrice(),book.getDescription());
    }
    public int deleteBookById(Integer id){
        return jdbcTemplate.update("DELETE FROM bookinfo WHERE id=?",id);
    }
    public int updateBookById(Book book){
        return jdbcTemplate.update("update bookinfo set name=?,author=?,price=?,description=? where id=?",book.getName(),book.getAuthor(),book.getPrice(),book.getDescription(),book.getId());
    }
    public Book getBookById(Integer id){
        return jdbcTemplate.queryForObject("select * from bookinfo where id = ?",new BeanPropertyRowMapper<>(Book.class),id);
    }
    public List<Book> getAllBooks(){
        return jdbcTemplate.query("select * from book",new BeanPropertyRowMapper<>(Book.class));
    }
}

为什么 @Repository 只能标注在 DAO 类上呢?

这是因为该注解的作用不只是将类识别为Bean,同时它还能将所标注的类中抛出的数据访问异常封装为 Spring 的数据访问异常类型。 Spring本身提供了一个丰富的并且是与具体的数据访问技术无关的数据访问异常结构,用于封装不同的持久层框架抛出的异常,使得异常独立于底层的框架。


**注意:**增删改三种操作类型主要是采用update、batchUpdate方法来完成,query和queryObject是用来进行查询,execute方法可以用来执行任意的SQL,同时call方法可以用来调用存储过程。

特别提醒:当执行查询的操作时需要我们将查询出来的列和属性进行一个对应的操作,就用到了RowMapper,如何属性名和列名都是相同的,那么就可以直接使用BeanPropertyRoeMapper<>(Book.class)来进行实体的数据返回,如果属性名与数据库列名不同,就需要我们实现RowMapper的接口,将列名与实体名逐一对应起来。


BookService层
@Service
public class BookService {
    @Resource
    BookMapper bookMapper;
    public int addBook(Book book){
        return bookMapper.addBook(book);
    }
    public int updateBook(Book book){
        return bookMapper.updateBookById(book);
    }
    public Book getBookById(int id){
        return bookMapper.getBookById(id);
    }
    public int deleteBookById(int id){
        return bookMapper.deleteBookById(id);
    }
    public List<Book> getAllBooks(){
        return bookMapper.getAllBooks();
    }
}
BookController控制层

我咋感觉又回到了写ServletMVC那会了呢。。。

/**
 * @program: bokecms
 * @description: 这是一个bookController
 * @author: zjc
 **/
@RestController
public class BookController {
    @Autowired
    BookService bookService;
    @GetMapping("/bookOps")
    public void bookOps() {
        Book book = new Book();
        book.setName("java开发程序设计");
        book.setAuthor("no");
        book.setPrice(80F);
        book.setDescription("这书有点贵");
        int i = bookService.addBook(book);
        System.out.println("addbook---" + i);
        Book book2 = new Book();
        book2.setName("其他书籍");
        book2.setAuthor("张闲闲");
        book2.setId(29);
        int updateBook = bookService.updateBook(book2);
        System.out.println("updateBook-------" + updateBook);
        Book selectById = bookService.getBookById(27);
        System.out.println("selectById-------" + selectById);
        int deleteBook = bookService.deleteBookById(30);
        System.out.println("deleteById-----" + deleteBook);
        List<Book> getAllBooks = bookService.getAllBooks();
        System.out.println("getAllBooks----" + getAllBooks);
    }
}

这里我们进行一个增加,增加之后并修改,查看对应的id为27的数据,删除对应id为30的数据。启动项目,浏览器输入:http://localhost:8080/bookOps 查看后台打印输出:

addbook---1
updateBook-------1
selectById-------Book{id=27, name='狂人日记', author='鲁迅', price=23.0, description='null'}
deleteById-----1
2020-06-19 22:15:56.351 ERROR 2852 --- [nio-8080-exec-1] o.a.c.c.C.[.[.[/].[dispatcherServlet]    : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.springframework.jdbc.BadSqlGrammarException: StatementCallback; bad SQL grammar [select * from book]; nested exception is java.sql.SQLSyntaxErrorException: Table 'book.book' doesn't exist] with root cause
java.sql.SQLSyntaxErrorException: Table 'book.book' doesn't exist

太不仔细了,数据库写错了,应该是bookinfo,重新来一遍.

addbook---1
updateBook-------1
selectById-------Book{id=27, name='狂人日记', author='鲁迅', price=23.0, description='null'}
deleteById-----1
getAllBooks----[Book{id=1, name='呐喊', author='鲁迅', price=23.0, description='null'}, Book{id=2, name='朝花夕拾', author='鲁迅1', price=24.0, description='null'}, Book{id=3, name='简单生活学', author='鲁迅2', price=30.0, description='null'}, Book{id=4, name='XML基础与案例教程', author='鲁迅3', price=31.0, description='null'}, Book{id=5, name='物联网之源', author='鲁迅4', price=44.0, description='null'}, Book{id=27, name='狂人日记', author='鲁迅', price=23.0, description='null'}, Book{id=29, name='其他书籍', author='张闲闲', price=null, description='null'}, Book{id=32, name='java开发程序设计', author='张闲闲', price=80.0, description='这书有点贵'}]

ok 运行成功!!!希望小伙伴们能够支持一下,相互学习。

项目源码地址我一会附加上面,刚传上去,需要审核。如下:

SpringBoot整合持久层技术之搭建JDBCTemplate项目实战

相关文章
|
2月前
|
人工智能 自然语言处理 前端开发
SpringBoot + 通义千问 + 自定义React组件:支持EventStream数据解析的技术实践
【10月更文挑战第7天】在现代Web开发中,集成多种技术栈以实现复杂的功能需求已成为常态。本文将详细介绍如何使用SpringBoot作为后端框架,结合阿里巴巴的通义千问(一个强大的自然语言处理服务),并通过自定义React组件来支持服务器发送事件(SSE, Server-Sent Events)的EventStream数据解析。这一组合不仅能够实现高效的实时通信,还能利用AI技术提升用户体验。
245 2
|
21天前
|
JavaScript 安全 Java
java版药品不良反应智能监测系统源码,采用SpringBoot、Vue、MySQL技术开发
基于B/S架构,采用Java、SpringBoot、Vue、MySQL等技术自主研发的ADR智能监测系统,适用于三甲医院,支持二次开发。该系统能自动监测全院患者药物不良反应,通过移动端和PC端实时反馈,提升用药安全。系统涵盖规则管理、监测报告、系统管理三大模块,确保精准、高效地处理ADR事件。
|
2月前
|
Java 关系型数据库 MySQL
springboot学习四:springboot链接mysql数据库,使用JdbcTemplate 操作mysql
这篇文章是关于如何使用Spring Boot框架通过JdbcTemplate操作MySQL数据库的教程。
96 0
springboot学习四:springboot链接mysql数据库,使用JdbcTemplate 操作mysql
|
2月前
|
存储 Java API
简单两步,Spring Boot 写死的定时任务也能动态设置:技术干货分享
【10月更文挑战第4天】在Spring Boot开发中,定时任务通常通过@Scheduled注解来实现,这种方式简单直接,但存在一个显著的限制:任务的执行时间或频率在编译时就已经确定,无法在运行时动态调整。然而,在实际工作中,我们往往需要根据业务需求或外部条件的变化来动态调整定时任务的执行计划。本文将分享一个简单两步的解决方案,让你的Spring Boot应用中的定时任务也能动态设置,从而满足更灵活的业务需求。
183 4
|
2月前
|
存储 JSON 算法
JWT令牌基础教程 全方位带你剖析JWT令牌,在Springboot中使用JWT技术体系,完成拦截器的实现 Interceptor (后附源码)
文章介绍了JWT令牌的基础教程,包括其应用场景、组成部分、生成和校验方法,并在Springboot中使用JWT技术体系完成拦截器的实现。
142 0
JWT令牌基础教程 全方位带你剖析JWT令牌,在Springboot中使用JWT技术体系,完成拦截器的实现 Interceptor (后附源码)
|
3月前
|
存储 缓存 Java
在Spring Boot中使用缓存的技术解析
通过利用Spring Boot中的缓存支持,开发者可以轻松地实现高效和可扩展的缓存策略,进而提升应用的性能和用户体验。Spring Boot的声明式缓存抽象和对多种缓存技术的支持,使得集成和使用缓存变得前所未有的简单。无论是在开发新应用还是优化现有应用,合理地使用缓存都是提高性能的有效手段。
50 1
|
2月前
|
机器学习/深度学习 移动开发 自然语言处理
基于人工智能技术的智能导诊系统源码,SpringBoot作为后端服务的框架,提供快速开发,自动配置和生产级特性
当身体不适却不知该挂哪个科室时,智能导诊系统应运而生。患者只需选择不适部位和症状,系统即可迅速推荐正确科室,避免排错队浪费时间。该系统基于SpringBoot、Redis、MyBatis Plus等技术架构,支持多渠道接入,具备自然语言理解和多输入方式,确保高效精准的导诊体验。无论是线上医疗平台还是大型医院,智能导诊系统均能有效优化就诊流程。
|
2月前
|
JavaScript 前端开发 数据可视化
【SpringBoot+Vue项目实战开发】2020实时更新。。。。。。
【SpringBoot+Vue项目实战开发】2020实时更新。。。。。。
67 0
|
4月前
|
Java 数据库连接 数据库
告别繁琐 SQL!Hibernate 入门指南带你轻松玩转 ORM,解锁高效数据库操作新姿势
【8月更文挑战第31天】Hibernate 是一款流行的 Java 持久层框架,简化了对象关系映射(ORM)过程,使开发者能以面向对象的方式进行数据持久化操作而无需直接编写 SQL 语句。本文提供 Hibernate 入门指南,介绍核心概念及示例代码,涵盖依赖引入、配置文件设置、实体类定义、工具类构建及基本 CRUD 操作。通过学习,你将掌握使用 Hibernate 简化数据持久化的技巧,为实际项目应用打下基础。
343 0
|
4月前
|
Java 前端开发 Spring
技术融合新潮流!Vaadin携手Spring Boot、React、Angular,引领Web开发变革,你准备好了吗?
【8月更文挑战第31天】本文探讨了Vaadin与Spring Boot、React及Angular等主流技术栈的最佳融合实践。Vaadin作为现代Java Web框架,与其他技术栈结合能更好地满足复杂应用需求。文中通过示例代码展示了如何在Spring Boot项目中集成Vaadin,以及如何在Vaadin项目中使用React和Angular组件,充分发挥各技术栈的优势,提升开发效率和用户体验。开发者可根据具体需求选择合适的技术组合。
97 0