Spring boot 使用JdbcTemplate访问数据库
SpringBoot是为了简化Spring应用的创建、运行、调试、部署等一系列问题而诞生的产物,自动装配的特性让我们可以更好的关注业务本身而不是外部的XML配置,我们只需遵循规范,引入相关的依赖就可以轻易的搭建出一个WEB工程
SpringFramework对数据库的操作在JDBC上面做了深层次的封装,通过依赖注入功能,可以将DataSource注册到JdbcTemplate之中,使我们可以轻易的完成对象关系映射,并有助于规避常见的错误,在SpringBoot中我们可以很轻松的使用它。
特点
- 速度快,对比其它的ORM框架而言,JDBC的方式无异于是最快的
- 配置简单,Spring自家出品,几乎没有额外配置
- 学习成本低,毕竟JDBC是基础知识,JdbcTemplate更像是一个DBUtils
导入依赖
在pom.xml中添加对JdbcTemplate的依赖
org.springframework.boot spring-boot-starter-jdbc mysql mysql-connector-java org.springframework.boot spring-boot-starter-web
连接数据库
在application.properties中添加如下配置。值得注意的是,SpringBoot默认会自动配置DataSource,它将优先采用HikariCP连接池,如果没有该依赖的情况则选取tomcat-jdbc,如果前两者都不可用最后选取CommonsDBCP2。通过spring.datasource.type属性可以指定其它种类的连接池
spring.datasource.url=jdbc:mysql://localhost:3306/chapter4?useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull&allowMultiQueries=true&useSSL=false spring.datasource.password=root spring.datasource.username=root #spring.datasource.type #更多细微的配置可以通过下列前缀进行调整 #spring.datasource.hikari #spring.datasource.tomcat #spring.datasource.dbcp2
启动项目,通过日志,可以看到默认情况下注入的是HikariDataSource
2018-05-0710:33:54.021INFO9640---[main]o.s.j.e.a.AnnotationMBeanExporter:Beanwithname'dataSource'hasbeenautodetectedforJMXexposure 2018-05-0710:33:54.026INFO9640---[main]o.s.j.e.a.AnnotationMBeanExporter:LocatedMBean'dataSource':registeringwithJMXserverasMBean[com.zaxxer.hikari:name=dataSource,type=HikariDataSource] 2018-05-0710:33:54.071INFO9640---[main]o.s.b.w.embedded.tomcat.TomcatWebServer:Tomcatstartedonport(s):8080(http)withcontextpath'' 2018-05-0710:33:54.075INFO9640---[main]com.battcn.Chapter4Application:StartedChapter4Applicationin3.402seconds(JVMrunningfor3.93)
具体编码
完成基本配置后,接下来进行具体的编码操作。为了减少代码量,就不写UserDao、UserService之类的接口了,将直接在Controller中使用JdbcTemplate进行访问数据库操作,这点是不规范的,各位别学我…
表结构
创建一张t_user的表
CREATETABLE`t_user`( `id`int(8)NOTNULLAUTO_INCREMENTCOMMENT'主键自增', `username`varchar(50)NOTNULLCOMMENT'用户名', `password`varchar(50)NOTNULLCOMMENT'密码', PRIMARYKEY(`id`) )ENGINE=InnoDBDEFAULTCHARSET=utf8COMMENT='用户表';
实体类
packagecom.battcn.entity; /** *@authorLevin *@since2018/5/70007 */ publicclassUser{ privateLongid; privateStringusername; privateStringpassword; //TODO省略getset }
restful风格接口
packagecom.battcn.controller; importcom.battcn.entity.User; importorg.springframework.beans.factory.annotation.Autowired; importorg.springframework.jdbc.core.BeanPropertyRowMapper; importorg.springframework.jdbc.core.JdbcTemplate; importorg.springframework.web.bind.annotation.*; importjava.util.List; /** *@authorLevin *@since2018/4/230023 */ @RestController @RequestMapping("/users") publicclassSpringJdbcController{ privatefinalJdbcTemplatejdbcTemplate; @Autowired publicSpringJdbcController(JdbcTemplatejdbcTemplate){ this.jdbcTemplate=jdbcTemplate; } @GetMapping publicListqueryUsers(){ //查询所有用户 Stringsql="select*fromt_user"; returnjdbcTemplate.query(sql,newObject[]{},newBeanPropertyRowMapper<>(User.class)); } @GetMapping("/{id}") publicUsergetUser(@PathVariableLongid){ //根据主键ID查询 Stringsql="select*fromt_userwhereid=?"; returnjdbcTemplate.queryForObject(sql,newObject[]{id},newBeanPropertyRowMapper<>(User.class)); } @DeleteMapping("/{id}") publicintdelUser(@PathVariableLongid){ //根据主键ID删除用户信息 Stringsql="DELETEFROMt_userWHEREid=?"; returnjdbcTemplate.update(sql,id); } @PostMapping publicintaddUser(@RequestBodyUseruser){ //添加用户 Stringsql="insertintot_user(username,password)values(?,?)"; returnjdbcTemplate.update(sql,user.getUsername(),user.getPassword()); } @PutMapping("/{id}") publicinteditUser(@PathVariableLongid,@RequestBodyUseruser){ //根据主键ID修改用户信息 Stringsql="UPDATEt_userSETusername=?,password=?WHEREid=?"; returnjdbcTemplate.update(sql,user.getUsername(),user.getPassword(),id); } }
测试
由于上面的接口是restful风格的接口,添加和修改无法通过浏览器完成,所以需要我们自己编写junit或者使用postman之类的工具。
创建单元测试Chapter4ApplicationTests,通过TestRestTemplate模拟GET、POST、PUT、DELETE等请求操作
packagecom.battcn; importcom.battcn.entity.User; importorg.junit.Test; importorg.junit.runner.RunWith; importorg.slf4j.Logger; importorg.slf4j.LoggerFactory; importorg.springframework.beans.factory.annotation.Autowired; importorg.springframework.boot.test.context.SpringBootTest; importorg.springframework.boot.test.web.client.TestRestTemplate; importorg.springframework.boot.web.server.LocalServerPort; importorg.springframework.core.ParameterizedTypeReference; importorg.springframework.http.HttpMethod; importorg.springframework.http.ResponseEntity; importorg.springframework.test.context.junit4.SpringRunner; importjava.util.List; /** *@authorLevin */ @RunWith(SpringRunner.class) @SpringBootTest(classes=Chapter4Application.class,webEnvironment=SpringBootTest.WebEnvironment.RANDOM_PORT) publicclassChapter4ApplicationTests{ privatestaticfinalLoggerlog=LoggerFactory.getLogger(Chapter4ApplicationTests.class); @Autowired privateTestRestTemplatetemplate; @LocalServerPort privateintport; @Test publicvoidtest1()throwsException{ template.postForEntity("http://localhost:"+port+"/users",newUser("user1","pass1"),Integer.class); log.info("[添加用户成功]\n"); //TODO如果是返回的集合,要用exchange而不是getForEntity,后者需要自己强转类型 ResponseEntity>response2=template.exchange("http://localhost:"+port+"/users",HttpMethod.GET,null,newParameterizedTypeReference
>(){ }); finalList
body=response2.getBody(); log.info("[查询所有]-[{}]\n",body); LonguserId=body.get(0).getId(); ResponseEntity response3=template.getForEntity("http://localhost:"+port+"/users/{id}",User.class,userId); log.info("[主键查询]-[{}]\n",response3.getBody()); template.put("http://localhost:"+port+"/users/{id}",newUser("user11","pass11"),userId); log.info("[修改用户成功]\n"); template.delete("http://localhost:"+port+"/users/{id}",userId); log.info("[删除用户成功]"); } }
总结
本章介绍了JdbcTemplate常用的几种操作,详细请参考JdbcTemplateAPI文档
目前很多大佬都写过关于SpringBoot的教程了,如有雷同,请多多包涵,本教程基于最新的spring-boot-starter-parent:2.0.1.RELEASE编写,包括新版本的特性都会一起介绍…