SpringBoot集成jdbcTemplate

本文详细介绍Spring Boot项目中整合JdbcTemplate的过程,包括项目搭建、数据库连接配置、基本的增删改查操作实现等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

文章转载于    http://blog.youkuaiyun.com/u013871100/article/details/68925050


JDBC事务处理    https://www.oschina.net/code/snippet_574870_33828



spring boot学习系列:spring boot与jdbcTemplate的整合案例

     简单入门了spring boot后,接下来写写跟数据库打交道的案例。博文采用spring的jdbcTemplate工具类与数据库打交道。

     下面是搭建的springbootJDBC的项目的总体架构图:


     可以参照上一篇博文,参考参考如何建立一个spring boot项目,至于在选择依赖的配置时候,可以参考我下面贴出的pom.xml:

[html]  view plain  copy
 print ?
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  3.     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">  
  4.     <modelVersion>4.0.0</modelVersion>  
  5.   
  6.     <groupId>com.example</groupId>  
  7.     <artifactId>demo</artifactId>  
  8.     <version>0.0.1-SNAPSHOT</version>  
  9.     <packaging>jar</packaging>  
  10.   
  11.     <name>demo</name>  
  12.     <description>Demo project for Spring Boot</description>  
  13.   
  14.     <parent>  
  15.         <groupId>org.springframework.boot</groupId>  
  16.         <artifactId>spring-boot-starter-parent</artifactId>  
  17.         <version>1.5.2.RELEASE</version>  
  18.         <relativePath/> <!-- lookup parent from repository -->  
  19.     </parent>  
  20.   
  21.     <properties>  
  22.         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>  
  23.         <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>  
  24.         <java.version>1.8</java.version>  
  25.     </properties>  
  26.   
  27.     <dependencies>  
  28.         <dependency>  
  29.             <groupId>org.springframework.boot</groupId>  
  30.             <artifactId>spring-boot-starter-web</artifactId>  
  31.         </dependency>  
  32.         <dependency>  
  33.             <groupId>org.springframework.boot</groupId>  
  34.             <artifactId>spring-boot-starter-jdbc</artifactId>  
  35.         </dependency>  
  36.   
  37.         <dependency>  
  38.             <groupId>mysql</groupId>  
  39.             <artifactId>mysql-connector-java</artifactId>  
  40.             <scope>runtime</scope>  
  41.         </dependency>  
  42.         <dependency>  
  43.             <groupId>org.springframework.boot</groupId>  
  44.             <artifactId>spring-boot-starter-test</artifactId>  
  45.             <scope>test</scope>  
  46.         </dependency>  
  47.         <dependency>  
  48.             <groupId>org.springframework.boot</groupId>  
  49.             <artifactId>spring-boot-test</artifactId>  
  50.         </dependency>  
  51.         <dependency>  
  52.             <groupId>com.google.guava</groupId>  
  53.             <artifactId>guava</artifactId>  
  54.             <version>18.0</version>  
  55.         </dependency>  
  56.     </dependencies>  
  57.   
  58.     <!--spring boot maven插件-->  
  59.     <build>  
  60.         <plugins>  
  61.             <plugin>  
  62.                 <groupId>org.springframework.boot</groupId>  
  63.                 <artifactId>spring-boot-maven-plugin</artifactId>  
  64.             </plugin>  
  65.         </plugins>  
  66.     </build>  
  67.   
  68. </project>  


     接下来,贴出application.properties,设置tomcat端口号,数据库链接相关信息:

[html]  view plain  copy
 print ?
  1. ###### 设置tomcat访问端口号 ######  
  2. server.port=8088  
  3.   
  4. ###### 设置数据源 ######  
  5. spring.datasource.url=jdbc:mysql://localhost:3306/db_springboot?autoReconnect=true&useUnicode=true&characterEncoding=utf-8  
  6. spring.datasource.username=root  
  7. spring.datasource.password=123456  
  8. spring.datasource.driver-class-name=com.mysql.jdbc.Driver  
  9. #spring.datasource.driverClassName = com.mysql.jdbc.Driver  
     

     建立数据库tb_springboot,然后执行下面的sql脚本,生成users表:

