springboot jdbc template_Springboot教程

springboot jdbc template_Springboot教程SpringBoot2.X基础教程:SpringBoot整合JdbcTemplate【附源码】

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

微信号:hzy1014211086,如果你正在学习Spring Boot,可以加入我们的Spring技术交流群,共同成长


JdbcTemplate 是 Spring 自带的 JDBC 模板组件,底层实现了对 JDBC 的封装,我们可以借助 JdbcTemplate 来执行所有数据库操作,例如插入、更新、删除和从数据库中检索数据,并且有效避免直接使用 jdbc 带来的繁琐编码。

JdbcTemplate主要提供以下五种类型的方法:

  • execute方法:可以用于执行任何SQL语句,一般用于执行DDL语句。
  • update、batchUpdate方法:用于执行新增、修改、删除等语句。
  • query方法及queryForXXX方法:用于执行查询相关的语句。
  • call方法:用于执行数据库存储过程和函数相关的语句。

当然,在大部分情况下,我们都会直接使用更加强大的持久化框架来访问数据库,比如MyBatis、Hibernate 或者 Spring Data JPA,我们这里讲解 JdbcTemplate 的整合,只是想让家更加了解底层原理。

一、准备数据表

CREATE TABLE `spring_boot`.`article`  (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `title` varchar(255) NULL COMMENT '文章标题',
  `author` varchar(255) NULL COMMENT '作者',
  PRIMARY KEY (`id`)
) COMMENT = '文章表';

二、引入依赖

<dependencies>
	<!-- MySQL 依赖 -->
	<dependency>
		<groupId>mysql</groupId>
		<artifactId>mysql-connector-java</artifactId>
		<scope>runtime</scope>
	</dependency>
	
	<!-- Spring JDBC 依赖 -->
	<dependency>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-jdbc</artifactId>
	</dependency>
	
	<!-- Spring Web 依赖 -->
	<dependency>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-web</artifactId>
	</dependency>
</dependencies>

三、配置数据源

spring.datasource.url = jdbc:mysql://139.196.20.xxx:3306/spring_boot?useUnicode=true&characterEncoding=utf-8
spring.datasource.username = root
spring.datasource.password = 123456
spring.datasource.driver-class-name = com.mysql.cj.jdbc.Driver

因为 Spring Boot 2.5.4 默认使用了MySQL 8.0.26 的驱动,所以这里采用com.mysql.cj.jdbc.Driver,而不是老的com.mysql.jdbc.Driver。

四、编写领域对象

@Data
@NoArgsConstructor
public class Blog { 
   
  private Integer id;
  private String title;
  private String author;
}

这里我们使用Lombok,需要在IDEA里安装Lombok插件,不然会报错,get、set方法找不到。
在这里插入图片描述

五、新增

JdbcTemplate 中,除了查询有几个 API 之外,增删改统一都使用 update 来操作,自己来传入 SQL 即可。

update 方法的返回值就是 SQL 执行受影响的行数。

@RestController
public class BlogController { 
   

  @Autowired
  public BlogService blogService;

  /** * 新增一篇文章 * * @param blog 文章实体类 * @return */
  @PostMapping(value = "/create")
  public Object create(@RequestBody Blog blog) { 
   
    if (StringUtils.isBlank(blog.getTitle())) { 
   
      return ResponseUtil.fail(ResultEnums.BAD_ARGUMENT_VALUE.getCode(), "请输入文章标题");
    }
    if (StringUtils.isBlank(blog.getAuthor())) { 
   
      return ResponseUtil.fail(ResultEnums.BAD_ARGUMENT_VALUE.getCode(), "请输入文章作者");
    }
    return blogService.create(blog);
  }
}

@Service
public class BlogServiceImpl implements BlogService { 
   

  @Autowired
  private JdbcTemplate jdbcTemplate;

