Springboot集成jdbcTemplate过程解析

一 说明

实际工作中其实很少会用到jdbcTemplate去操作数据库,因为其使用方式不是很灵活,sql的拼接能力不强;实际上jdbcTemplate是属于spring自带的数据层模板,在spring中可以说是比较失败的一个案例,原因是当代流行mybatis当做持久层访问数据库,其优越的sql拼接能力、动态sql、半自动化映射、和易于sql优化的特性,深受广大互联网公司的喜爱,并且mybatis的市场占有率不断的上升,hibernate的市场不断缩水,可以说hibernate已经这种强映射关系的持久层模型已经走到互联网时代的尽头了。

本文写jdbcTemplate只是当作大家的一个入门学习,可以说以后你很难用到这门技术,所以不会深入研究,有兴趣的朋友可以专栏我其他关于springboot的集成系列。本次演示使用jdk1.8,mysql5.6,springboot2.1。​

二数据库建表和实体

user表,里面有三个属性 用户id、 用户名和电话号码。

CREATE TABLE `user` (
 `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '用户id',
 `name` varchar(255) DEFAULT NULL COMMENT '用户名',
 `telephone` varchar(255) DEFAULT NULL COMMENT '用户电话',
 PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;

user表对应的实体:

/**
 * @Author lsc
 * @Description <p>pojo </p>
 * @Date 2019/11/2 10:16
 */
public class User {

  // id
  private Long id;
  // 姓名
  private String name;
  // 电话
  private String telephone;
  // 省略 set get
}

三 dao层

对于使用jdbcTemplate,我们的dao层需要接口定义crud操作方法,其实现类则进行具体的sql操作,很多开发人员没有这种解耦的思想,往往就直接在servic层操作sql,可以说没有完整的一个知识体系,往往会造成后期维护困难,项目无法进行下去;

3.1 dao接口

/**
 * @Author lsc
 * @Description <p> user dao 接口 </p>
 * @Date 2019/11/2 10:19
 */
public interface UserDao {

  // 添加
  int addUser(User user);
  // 改
  int updateUser(User user);
  // 删
  int deleteUser(Long id);
  // 通过id查询
  User findUserbyId(Long id);
}

3.2 dao层实现类

dao层的实现类才是具体操作sql的地方。

/**
 * @Author lsc
 * @Description <p> user 持久层 </p>
 * @Date 2019/11/2 10:22
 */
@Repository
public class UserDaoImpl implements UserDao {

  // 注入jdbc模板
  @Autowired
  private JdbcTemplate jdbcTemplate;

  @Override
  public int addUser(User user) {
    // sql
    String sql = "insert into user (name,telephone) values (?,?)";
    // jdbc insert
    return jdbcTemplate.update(sql,user.getName(),user.getTelephone());
  }

  @Override
  public int updateUser(User user) {
    // sql
    String sql = "update user set name = ?, telephone = ? where id = ?";
    // jdbc updae
    return jdbcTemplate.update(sql,user.getName(),user.getTelephone(),user.getId());
  }

  @Override
  public int deleteUser(Long id) {
    // sql
    String sql = "delete from user where id = ?";
    // delete
    return jdbcTemplate.update(sql,id);
  }

  @Override
  public User findUserbyId(Long id) {
    // sql
    String sql = "select * from user where id = ?";
    // params
    Object[] params = new Object[]{id};
    // rowMapper
    BeanPropertyRowMapper rowMapper = new BeanPropertyRowMapper(User.class);
    // jdbc query
    List<User> query = jdbcTemplate.query(sql, params, rowMapper);
    // return user
    return query.get(0);
  }
}

四 service层

4.1 service层接口

service层接口定义业务的方法,提供给控制层调用。

public interface UserService {

  // 添加
  int addUser(User user);
  // 改
  int updateUser(User user);
  // 删
  int deleteUser(Long id);
  // 通过id查询
  User findUserbyId(Long id);
}

4.2 service层实现类

service层的实现类才是具体写业务逻辑代码的地方。

/**
 * @Author lsc
 * @Description <p> user service </p>
 * @Date 2019/11/2 10:37
 */
@Service
public class UserServiceImpl implements UserService {

  @Autowired
  UserDao userDao;

  @Override
  public int addUser(User user) {
    return userDao.addUser(user);
  }

  @Override
  public int updateUser(User user) {
    return userDao.updateUser(user);
  }

  @Override
  public int deleteUser(Long id) {
    return userDao.deleteUser(id);
  }

  @Override
  public User findUserbyId(Long id) {
    return userDao.findUserbyId(id) ;
  }
}

五 controller

这是一个简单的restful层的api,实现crud功能。

/**
 * @Author lsc
 * @Description <p>user 控制层 </p>
 * @Date 2019/11/2 10:43
 */
@RestController
public class UserController {

  @Autowired
  UserService userService;

  // 查询user
  @GetMapping("user/{id}")
  public User getUser(@PathVariable Long id){
    return userService.findUserbyId(id);
  }
  // 添加user
  @PostMapping("user")
  public int addUser(@RequestBody User user){
    return userService.addUser(user);
  }

  //修改 user
  @PutMapping("user/{id}")
  public int updateUser(@PathVariable Long id,@RequestBody User user){
    user.setId(id);
    return userService.updateUser(user);
  }

  // 删除user
  @DeleteMapping("user/{id}")
  public int deleteUser(@PathVariable Long id){
    return userService.deleteUser(id);
  }
}

六 配置文件

配置文件不使用properties的原因是yml文件的语法格式更加简练明了,在配置文件中的注解已经很详细,所以不会赘述。

spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver #数据库驱动
url: jdbc:mysql://192.168.0.105:3306/springboot?useUnicode=true&characterEncoding=utf-8 #数据库地址
username: root #数据库账号
password: 123456 # 数据密码
type: com.alibaba.druid.pool.DruidDataSource # 连接池类型
druid:
#初始化连接池的连接数量
initial-size: 5
# 最小
min-idle: 5
# 最大
max-active: 20
#配置获取连接等待超时的时间
max-wait: 6000
#配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
time-between-eviction-runs-millis: 6000
# 配置一个连接在池中最小生存的时间,单位是毫秒
min-evictable-idle-time-millis: 3000

七 pom.xml

很抱歉我把xml放在最后面了

	 <parent>
	    <groupId>org.springframework.boot</groupId>
	    <artifactId>spring-boot-starter-parent</artifactId>
	    <version>2.1.1.RELEASE</version>
	    <relativePath/>
	  </parent>
	 <dependencies>
    <!-- jdbc 启动器-->
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-jdbc</artifactId>
    </dependency>
    <!-- mysql 启动器 -->
    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
    </dependency>
    <!-- 连接池-->
    <dependency>
      <groupId>com.alibaba</groupId>
      <artifactId>druid</artifactId>
      <version>1.1.15</version>
    </dependency>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <!-- -->

  </dependencies>

八 测试工具说明

大家可以通过postman等开发工具进行restful风格接口测试,作为后端开发者,就别去写页面了。

九 测试链接池说明

如果大家想知道怎么测试连接池是否连接成功可以实现ApplicationContextAware接口进行测试,具体的代码如下:

/**
 * @Author lsc
 * @Description <p> 实现spring bean 生命周期接口</p>
 * @Date 2019/11/2 10:08
 */
@Component
public class DatabaseVision implements ApplicationContextAware {

  ApplicationContext applicationContext = null;
  // spring ioc 初始化 bean 的时候调用
  @Override
  public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
    // 获得applicationContext
    this.applicationContext = applicationContext;
    // 获得dataSource
    DataSource dataSource = applicationContext.getBean(DataSource.class);
    // 启动 springboot application print com.alibaba.druid.pool.DruidDataSource
    System.out.println(dataSource.getClass().getName());
  }
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Spring boot 使用JdbcTemplate访问数据库

    SpringBoot 是为了简化 Spring 应用的创建.运行.调试.部署等一系列问题而诞生的产物, 自动装配的特性让我们可以更好的关注业务本身而不是外部的XML配置,我们只需遵循规范,引入相关的依赖就可以轻易的搭建出一个 WEB 工程 Spring Framework 对数据库的操作在 JDBC 上面做了深层次的封装,通过 依赖注入 功能,可以将 DataSource 注册到 JdbcTemplate 之中,使我们可以轻易的完成对象关系映射,并有助于规避常见的错误,在 SpringBoot

  • 详解spring boot中使用JdbcTemplate

    本文将介绍如何将spring boot 与 JdbcTemplate一起工作. Spring对数据库的操作在jdbc上面做了深层次的封装,使用spring的注入功能,可以把DataSource注册到JdbcTemplate之中. JdbcTemplate 是在JDBC API基础上提供了更抽象的封装,并提供了基于方法注解的事务管理能力. 通过使用SpringBoot自动配置功能并代替我们自动配置beans. 数据源配置 在maven中,我们需要增加spring-boot-starter-jdbc

  • SpringBoot使用JdbcTemplate操作数据库

    前言 本文是对SpringBoot使用JdbcTemplate操作数据库的一个介绍,提供一个小的Demo供大家参考. 操作数据库的方式有很多,本文介绍使用SpringBoot结合JdbcTemplate. 新建项目 新建一个项目.pom文件中加入Jdbc依赖,完整pom如下: <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM

  • springboot使用JdbcTemplate完成对数据库的增删改查功能

    首先新建一个简单的数据表,通过操作这个数据表来进行演示 DROP TABLE IF EXISTS `items`; CREATE TABLE `items` ( `id` int(11) NOT NULL AUTO_INCREMENT, `title` varchar(255) DEFAULT NULL, `name` varchar(10) DEFAULT NULL, `detail` varchar(255) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE

  • springBoot使用JdbcTemplate代码实例

    springBoot使用JdbcTemplate 如果是通过spring自动注入的jdbcTemplate,配好application.properties在其他类中就能在其他类中直接使用. 如果通过new JdbcTemplate()出来的就需要自己配置DataSource. 自动注入如下 application.properties文件 spring.datasource.url=jdbc:mysql://localhost:3306/test?serverTimezone=UTC spri

  • 基于spring boot 1.5.4 集成 jpa+hibernate+jdbcTemplate(详解)

    1.pom添加依赖 <!-- spring data jpa,会注入tomcat jdbc pool/hibernate等 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> <dependency> <

  • 详解springboot采用多数据源对JdbcTemplate配置的方法

    springboot多数据源配置,代码如下 DataSourceConfig package com.rookie.bigdata.config; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.boot.jdbc.

  • SpringBoot JdbcTemplate批量操作的示例代码

    前言 在我们做后端服务Dao层开发,特别是大数据批量插入的时候,这时候普通的ORM框架(Mybatis.hibernate.JPA)就无法满足程序对性能的要求了.当然我们又不可能使用原生的JDBC进行操作,那样尽管效率会高,但是复杂度会上升. 综合考虑我们使用Spring中的JdbcTemplate和具名参数namedParameterJdbcTemplate来进行批量操作. 改造前 在开始讲解之前,我们首先来看下之前的JPA是如何批量操作的. 实体类User: public class App

  • Springboot集成jdbcTemplate过程解析

    一 说明 实际工作中其实很少会用到jdbcTemplate去操作数据库,因为其使用方式不是很灵活,sql的拼接能力不强:实际上jdbcTemplate是属于spring自带的数据层模板,在spring中可以说是比较失败的一个案例,原因是当代流行mybatis当做持久层访问数据库,其优越的sql拼接能力.动态sql.半自动化映射.和易于sql优化的特性,深受广大互联网公司的喜爱,并且mybatis的市场占有率不断的上升,hibernate的市场不断缩水,可以说hibernate已经这种强映射关系的

  • 基于springboot集成hbase过程解析

    这篇文章主要介绍了基于springboot集成hbase过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 springboot-habse: https://github.com/spring-projects/spring-hadoop-samples/tree/master/hbase 依赖: <dependency> <groupId>org.springframework.data</groupId> &

  • springboot集成swagger过程解析

    这篇文章主要介绍了springboot集成swagger过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 springboot集成swagger 1.pom.xml中引入: <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger2</artifactId> <version>2.9.2

  • SpringBoot 集成 Druid过程解析

    Druid是阿里巴巴开源平台上一个数据库连接池实现,它结合了C3P0.DBCP.PROXOOL等DB池的优点,同时加入了日志监控,可以很好的监控DB池连接和SQL的执行情况,可以说是针对监控而生的DB连接池.更多资料说明大家可以查看官网 Github:https://github.com/alibaba/druid Druid官方已经编写好了相关的启动器,我们可以引入启动器,然后进行相关配置就可以使用Druid的各种功能.如果只是引入Druid依赖包,没有引入Druid的SpringBoot启动

  • SpringBoot集成多数据源解析

    一,前面我们介绍了springboot的快速启动,大家肯定对springboot也有所了解,下面我们来介绍一下springboot怎么集成多数据源. 在有的项目开发中需要在一个项目中访问多个数据源或者两个项目之间通信(实质上是互相访问对方的数据库),在这里,我们介绍一下在一个项目中如何集成多个数据源(即访问多个不同的数据库),因为在项目中有时会有这种需求,比如在一个大型项目开发中,一个数据库中保存数据的索引,各种使用频繁的数据,另一个数据库中保存其他的数据. 1.下面我们来讨论一个问题,怎么集成

  • SpringBoot整合FastJson过程解析

    这篇文章主要介绍了SpringBoot整合FastJson过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 一.Maven依赖 <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.33</version> </dependency&

  • springboot集成fastDfs过程代码实例

    这篇文章主要介绍了springboot集成fastDfs过程代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 pom.xml 引入依赖 <dependency> <groupId>com.github.tobato</groupId> <artifactId>fastdfs-client</artifactId> <version>1.26.1-RELEASE</vers

  • springboot自定义异常视图过程解析

    这篇文章主要介绍了springboot自定义异常视图过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 一.源码分析 先看源码再写自己的自定义异常视图 resolveErrorView()函数首先调用了一个返回ModelAndView的函数,该函数所需的参数是一个状态码的字符串,和一个map集合,该集合是错误信息 也就是下图这个函数 上图函数判断你是否提供了templates/error/下的动态错误页 如果提供了直接返回视图名和错误信息

  • springboot整合JPA过程解析

    这篇文章主要介绍了springboot整合JPA过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 接下来具体看看是怎么弄的. 1.新建一个springboot项目,选择web.data jdbc.data jpa.mysql driver. 2.建立以下目录及结构: pom.xml <?xml version="1.0" encoding="UTF-8"?> <project xmlns=&

  • SpringBoot 集成Redis 过程

    Redis 介绍: Redis 服务 Redis (REmote Dictionary Server) 是一个由Salvatore Sanfilippo 完成的key-value存储系统,是跨平台的非关系型数据库. Redis 是一个开源的使用ANSI C语言编写.遵循BSD 协议的.支持网络.可基于内存.分布式.可选择持久性的键值对存储数据库,并提供多语言的API. Redis 通常被认为是数据结构服务器,其值可以是字符串.哈希.列表.集合以及有序集合. Redis 优点 异常快,每秒可以执行

随机推荐