[html]  view plain  copy
 print ?
  1. /*  
  2. Navicat MySQL Data Transfer  
  3.   
  4. Source Server         : localhost  
  5. Source Server Version : 50625  
  6. Source Host           : localhost:3306  
  7. Source Database       : db_springboot  
  8.   
  9. Target Server Type    : MYSQL  
  10. Target Server Version : 50625  
  11. File Encoding         : 65001  
  12.   
  13. Date: 2017-03-31 15:01:08  
  14. */  
  15.   
  16. SET FOREIGN_KEY_CHECKS=0;  
  17.   
  18. -- ----------------------------  
  19. -- Table structure for users  
  20. -- ----------------------------  
  21. DROP TABLE IF EXISTS `users`;  
  22. CREATE TABLE `users` (  
  23.   `id` int(11) NOT NULL AUTO_INCREMENT,  
  24.   `name` varchar(255) DEFAULT NULL,  
  25.   `email` varchar(255) DEFAULT NULL,  
  26.   PRIMARY KEY (`id`)  
  27. ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8;  
  28.   
  29. -- ----------------------------  
  30. -- Records of users  
  31. -- ----------------------------  
  32. INSERT INTO `users` VALUES ('1', 'linsen', 'linsen@126.com');  
  33. INSERT INTO `users` VALUES ('2', 'sam', 'sam@qq.com');  
  34. INSERT INTO `users` VALUES ('3', 'debug', 'debug@sina.com');  
  35. INSERT INTO `users` VALUES ('4', '杰克', '杰克@sina.com');  
  36. INSERT INTO `users` VALUES ('5', '张三', '张三@sina.com');  
  37. INSERT INTO `users` VALUES ('6', '李四', '李四@sina.com');  
  38. INSERT INTO `users` VALUES ('7', '王五', '王五@sina.com');  
  39. INSERT INTO `users` VALUES ('8', '王五2', '王五2@sina.com');  
     

    本博文我们对spring boot与jdbcTemplate进行整合,主要当然是实现基本的 增删改查 user实体 操作,首先是开发dao层:

[java]  view plain  copy
 print ?
  1. package com.example.repository;  
  2.   
  3. import com.example.entity.User;  
  4. import com.example.exception.UserException;  
  5. import org.springframework.beans.factory.annotation.Autowired;  
  6. import org.springframework.jdbc.core.JdbcTemplate;  
  7. import org.springframework.jdbc.core.PreparedStatementCreator;  
  8. import org.springframework.jdbc.core.PreparedStatementSetter;  
  9. import org.springframework.jdbc.core.RowMapper;  
  10. import org.springframework.jdbc.support.GeneratedKeyHolder;  
  11. import org.springframework.jdbc.support.KeyHolder;  
  12. import org.springframework.stereotype.Repository;  
  13. import org.springframework.transaction.annotation.Transactional;  
  14.   
  15. import java.sql.Connection;  
  16. import java.sql.PreparedStatement;  
  17. import java.sql.ResultSet;  
  18. import java.sql.SQLException;  
  19. import java.util.ArrayList;  
  20. import java.util.List;  
  21.   
  22. /** 
  23.  * Created by steadyjack on 2017/3/22. 
  24.  * 充当dao层UserRepository 
  25.  */  
  26. @Repository  
  27. public class UserRepository {  
  28.   
  29.     @Autowired  
  30.     private JdbcTemplate jdbcTemplate;  
  31.   
  32.     /** 
  33.      * 获取用户列表 
  34.      * @return 
  35.      * @throws Exception 
  36.      */  
  37.     @Transactional(readOnly = true)  
  38.     public List<User> getUserList() throws Exception{  
  39.         List<User> userList=jdbcTemplate.query("select id,name,email from users",new UserRowMapper());  
  40.         System.out.println(userList);  
  41.         return userList;  
  42.     }  
  43.   
  44.     /** 
  45.      * 根据用户id获取用户 
  46.      * @param id 
  47.      * @return 
  48.      * @throws Exception 
  49.      */  
  50.     @Transactional(readOnly = true)  
  51.     public User getUserById(Integer id) throws  Exception{  
  52.         //queryForObject:找不到会报异常  query:找不到则Null  
  53.         //User user=jdbcTemplate.queryForObject("select id,name,email from users where id=?",new Object[]{id},new UserRowMapper());  
  54.         List<User> userList=jdbcTemplate.query("select id,name,email from users where id=?",new Object[]{id},new UserRowMapper());  
  55.         User user=null;  
  56.         if (!userList.isEmpty()){  
  57.             user=userList.get(0);  
  58.         }  
  59.         System.out.println(user);  
  60.         return user;  
  61.     }  
  62.   
  63.     /** 
  64.      * 插入用户数据 
  65.      * @param user 
  66.      * @return 
  67.      * @throws Exception 
  68.      */  
  69.     public int saveUser(final User user) throws  Exception{  
  70.         int resRow=jdbcTemplate.update("INSERT INTO users(id,name,email) VALUES(NULL,?,?)",new Object[]{  
  71.            user.getName(),user.getEmail()  
  72.         });  
  73.         System.out.println("操作结果记录数:  "+resRow);  
  74.         return resRow;  
  75.     }  
  76.   
  77.     /** 
  78.      * 插入用户数据-防止sql注入 
  79.      * @param user 
  80.      * @return 
  81.      * @throws Exception 
  82.      */  
  83.     public int saveUserWithSafe(final User user) throws  Exception{  
  84.         int resRow=jdbcTemplate.update("INSERT INTO users(id,name,email) VALUES(NULL,?,?)"new PreparedStatementSetter() {  
  85.             @Override  
  86.             public void setValues(PreparedStatement ps) throws SQLException {  
  87.                 ps.setString(1,user.getName());  
  88.                 ps.setString(2,user.getEmail());  
  89.             }  
  90.         });  
  91.         System.out.println("操作结果记录数:  "+resRow);  
  92.         return resRow;  
  93.     }  
  94.   
  95.     /** 
  96.      * 插入用户数据-防止sql注入-可以返回该条记录的主键(注意需要指定主键) 
  97.      * @param user 
  98.      * @return 
  99.      * @throws Exception 
  100.      */  
  101.     @Transactional(rollbackFor=UserException.class)  
  102.     public int saveUserWithKey(final User user) throws  Exception{  
  103.         String sql="INSERT INTO users(id,name,email) VALUES(NULL,?,?)";  
  104.         KeyHolder keyHolder=new GeneratedKeyHolder();  
  105.         int resRow=jdbcTemplate.update(new PreparedStatementCreator() {  
  106.             @Override  
  107.             public PreparedStatement createPreparedStatement(Connection conn) throws SQLException {  
  108.                 PreparedStatement ps=conn.prepareStatement(sql,new String[]{"id"}); //指定 id 为主键  
  109.                 ps.setString(1,user.getName());  
  110.                 ps.setString(2,user.getEmail());  
  111.                 return ps;  
  112.             }  
  113.         },keyHolder);  
  114.         System.out.println("操作结果记录数:  "+resRow+" 主键: "+keyHolder.getKey());  
  115.         return Integer.parseInt(keyHolder.getKey().toString());  
  116.     }  
  117.   
  118.     /** 
  119.      * 更新用户信息 
  120.      * @param user 
  121.      * @return 
  122.      */  
  123.     public int updateUser(final User user) throws  Exception{  
  124.         String sql="update users set name=?,email=? where id=?";  
  125.         int resRow=jdbcTemplate.update(sql, new PreparedStatementSetter() {  
  126.             @Override  
  127.             public void setValues(PreparedStatement preparedStatement) throws SQLException {  
  128.                 preparedStatement.setString(1,user.getName());  
  129.                 preparedStatement.setString(2,user.getEmail());  
  130.                 preparedStatement.setInt(3,user.getId());  
  131.             }  
  132.         });  
  133.         System.out.println("操作结果记录数:  "+resRow);  
  134.         return resRow;  
  135.     }  
  136.   
  137.     /** 
  138.      * 删除用户 
  139.      * @param user 
  140.      * @return 
  141.      * @throws Exception 
  142.      */  
  143.     public int deleteUser(final User user) throws  Exception{  
  144.         int resRow=jdbcTemplate.update("DELETE FROM users WHERE id=?"new PreparedStatementSetter() {  
  145.             @Override  
  146.             public void setValues(PreparedStatement ps) throws SQLException {  
  147.                 ps.setInt(1,user.getId());  
  148.             }  
  149.         });  
  150.         System.out.println("操作结果记录数:  "+resRow);  
  151.         return resRow;  
  152.     }  
  153.   
  154.     /** 
  155.      * 根据用户名查找用户-用于判断用户是否存在 
  156.      * @param user 
  157.      * @return 
  158.      * @throws Exception 
  159.      */  
  160.     public User getUserByUserName(final User user) throws Exception{  
  161.         String sql="select id,name,email from users where name=?";  
  162.         List<User> queryList=jdbcTemplate.query(sql,new UserRowMapper(),new Object[]{user.getName()});  
  163.         if (queryList!=null && queryList.size()>0){  
  164.             return queryList.get(0);  
  165.         }else{  
  166.             return null;  
  167.         }  
  168.     }  
  169.   
  170.     /** 
  171.      * 获取记录数 
  172.      * @return 
  173.      * @throws Exception 
  174.      */  
  175.     public Integer getCount() throws  Exception{  
  176.         String sql="select count(id) from users";  
  177.         //jdbcTemplate.getMaxRows();  
  178.         Integer total=jdbcTemplate.queryForObject(sql,Integer.class);  
  179.         System.out.println("操作结果记录数:  "+total);  
  180.         return total;  
  181.     }  
  182.   
  183.     //其他的像模糊查询之类的可以自己尝试查查 jdbcTemplate 的使用文档  
  184.   
  185.   
  186. }  
  187.   
  188. /** 
  189.  * 行映射 
  190.  */  
  191. class UserRowMapper implements RowMapper<User>{  
  192.   
  193.     @Override  
  194.     public User mapRow(ResultSet resultSet, int i) throws SQLException {  
  195.         User user=new User();  
  196.         user.setId(resultSet.getInt("id"));  
  197.         user.setName(resultSet.getString("name"));  
  198.         user.setEmail(resultSet.getString("email"));  
  199.         return user;  
  200.     }  
  201.   
  202. }  
    代码以及相关的注释我已经写在里面了,个人觉得很清晰了,如果有啥问题,可以下面留言,或者后面提到的技术交流群交流。

    接下来,当然是开发controller层,在这里,我主要开发rest服务接口,结果将以json的格式返回给发起请求的客户端(以postman进行模拟),下面是我的restController:

[java]  view plain  copy
 print ?
  1. package com.example.controller;  
  2.   
  3. import com.example.DemoApplication;  
  4. import com.example.entity.User;  
  5. import com.example.repository.UserRepository;  
  6. import com.google.common.base.Strings;  
  7. import org.springframework.beans.factory.annotation.Autowired;  
  8. import org.springframework.boot.test.context.SpringBootTest;  
  9. import org.springframework.web.bind.annotation.PathVariable;  
  10. import org.springframework.web.bind.annotation.RequestMapping;  
  11. import org.springframework.web.bind.annotation.RequestMethod;  
  12. import org.springframework.web.bind.annotation.RestController;  
  13.   
  14. import javax.servlet.http.HttpServletRequest;  
  15. import java.util.List;  
  16.   
  17. /** 
  18.  * Created by steadyjack on 2017/3/22. 
  19.  */  
  20. @SpringBootTest(classes = DemoApplication.class)  
  21. @RestController  
  22. @RequestMapping("/user")  
  23. public class UserController {  
  24.   
  25.     @Autowired  
  26.     private UserRepository userRepository;  
  27.   
  28.     /** 
  29.      * 用户列表 
  30.      * @return 
  31.      */  
  32.     @RequestMapping("/list")  
  33.     public List<User> listUser() {  
  34.         List<User> userList=null;  
  35.         try {  
  36.             userList=userRepository.getUserList();  
  37.         }catch (Exception e){  
  38.             System.out.println("异常信息:  "+e.getMessage());  
  39.         }  
  40.         return userList;  
  41.     }  
  42.   
  43.     /** 
  44.      * 根据id查询User实体 
  45.      * @param id 
  46.      * @return 
  47.      */  
  48.     @RequestMapping("/{id}")  
  49.     public User getUserById(@PathVariable Integer id){  
  50.         User user=null;  
  51.         try {  
  52.             user=userRepository.getUserById(id);  
  53.         }catch (Exception e){  
  54.             user=new User(1,"admin","admin@sina.com");  
  55.             System.out.println("异常信息: "+e.getMessage());  
  56.         }  
  57.         return user;  
  58.     }  
  59.   
  60.     /** 
  61.      * 保存user实体 
  62.      * @param user 
  63.      * @return 
  64.      */  
  65.     @RequestMapping(value = "/save",method = RequestMethod.POST)  
  66.     public int insertUser(User user){  
  67.         int res=1;  
  68.         try {  
  69.             res=userRepository.saveUser(user);  
  70.         }catch (Exception e){  
  71.             System.out.println("异常信息: "+e.getMessage());  
  72.         }  
  73.         return res;  
  74.     }  
  75.   
  76.     /** 
  77.      * 保存User实体-PreparedStatementSetter 
  78.      * @param user 
  79.      * @return 
  80.      */  
  81.     @RequestMapping(value = "/saveWithSafe",method = RequestMethod.POST)  
  82.     public int insertUserWithSafe(User user){  
  83.         int res=1;  
  84.         try {  
  85.             res=userRepository.saveUserWithSafe(user);  
  86.         }catch (Exception e){  
  87.             System.out.println("异常信息: "+e.getMessage());  
  88.         }  
  89.         return res;  
  90.     }  
  91.   
  92.     /** 
  93.      * 保存user实体-PreparedStatementCreator、KeyHolder-保存实体后返回实体的主键 
  94.      * @param user 
  95.      * @return 
  96.      */  
  97.     @RequestMapping(value = "/saveWithKey",method = RequestMethod.POST)  
  98.     public int insertUserWithKey(User user){  
  99.         int res=1;  
  100.         try {  
  101.             res=userRepository.saveUserWithKey(user);  
  102.         }catch (Exception e){  
  103.             System.out.println("异常信息: "+e.getMessage());  
  104.         }  
  105.         return res;  
  106.     }  
  107.   
  108.     /** 
  109.      * 根据id更新user实体 
  110.      * @param id 
  111.      * @param request 
  112.      * @return 
  113.      */  
  114.     @RequestMapping(value = "/update/{id}",method = RequestMethod.POST)  
  115.     public int updateUserWithId(@PathVariable Integer id,HttpServletRequest request){  
  116.         int res=1;  
  117.         try {  
  118.             if (id!=null && !id.equals(0)){  
  119.                 String name=request.getParameter("name");  
  120.                 String email=request.getParameter("email");  
  121.                 User updateUser=new User(id, Strings.isNullOrEmpty(name)?null:name,Strings.isNullOrEmpty(email)?null:email);  
  122.                 res=userRepository.updateUser(updateUser);  
  123.             }  
  124.         }catch (Exception e){  
  125.             System.out.println("异常信息: "+e.getMessage());  
  126.         }  
  127.         return res;  
  128.     }  
  129.   
  130.     /** 
  131.      * 根据id删除user实体 
  132.      * @param id 
  133.      * @return 
  134.      */  
  135.     @RequestMapping("/delete/{id}")  
  136.     public int deleteUserById(@PathVariable Integer id){  
  137.         int res=1;  
  138.         try {  
  139.             User deleteUser=userRepository.getUserById(id);  
  140.             res=userRepository.deleteUser(deleteUser);  
  141.         }catch (Exception e){  
  142.             System.out.println("异常信息: "+e.getMessage());  
  143.         }  
  144.         return res;  
  145.     }  
  146.   
  147.     /** 
  148.      * 根据name查询是否存在某个user实体 
  149.      * @param request 
  150.      * @return 
  151.      */  
  152.     @RequestMapping("/isExistUser")  
  153.     public Boolean isExistUser(HttpServletRequest request){  
  154.         Boolean res=false;  
  155.         try {  
  156.             String name=request.getParameter("name");  
  157.             User queryUser=new User(null,Strings.isNullOrEmpty(name)?null:name,null);  
  158.             User deleteUser=userRepository.getUserByUserName(queryUser);  
  159.             if (deleteUser!=null){  
  160.                 res=true;  
  161.             }  
  162.         }catch (Exception e){  
  163.             System.out.println("异常信息: "+e.getMessage());  
  164.         }  
  165.         return res;  
  166.     }  
  167.   
  168.     /** 
  169.      * 查询user实体的总数 
  170.      * @return 
  171.      */  
  172.     @RequestMapping("/total")  
  173.     public Integer getTotal(){  
  174.         Integer res=0;  
  175.         try {  
  176.             res=userRepository.getCount();  
  177.         }catch (Exception e){  
  178.             System.out.println("异常信息: "+e.getMessage());  
  179.         }  
  180.         return res;  
  181.     }  
  182.   
  183. }  

    至此已经开发完毕了,你可以直接run DemoApplication类,然后在浏览器测试访问,也可以在postman发起访问!下面我才用一键式部署到我的本地tomcat服务器:

   

 


    完了之后,(当然啦,你也可以jar -jar将你的spring boot打包为jar项目,然后Java –jar E:\IDEA_Workspace\springbootJDBC\target\demo-0.0.1-SNAPSHOT.jar 也可以直接跑起来

    好了,现在默认就是启动了这个sb项目,下面就开始访问测试各个服务(开头都以 127.0.0.1:8088/)

    1,首先是获取用户列表:

   

   2、接着是查询id=3 的user实体:



   3、将id=3的实体删除(1:代表操作的记录数-说明已经成功删除)



  4、再次查询出来:



  5、增加一个user实体:



  6、检验一下是否增加该实体成功:



    7、更新id=11的实体的相关数据(1:代表更新成功)



   8、检验一下是否更新数据成功!



    好了,整合完毕!下面提供postman的下载地址(当然了,上面的那些地址其实也可以通过browser进行访问的):

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值