  @Override
  public Object create(Blog blog) { 
   
    int count = jdbcTemplate.update("insert into article(title, author) values(?, ?)", blog.getTitle(), blog.getAuthor());
    if (count > 0) { 
   
      return ResponseUtil.ok("插入成功");
    } else { 
   
      return ResponseUtil.fail(ResultEnums.SERIOUS.getCode(), "插入失败");
    }
  }
}

在这里插入图片描述

六、修改

@RestController
public class BlogController { 
   

  @Autowired
  public BlogService blogService;

  /** * 通过id修改文章 * * @param blog * @return */
  @PostMapping(value = "/updateById")
  public Object updateById(@RequestBody Blog blog) { 
   
    if (StringUtils.isBlank(blog.getTitle())) { 
   
      return ResponseUtil.fail(ResultEnums.BAD_ARGUMENT_VALUE.getCode(), "请输入文章标题");
    }
    if (StringUtils.isBlank(blog.getAuthor())) { 
   
      return ResponseUtil.fail(ResultEnums.BAD_ARGUMENT_VALUE.getCode(), "请输入文章作者");
    }
    return blogService.updateById(blog);
  }
}

@Service
public class BlogServiceImpl implements BlogService { 
   

  @Autowired
  private JdbcTemplate jdbcTemplate;

  @Override
  public Object updateById(Blog blog) { 
   
    int count = jdbcTemplate.update("update article set title=?,author=? where id=?", blog.getTitle(), blog.getAuthor(), blog.getId());
    if (count > 0) { 
   
      return ResponseUtil.ok("修改成功");
    } else { 
   
      return ResponseUtil.fail(ResultEnums.SERIOUS.getCode(), "修改失败");
    }
  }
}

在这里插入图片描述

七、查询

@RestController
public class BlogController { 
   

  @Autowired
  public BlogService blogService;

  /** * 查询所有文章 * * @return */
  @GetMapping(value = "/getAll")
  public List<Blog> getAll() { 
   
    return blogService.getAll();
  }


  /** * 通过标题查询文章 * * @param title * @return */
  @GetMapping(value = "/getByTitle")
  public Object getByTitle(String title) { 
   
    if (StringUtils.isBlank(title)) { 
   
      return ResponseUtil.fail(ResultEnums.BAD_ARGUMENT_VALUE.getCode(), "请输入文章标题");
    }
    return blogService.getByTitle(title);
  }
}

@Service
public class BlogServiceImpl implements BlogService { 
   

  @Autowired
  private JdbcTemplate jdbcTemplate;

  @Override
  public List<Blog> getAll() { 
   
    return jdbcTemplate.query("select * from article", new BeanPropertyRowMapper<>(Blog.class));
  }

  @Override
  public List<Blog> getByTitle(String title) { 
   
  	// 如果不会Lambda表达式的小伙伴可以看下面的代码
    return jdbcTemplate.query("select * from article where title = ?", (resultSet, i) -> { 
   
      Blog blog = new Blog();
      blog.setId(resultSet.getInt("id"));
      blog.setTitle(resultSet.getString("title"));
      blog.setAuthor(resultSet.getString("author"));
      return blog;
    }, title);
  }

  @Override
  public List<Blog> getByTitle(String title) { 
   
  	// 照顾到有小伙伴不会Lambda表达式,我这里把另一种方案也写出来
    return jdbcTemplate.query("select * from article where title = ?", new RowMapper<Blog>() { 
   
      @Override
      public Blog mapRow(ResultSet resultSet, int i) throws SQLException { 
   
        Blog blog = new Blog();
        blog.setId(resultSet.getInt("id"));
        blog.setTitle(resultSet.getString("title"));
        blog.setAuthor(resultSet.getString("author"));
        return blog;
      }
    }, title);
  }

}

在这里插入图片描述
在这里插入图片描述

八、删除

删除也是使用 update API,传入你的 SQL 即可

@RestController
public class BlogController { 
   

