在上一篇文章(spring boot开发web api应用实践(一)入门),简单介绍了如何利用spring boot搭建一个web应用,但是没有数据库操作层,本篇介绍如何引用数据库操作层。
步骤:1.前置准备---创建数据库
2.编辑pom.xml文件添加spring-boot-starter-jdbc依赖
3.编辑application.properties文件配置数据源
4.编写DAO接口代码
5.编写Service接口代码
6.修改Controller层LoginController
一、前置准备
在mysql中新建test数据,并创建tbl_user表
CREATE TABLE `tbl_user` ( `id` int(10) NOT NULL AUTO_INCREMENT, `account` varchar(32) NOT NULL COMMENT '账户名 account name', `password` varchar(128) NOT NULL COMMENT '密码 password', `name` varchar(256) NOT NULL COMMENT '名字', `email` varchar(256) NOT NULL COMMENT 'email', `last_login_date` datetime DEFAULT NULL COMMENT '最近登录时间', `incorrect_login_attempt` int(10) NOT NULL DEFAULT '0' COMMENT '错误登录次数,登录成功后会重置为0', `is_locked_out` int(1) NOT NULL DEFAULT '0' COMMENT '用户是否锁定' PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
二、编辑pom.xml文件:
在<dependencies>里面增加jdbc相关依赖:
<!-- 开启数据库访问层:自动注入数据源、默认采用tomcat-jdbc连接池,默认使用spring-jdbc 默认自动开启事务配置,在需要事务的类或方法上使用@Transactional --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jdbc</artifactId> <scope>compile</scope> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope> </dependency>
三、配置数据源:
在工程的src\main\resources目录下面创建application.properties文件,这是spring boot的默认配置文件,可以做一些定制化的配置,如数据库配置:
spring.datasource.url=jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=UTF-8&useSSL=false spring.datasource.username=root spring.datasource.password=root spring.datasource.driver-class-name=com.mysql.jdbc.Driver spring.datasource.max-idle=20 spring.datasource.min-idle=5 spring.datasource.initial-size=5 spring.datasource.max-wait=10000 spring.datasource.validation-query=SELECT 1 spring.datasource.test-on-borrow=false spring.datasource.test-while-idle=true spring.datasource.time-between-eviction-runs-millis=18800 spring.datasource.jdbc-interceptors=ConnectionState;SlowQueryReport(threshold=3)
上一篇入门中,结尾提到修改默认访问端口,即在application.properties文件配置server.port即可:
server.port=18081
还可以配置tomcat相关配置项,如:
server.tomcat.minSpareThreads=5 server.tomcat.maxThreads=150 server.tomcat.uriEncoding=utf-8
这些都是spring boot默认支持的配置项,更多配置项请自行参考spring boot的官方文档。
四、编写dao层
JdbcBaseDAO.java
package com.zweichxu.springboot.dao; import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; import java.util.List; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.jdbc.core.JdbcTemplate; import com.google.common.collect.Lists; import com.zweichxu.platform.entity.SqlParams; public class JdbcBaseDAO{ public static final int MAX_IN_SIZE = 1000; @Autowired protected JdbcTemplate jdbcTemplate; //移除集合中的重复值 private <M> void removeDupData(List<M> inList){ int size = inList.size(); List<M> retList = new ArrayList<M>(size); inList.forEach(m -> { if(!retList.contains(m)){ retList.add(m); } }); inList.clear(); inList.addAll(retList); } //将in集合分组 protected <M> List<List<M>> divideArrayForSqlIn(List<M> inList){ removeDupData(inList); return Lists.partition(inList, MAX_IN_SIZE); } protected <M> String whereIn(List<M> c, SqlParams params){ int size = c.size(); if(size <= 0){ throw new RuntimeException("数据集合为空,无法拼装 where in 语句"); } StringBuilder sb = new StringBuilder(); c.forEach(m -> { sb.append("?,"); params.addParam(m); }); return sb.substring(0, sb.length() - 1); } protected String whereIn(Object[] c, SqlParams params){ int size = c.length; if(size <= 0){ throw new RuntimeException("数据集合为空,无法拼装 where in 语句"); } StringBuilder sb = new StringBuilder(); for(int i = 0; i < size; i++){ sb.append("?,"); params.addParam(c[i]); } return sb.substring(0, sb.length() - 1); } protected <M> String multiValue(List<M> c, SqlParams params){ int size = c.size(); if(size <= 0){ throw new RuntimeException("数据集合为空,无法拼装 where in 语句"); } StringBuilder sb = new StringBuilder(); if (size > 1){ sb.append(" in (").append(whereIn(c, params)).append(")"); }else{ sb.append("=?"); params.addParam(c.get(0)); } return sb.toString(); } }
UserDAO.java
package com.zweichxu.springboot.dao; import java.sql.ResultSet; import java.sql.SQLException; import java.util.List; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.dao.DataAccessException; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.jdbc.core.ResultSetExtractor; import org.springframework.jdbc.core.RowMapper; import org.springframework.stereotype.Repository; import com.zweichxu.springboot.model.User; /** * @author zweichxu * @date 2017年3月30日 15:40:56 * @version 1.0 */ @Repository(UserDAO.ANNOTATION_NAME) public class UserDAO extends JdbcBaseDAO { public final static String ANNOTATION_NAME = "userDAO"; public User findUserByAccount(String acct){ String sql = "select `id`, `account`, `password`, `name`, `email` from tbl_user where `account`=?"; return jdbcTemplate.query(sql, new ResultSetExtractor<User>(){ @Override public User extractData(ResultSet rs) throws SQLException, DataAccessException{ if (rs.next()){ return parseUser(rs); } return null; } }, acct); } public User findUserById(int id){ String sql = "select `id`, `account`, `password`, `name`, `email` from tbl_user where `id`=?"; return jdbcTemplate.query(sql, new ResultSetExtractor<User>(){ @Override public User extractData(ResultSet rs) throws SQLException, DataAccessException{ if (rs.next()){ return parseUser(rs); } return null; } }, id); } public void updateUserLoginInfo(int id, int isLockedOut, int incorrectLoginAttempt){ String sql = "update tbl_user set is_locked_out =?, incorrect_login_attempt =?," + " last_login_date =now() where `id`=?"; jdbcTemplate.update(sql, isLockedOut, incorrectLoginAttempt, id); } private User parseUser(ResultSet rs) throws SQLException{ User user = new User(); user.setId(rs.getInt("id")); user.setAccount(rs.getString("account")); user.setPassword(rs.getString("password")); user.setName(rs.getString("name")); user.setEmail(rs.getString("email")); user.setIsLockedOut(covert(rs.getInt("is_locked_out"))); user.setIncorrectLoginAttempt(rs.getInt("incorrect_login_attempt")); user.setLastLoginDate(rs.getTimestamp("last_login_date")); return user; } private boolean covert(Integer value){ return value==null?false:(value==1?true:false); } }
五、编写Service层代码
UserService.java
package com.zweichxu.springboot.service; import java.util.HashSet; import java.util.List; import java.util.Set; import javax.annotation.Resource; import org.springframework.stereotype.Service; import com.zweichxu.platform.entity.BaseResp; import com.zweichxu.platform.entity.ServiceException; import com.zweichxu.springboot.dao.UserDAO; import com.zweichxu.springboot.model.User; @Service(UserService.ANNOTATION_NAME) public class UserService { public final static String ANNOTATION_NAME = "userService"; @Resource(name=UserDAO.ANNOTATION_NAME) private UserDAO userDao; public User doLogin(String acct, String pwd){ User user = userDao.findUserByAccount(acct); if (user == null || !pwd.equals(user.getPassword())){ int maxErr = 5; int errCnt = 0; if (user != null){ errCnt = user.getIncorrectLoginAttempt() + 1; userDao.updateUserLoginInfo(user.getId(), errCnt>=maxErr?1:0, errCnt); } throw new ServiceException(BaseResp.DATA_NOT_EXIST, errCnt>=maxErr?"用户名或密码错误,您已尝试多次,帐号已被锁定":"用户名或密码错误"); } if (user.getIsLockedOut()){ throw new ServiceException(BaseResp.DATA_NOT_EXIST, "您的帐号已被锁定,请联系管理员"); } userDao.updateUserLoginInfo(user.getId(), 0, 0); return user; } }
六、修改LoginController(参见spring boot开发web api应用实践(一)入门)
@Resource(name=UserService.ANNOTATION_NAME) private UserService userService; //注入Service类 @RequestMapping(value="login") public BaseResp doLogin(@RequestParam("acct") String userName, @RequestParam("pwd") String password){ if (Util.isEmpty(userName) || Util.isEmpty(password)){ return BaseResp.fail(BaseResp.RET_CODE_PROTOCOL_ERROR, "用户名及密码均不能为空"); } //do something try{ User user = userService.doLogin(userName, password); return BaseResp.success().setRetMsg("登录成功").addProperty("loginUser", user); }catch(ServiceException e){ return BaseResp.fail(e.getRetCode(), e.getMessage()); } }
要想引入数据库操作,关键在于添加spring-boot-starter-jdbc依赖,然后spring boot会根据配置的数据库信息及连接池参数,自动装配tomcat-jdbc连接池,并自动初始化数据源及JdbcTemplate;
然后在浏览器地址栏访问:http://localhost:8080/login?acct=zweichxu&pwd=123,可以看到浏览器页面返回值
下一篇介绍如何将tomcat-jdbc连接池换成proxool连接池(个人喜欢proxool连接池 ^_^)
相关推荐
Spring Boot简化了基于Spring的应用开发,通过少量的代码就能创建一个独立的、产品级别的Spring应用。 Spring Boot为Spring平台及第三方库提供开箱即用的设置,这样你就可以有条不紊地开始。多数Spring Boot应用只...
基于 Spring Boot 的设备管理系统是一个用于管理设备信息和进行设备操作的应用程序。它使用 Spring Boot 框架来构建后端服务,并提供了 RESTful API 接口以与前端或其他客户端进行通信。 以下是创建基于 Spring ...
- chapter1:[基本项目构建(可作为工程脚手架),引入web模块,完成一个简单的RESTful API](http://blog.didispace.com/spring-boot-learning-1/) - [使用Intellij中的Spring Initializr来快速构建Spring Boot/...
Java SSM项目是一种使用Java语言和SSM框架(Spring + Spring MVC + MyBatis)开发的Web应用程序。SSM是一种常用的Java开发框架组合,它结合了Spring框架、Spring MVC框架和MyBatis框架的优点,能够快速构建可靠、...
Spring Boot 实践折腾记的代码实现package说明:boot学习Spring Boot的文章集合入门Web应用操作数据库序列化API化Spring Boot 实践折腾记(8):极速简化MVCSpring Boot 实践折腾记(9):快速构建 Web API响应式...
2018年Java Activiti6.x 视频整合Spring Boot/JPA/WEB框架实战 01 Activiti介绍与搭建开发环境 02 运行官方例子 03 编写第一个Activiti程序 04 流程引擎配置与服务组件 05 Activiti数据库介绍 06 API(1)...
基于Spring Boot的装饰工程管理系统是一个使用Java语言和Spring Boot框架开发的Web应用程序,用于帮助装饰公司管理和跟踪工程项目。该系统使用了MySQL作为后端数据库来存储数据。 技术介绍: Spring Boot:一个...
开发您的第一个Spring Boot应用程序 11.1.创建POM 11.2.添加Classpath依赖项 11.3.编写代码 11.3.1.@RestController和@RequestMapping Annotations 11.3.2.@EnableAutoConfiguration注释 11.3.3....
4.当然也鼓励大家基于此进行二次开发。 5.期待你能在项目中找到乐趣和灵感,也欢迎你的分享和反馈! 【资源说明】 项目简介 开发环境 * 操作系统:Windows 10 * 开发工具:Intellij IDEA * 数据库:MySQL 5.7.22 *...
一个简单的博客后台,采用了Spring Boot + Vue 的前后端分离系统。其中blog-admin是一个基于security后台权限管理系统(随便写着玩的),blog-api是博客后台,blog-app是前端Vue项目。 后端技术使用 核心框架:...
以下是关于该项目的一些关键特点和技术亮点:基于Spring Boot技术:Spring Boot是一种流行的Java开发框架,用于创建独立、生产级的Spring应用程序。它简化了配置和部署过程,使得开发者能够更快速地搭建和运行应用。...
Java SSM项目是一种使用Java语言和SSM框架(Spring + Spring MVC + MyBatis)开发的Web应用程序。SSM是一种常用的Java开发框架组合,它结合了Spring框架、Spring MVC框架和MyBatis框架的优点,能够快速构建可靠、...
带有Spring Boot的Java Smart Point System API RESTful API详细信息 RESTful Smart Point API包含以下特征: 使用Spring Boot和Java 8创建的项目 带有JPA和Spring Data JPAMySQL数据库 使用Spring Security和JWT...
第2章 开启 Spring Boot 的第一个 Web 项目 通过 Spring Initializr 来快速初始化一个 Spring Boot 原型,方便学员来极速体验Spring Boot。 本课程也将会采用Gradle作为项目管理工具,让学员掌握最前瞻的构建工具...
Spring Boot Web应用程序样本 个人门户,Spring Boot和Web应用程序的样本项目 目标 - 커머스 만들기 ???? 环境 Java 11 构建工具等级6.7.1 ./gradlew wrapper --gradle-version 6.7.1 框架-弹簧靴2.4.4 引导程序 ...
在传统Spring应用中使用spring-boot-actuator模块提供监控端点 Spring Boot应用的后台运行配置 Spring Boot自定义Banner Dubbo进行服务治理 chapter9-2-1:Spring Boot中使用Dubbo进行服务治理 chapter9-2-2:Spring...
包含了web开发中常用的功能,如:缓存(redis)、日志、事务、JPA、shiro、安全、常用工具类、swagger2在线接口文档、跨域支持等,可以基于该项目快速进行公司内部的项目开发。 开发工具在软件开发生命周期中扮演...
BankAPI项目作者: Java Spring Boot API描述基于Spring Boot的REST API应用程序。 项目中使用的一种服务,两个存储库,两个持久性对象ORM是Hibernate Persistence DB是MongoDB在两个单独的集合中持久化在一个数据库...
通过对此项目的深入学习与实践,学习者不仅可以掌握Spring Boot的基本使用方法,还能够提升自己在Web开发、数据库操作、前后端交互等方面的技能。 值得一提的是,该系统具有良好的可定制性和二次开发潜力。学习者...
以允许客户端交互构建具有操作数据能力的简单用户界面具有数据库和前端触摸api的服务器部署外部案例研究证明了类似的问题/解决方案技术领域Spring Boot,Docker,React,Recharts,Google Maps and Places API运行...