spring boot 개발 웹 api 응용 실천 (2) 조작 데이터베이스
이전 글 (spring boot 개발 웹 api 응용 실천 (1) 입문) 에 서 는 spring boot 를 이용 하여 웹 응용 을 만 드 는 방법 을 간단하게 소개 하 였 으 나 데이터 베이스 작업 층 이 없 으 며, 이 편 은 데이터 베이스 작업 층 을 어떻게 인용 하 는 지 소개 합 니 다.
단계: 1. 사전 준비 - 데이터베이스 만 들 기
2. pom. xml 파일 을 편집 하여 spring - boot - starter - jdbc 의존 도 를 추가 합 니 다.
3. application. properties 파일 설정 데이터 원본 편집
4. DAO 인터페이스 코드 작성
5. 서비스 인터페이스 코드 작성
6. 컨트롤 러 층 로그 인 컨트롤 러 수정
사전 준비
my sql 에 test 데 이 터 를 새로 만 들 고 tbl 을 만 듭 니 다.사용자 테이블
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;
2. pom. xml 파일 편집:
jdbc 관련 의존 도 를 증가 시 킵 니 다:
org.springframework.boot
spring-boot-starter-jdbc
compile
mysql
mysql-connector-java
runtime
3. 데이터 원본 설정:
프로젝트 의 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 의 공식 문 서 를 참고 하 십시오.
4. 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 void removeDupData(List inList){
int size = inList.size();
List retList = new ArrayList(size);
inList.forEach(m -> {
if(!retList.contains(m)){
retList.add(m);
}
});
inList.clear();
inList.addAll(retList);
}
// in
protected List> divideArrayForSqlIn(List inList){
removeDupData(inList);
return Lists.partition(inList, MAX_IN_SIZE);
}
protected String whereIn(List 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 String multiValue(List 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(){
@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(){
@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);
}
}
5. 서비스 계층 코드 작성
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;
}
}
6. LoginController 수정 (spring boot 개발 웹 api 응용 실천 참조 (1) 입문)
@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 연결 풀 을 자동 으로 설치 하고 데이터 원본 과 jdbc Template 를 자동 으로 초기 화 합 니 다.
그리고 브 라 우 저 주소 표시 줄 에 접근:http://localhost:8080/login?acct=zweichxu&pwd=123, 브 라 우 저 페이지 반환 값 을 볼 수 있 습 니 다.
다음 편 은 tomcat - jdbc 연결 풀 을 proxool 연결 풀 로 바 꾸 는 방법 을 소개 합 니 다. (개인 적 으로 proxool 연결 풀 을 좋아 합 니 다 ^ ^)
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
thymeleaf로 HTML 페이지를 동적으로 만듭니다 (spring + gradle)지난번에는 에서 화면에 HTML을 표시했습니다. 이번에는 화면을 동적으로 움직여보고 싶기 때문에 입력한 문자를 화면에 표시시키고 싶습니다. 초보자의 비망록이므로 이상한 점 등 있으면 지적 받을 수 있으면 기쁩니다! ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.