  @Autowired
  public BlogService blogService;
  
  /** * 通过ID删除文章 * * @param id * @return */
  @PostMapping(value = "/deleteById")
  public Object deleteById(Integer id) { 
   
    if (null == id || 0 == id.longValue()) { 
   
      return ResponseUtil.fail(ResultEnums.BAD_ARGUMENT_VALUE.getCode(), "请输入文章id");
    }
    return blogService.deleteById(id);
  }
}

@Service
public class BlogServiceImpl implements BlogService { 
   

  @Autowired
  private JdbcTemplate jdbcTemplate;
  
  @Override
  public Object deleteById(Integer id) { 
   
    int count = jdbcTemplate.update("delete from article where id=?", id);
    if (count > 0) { 
   
      return ResponseUtil.ok("删除成功");
    } else { 
   
      return ResponseUtil.fail(ResultEnums.SERIOUS.getCode(), "删除失败");
    }
  }
}

在这里插入图片描述

更多其他数据访问操作的使用请参考:JdbcTemplate API

彩蛋,很多小伙伴会发现一个问题,项目启动一段时间放那里不动,然后在访问接口时,就会报错,这和我们使用的数据源有关(Hikari),在后面《数据源详解》章节我会教大家如何解决。

九、源码

本文的相关例子可以查看下面仓库中的 chapter4 目录:

  • Gitee:https://gitee.com/hezhiyuan007/spring-boot-study
  • Github:https://github.com/java-fish-0907/spring-boot-study
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/189366.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • CentOS中设置系统级代理

    CentOS中设置系统级代理YUM代理设置 编辑/etc/yum.conf,在最后加入#Proxyproxy=http://username:password@proxy_ip:port/ 也可以使用proxy_username和proxy_password来配置代理的用户名和密码 这样的配置完成后,所有的用户在使用yum时,都会使用代理,可以说是全局代理。 如果需要为单独的用户配置

  • 2012年计算机工作总结,计算机教师工作总结2011-2012

    2012年计算机工作总结,计算机教师工作总结2011-2012计算机教师工作总结2011-20122010-2011第一学期计算机教学工作总结郑龙勤本学期,我任教24,25,26,27班的计算机应用基础教学,同时兼任学校的中职资助、机房维护等工作。在各位领导和老师的热心支持和帮助下,我认真做好教学工作,积极完成学校布置的各项任务。下面我把2010-2011年第一学期的工作做简要的汇报。一、学校制度执行情况平时积极参加全校教职工会议,认真学习学校下达的文件,关…

  • WPF教程(二) WPF vs WinForms

    在前面的章节,我们讨论了WPF是什么,还涉及了一点点WinForms。在本章节,我将尝试比较两者,尽管它们服务的目的一样,却存在很多的区别。如果你以前从来没有接触过WinForms,或者WPF是你学习的第一种GUI框架,请跳过这一章节。但是如果你有兴趣的话,不妨尝试一读。先说说两者最重要的区别。WinForms只是标准窗体控件顶部的一层(如文本框),而WPF从零开始,几乎在所有场景下都不依赖于

  • MySQL数据库面试题(2020最新版)

    MySQL数据库面试题(2020最新版)文章目录数据库基础知识为什么要使用数据库什么是SQL?什么是MySQL?数据库三大范式是什么mysql有关权限的表都有哪几个MySQL的binlog有有几种录入格式?分别有什么区别?数据类型mysql有哪些数据类型引擎MySQL存储引擎MyISAM与InnoDB区别MyISAM索引与InnoDB索引的区别?InnoDB引擎的4大特性存储引擎选择索引什么是索引?索引有哪些优缺点?索引使用场景(重点)…

  • ASP.NET中进行消息处理(MSMQ) 一 (转)

    ASP.NET中进行消息处理(MSMQ) 一 (转)

  • pfSense2.3x安装教程

    pfSense2.3x安装教程

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号