spring boot学习系列:spring boot与jdbcTemplate的整合案例
来源:互联网 发布:怎么投诉淘宝网平台 编辑:程序博客网 时间:2024/06/06 06:37
spring boot学习系列:spring boot与jdbcTemplate的整合案例
简单入门了spring boot后,接下来写写跟数据库打交道的案例。博文采用spring的jdbcTemplate工具类与数据库打交道。
下面是搭建的springbootJDBC的项目的总体架构图:
可以参照上一篇博文,参考参考如何建立一个spring boot项目,至于在选择依赖的配置时候,可以参考我下面贴出的pom.xml:
<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.example</groupId><artifactId>demo</artifactId><version>0.0.1-SNAPSHOT</version><packaging>jar</packaging><name>demo</name><description>Demo project for Spring Boot</description><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>1.5.2.RELEASE</version><relativePath/> <!-- lookup parent from repository --></parent><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding><java.version>1.8</java.version></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-jdbc</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></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-test</artifactId></dependency><dependency><groupId>com.google.guava</groupId><artifactId>guava</artifactId><version>18.0</version></dependency></dependencies><!--spring boot maven插件--><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build></project>
接下来,贴出application.properties,设置tomcat端口号,数据库链接相关信息:
###### 设置tomcat访问端口号 ######server.port=8088###### 设置数据源 ######spring.datasource.url=jdbc:mysql://localhost:3306/db_springboot?autoReconnect=true&useUnicode=true&characterEncoding=utf-8spring.datasource.username=rootspring.datasource.password=123456spring.datasource.driver-class-name=com.mysql.jdbc.Driver#spring.datasource.driverClassName = com.mysql.jdbc.Driver
建立数据库tb_springboot,然后执行下面的sql脚本,生成users表:
/*Navicat MySQL Data TransferSource Server : localhostSource Server Version : 50625Source Host : localhost:3306Source Database : db_springbootTarget Server Type : MYSQLTarget Server Version : 50625File Encoding : 65001Date: 2017-03-31 15:01:08*/SET FOREIGN_KEY_CHECKS=0;-- ------------------------------ Table structure for users-- ----------------------------DROP TABLE IF EXISTS `users`;CREATE TABLE `users` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(255) DEFAULT NULL, `email` varchar(255) DEFAULT NULL, PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8;-- ------------------------------ Records of users-- ----------------------------INSERT INTO `users` VALUES ('1', 'linsen', 'linsen@126.com');INSERT INTO `users` VALUES ('2', 'sam', 'sam@qq.com');INSERT INTO `users` VALUES ('3', 'debug', 'debug@sina.com');INSERT INTO `users` VALUES ('4', '杰克', '杰克@sina.com');INSERT INTO `users` VALUES ('5', '张三', '张三@sina.com');INSERT INTO `users` VALUES ('6', '李四', '李四@sina.com');INSERT INTO `users` VALUES ('7', '王五', '王五@sina.com');INSERT INTO `users` VALUES ('8', '王五2', '王五2@sina.com');
本博文我们对spring boot与jdbcTemplate进行整合,主要当然是实现基本的 增删改查 user实体 操作,首先是开发dao层:
package com.example.repository;import com.example.entity.User;import com.example.exception.UserException;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.jdbc.core.JdbcTemplate;import org.springframework.jdbc.core.PreparedStatementCreator;import org.springframework.jdbc.core.PreparedStatementSetter;import org.springframework.jdbc.core.RowMapper;import org.springframework.jdbc.support.GeneratedKeyHolder;import org.springframework.jdbc.support.KeyHolder;import org.springframework.stereotype.Repository;import org.springframework.transaction.annotation.Transactional;import java.sql.Connection;import java.sql.PreparedStatement;import java.sql.ResultSet;import java.sql.SQLException;import java.util.ArrayList;import java.util.List;/** * Created by steadyjack on 2017/3/22. * 充当dao层UserRepository */@Repositorypublic class UserRepository { @Autowired private JdbcTemplate jdbcTemplate; /** * 获取用户列表 * @return * @throws Exception */ @Transactional(readOnly = true) public List<User> getUserList() throws Exception{ List<User> userList=jdbcTemplate.query("select id,name,email from users",new UserRowMapper()); System.out.println(userList); return userList; } /** * 根据用户id获取用户 * @param id * @return * @throws Exception */ @Transactional(readOnly = true) public User getUserById(Integer id) throws Exception{ //queryForObject:找不到会报异常 query:找不到则Null //User user=jdbcTemplate.queryForObject("select id,name,email from users where id=?",new Object[]{id},new UserRowMapper()); List<User> userList=jdbcTemplate.query("select id,name,email from users where id=?",new Object[]{id},new UserRowMapper()); User user=null; if (!userList.isEmpty()){ user=userList.get(0); } System.out.println(user); return user; } /** * 插入用户数据 * @param user * @return * @throws Exception */ public int saveUser(final User user) throws Exception{ int resRow=jdbcTemplate.update("INSERT INTO users(id,name,email) VALUES(NULL,?,?)",new Object[]{ user.getName(),user.getEmail() }); System.out.println("操作结果记录数: "+resRow); return resRow; } /** * 插入用户数据-防止sql注入 * @param user * @return * @throws Exception */ public int saveUserWithSafe(final User user) throws Exception{ int resRow=jdbcTemplate.update("INSERT INTO users(id,name,email) VALUES(NULL,?,?)", new PreparedStatementSetter() { @Override public void setValues(PreparedStatement ps) throws SQLException { ps.setString(1,user.getName()); ps.setString(2,user.getEmail()); } }); System.out.println("操作结果记录数: "+resRow); return resRow; } /** * 插入用户数据-防止sql注入-可以返回该条记录的主键(注意需要指定主键) * @param user * @return * @throws Exception */ @Transactional(rollbackFor=UserException.class) public int saveUserWithKey(final User user) throws Exception{ String sql="INSERT INTO users(id,name,email) VALUES(NULL,?,?)"; KeyHolder keyHolder=new GeneratedKeyHolder(); int resRow=jdbcTemplate.update(new PreparedStatementCreator() { @Override public PreparedStatement createPreparedStatement(Connection conn) throws SQLException { PreparedStatement ps=conn.prepareStatement(sql,new String[]{"id"}); //指定 id 为主键 ps.setString(1,user.getName()); ps.setString(2,user.getEmail()); return ps; } },keyHolder); System.out.println("操作结果记录数: "+resRow+" 主键: "+keyHolder.getKey()); return Integer.parseInt(keyHolder.getKey().toString()); } /** * 更新用户信息 * @param user * @return */ public int updateUser(final User user) throws Exception{ String sql="update users set name=?,email=? where id=?"; int resRow=jdbcTemplate.update(sql, new PreparedStatementSetter() { @Override public void setValues(PreparedStatement preparedStatement) throws SQLException { preparedStatement.setString(1,user.getName()); preparedStatement.setString(2,user.getEmail()); preparedStatement.setInt(3,user.getId()); } }); System.out.println("操作结果记录数: "+resRow); return resRow; } /** * 删除用户 * @param user * @return * @throws Exception */ public int deleteUser(final User user) throws Exception{ int resRow=jdbcTemplate.update("DELETE FROM users WHERE id=?", new PreparedStatementSetter() { @Override public void setValues(PreparedStatement ps) throws SQLException { ps.setInt(1,user.getId()); } }); System.out.println("操作结果记录数: "+resRow); return resRow; } /** * 根据用户名查找用户-用于判断用户是否存在 * @param user * @return * @throws Exception */ public User getUserByUserName(final User user) throws Exception{ String sql="select id,name,email from users where name=?"; List<User> queryList=jdbcTemplate.query(sql,new UserRowMapper(),new Object[]{user.getName()}); if (queryList!=null && queryList.size()>0){ return queryList.get(0); }else{ return null; } } /** * 获取记录数 * @return * @throws Exception */ public Integer getCount() throws Exception{ String sql="select count(id) from users"; //jdbcTemplate.getMaxRows(); Integer total=jdbcTemplate.queryForObject(sql,Integer.class); System.out.println("操作结果记录数: "+total); return total; } //其他的像模糊查询之类的可以自己尝试查查 jdbcTemplate 的使用文档}/** * 行映射 */class UserRowMapper implements RowMapper<User>{ @Override public User mapRow(ResultSet resultSet, int i) throws SQLException { User user=new User(); user.setId(resultSet.getInt("id")); user.setName(resultSet.getString("name")); user.setEmail(resultSet.getString("email")); return user; }}代码以及相关的注释我已经写在里面了,个人觉得很清晰了,如果有啥问题,可以下面留言,或者后面提到的技术交流群交流。
接下来,当然是开发controller层,在这里,我主要开发rest服务接口,结果将以json的格式返回给发起请求的客户端(以postman进行模拟),下面是我的restController:
package com.example.controller;import com.example.DemoApplication;import com.example.entity.User;import com.example.repository.UserRepository;import com.google.common.base.Strings;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.boot.test.context.SpringBootTest;import org.springframework.web.bind.annotation.PathVariable;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RequestMethod;import org.springframework.web.bind.annotation.RestController;import javax.servlet.http.HttpServletRequest;import java.util.List;/** * Created by steadyjack on 2017/3/22. */@SpringBootTest(classes = DemoApplication.class)@RestController@RequestMapping("/user")public class UserController { @Autowired private UserRepository userRepository; /** * 用户列表 * @return */ @RequestMapping("/list") public List<User> listUser() { List<User> userList=null; try { userList=userRepository.getUserList(); }catch (Exception e){ System.out.println("异常信息: "+e.getMessage()); } return userList; } /** * 根据id查询User实体 * @param id * @return */ @RequestMapping("/{id}") public User getUserById(@PathVariable Integer id){ User user=null; try { user=userRepository.getUserById(id); }catch (Exception e){ user=new User(1,"admin","admin@sina.com"); System.out.println("异常信息: "+e.getMessage()); } return user; } /** * 保存user实体 * @param user * @return */ @RequestMapping(value = "/save",method = RequestMethod.POST) public int insertUser(User user){ int res=1; try { res=userRepository.saveUser(user); }catch (Exception e){ System.out.println("异常信息: "+e.getMessage()); } return res; } /** * 保存User实体-PreparedStatementSetter * @param user * @return */ @RequestMapping(value = "/saveWithSafe",method = RequestMethod.POST) public int insertUserWithSafe(User user){ int res=1; try { res=userRepository.saveUserWithSafe(user); }catch (Exception e){ System.out.println("异常信息: "+e.getMessage()); } return res; } /** * 保存user实体-PreparedStatementCreator、KeyHolder-保存实体后返回实体的主键 * @param user * @return */ @RequestMapping(value = "/saveWithKey",method = RequestMethod.POST) public int insertUserWithKey(User user){ int res=1; try { res=userRepository.saveUserWithKey(user); }catch (Exception e){ System.out.println("异常信息: "+e.getMessage()); } return res; } /** * 根据id更新user实体 * @param id * @param request * @return */ @RequestMapping(value = "/update/{id}",method = RequestMethod.POST) public int updateUserWithId(@PathVariable Integer id,HttpServletRequest request){ int res=1; try { if (id!=null && !id.equals(0)){ String name=request.getParameter("name"); String email=request.getParameter("email"); User updateUser=new User(id, Strings.isNullOrEmpty(name)?null:name,Strings.isNullOrEmpty(email)?null:email); res=userRepository.updateUser(updateUser); } }catch (Exception e){ System.out.println("异常信息: "+e.getMessage()); } return res; } /** * 根据id删除user实体 * @param id * @return */ @RequestMapping("/delete/{id}") public int deleteUserById(@PathVariable Integer id){ int res=1; try { User deleteUser=userRepository.getUserById(id); res=userRepository.deleteUser(deleteUser); }catch (Exception e){ System.out.println("异常信息: "+e.getMessage()); } return res; } /** * 根据name查询是否存在某个user实体 * @param request * @return */ @RequestMapping("/isExistUser") public Boolean isExistUser(HttpServletRequest request){ Boolean res=false; try { String name=request.getParameter("name"); User queryUser=new User(null,Strings.isNullOrEmpty(name)?null:name,null); User deleteUser=userRepository.getUserByUserName(queryUser); if (deleteUser!=null){ res=true; } }catch (Exception e){ System.out.println("异常信息: "+e.getMessage()); } return res; } /** * 查询user实体的总数 * @return */ @RequestMapping("/total") public Integer getTotal(){ Integer res=0; try { res=userRepository.getCount(); }catch (Exception e){ System.out.println("异常信息: "+e.getMessage()); } return res; }}
至此已经开发完毕了,你可以直接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进行访问的):
如果有任何问题可以下面留言!如果想交流java方方面面的开源的技术,可以加入群: 583522159 我叫debug,我也在学习中,希望可以一同进步!
- spring boot学习系列:spring boot与jdbcTemplate的整合案例
- Spring Boot整合jdbctemplate
- Spring Boot 使用JdbcTemplate
- spring boot之JdbcTemplate
- Spring Boot (六) JdbcTemplate
- spring boot jdbctemplate使用
- spring boot集成JdbcTemplate
- Spring boot 五 jdbcTemplate
- spring boot学习系列:spring boot的单元测试实战
- Spring Boot 学习9--使用JdbcTemplate
- Spring boot 与 JdbcTemplate 一起工作
- spring boot 与 JdbcTemplate 一起工作
- Spring Boot 与 Spark的整合
- spring boot与fastdfs的整合使用
- Spring Boot与Logstash整合
- Spring Boot与ActiveMQ整合
- Spring Boot 整合 Thymeleaf 完整 Web 案例
- Spring Boot 整合 Thymeleaf 完整 Web 案例
- System.Data.OracleClient 与Oracle.ManagedDataAccess.Client
- A/B----乘法逆元
- java猜数游戏
- (解决问题-权限)对于能查看另一个用户视图却不能引用N01
- TF-IDF权重算法讲解
- spring boot学习系列:spring boot与jdbcTemplate的整合案例
- Web项目在启动时启动一个服务或者实例化一个对象
- C++ primer plus--第八章(一)
- angularjs 页面跳转
- Socket报错
- 最受欢迎的Java第三方库
- Android平台OCR工具之Tess-two使用
- C++继承与派生
- 《跟我学Shiro》教程PDF版