Spring boot 는 Mybatis 를 통합 하여 다 중 CRUD 작업 의 전체 절 차 를 실현 합 니 다.
관계 형 데이터 베이스 에서 표 간 의 연결 을 곳곳에서 볼 수 있 고 직렬 연결 표 에 대해 첨삭 검 사 를 하 는 것 도 프로그래머 에 게 필수 적 인 기초 기능 이다.Spring Boot 통합 Mybatis 에 대해 서 는 이전에 상세 하 게 썼 습 니 다.익숙 하지 않 은 것 은 Spring Boot 통합 Mybatis 를 돌 이 켜 보고 CRUD 작업 을 완성 할 수 있 습 니 다.이것 은 본 고의 기초 입 니 다.본 고 는 먼저 테스트 데이터 베 이 스 를 준비 한 다음 에 MyBatis Generator 를 사용 하여 일부 코드 를 자동 으로 생 성 한 다음 에 하나의 예 로 약간 고 급 스 러 운 조작 을 보 여 준다.Mybatis 를 사용 하여 한 쌍 이상 의 CRUD 작업 을 완성 한다.
데이터베이스 준비
데이터 베 이 스 는 세 장의 표를 사용 합 니 다:user 표,role 표,userrole 표.user 표 는 사용자 의 정 보 를 저장 하 는 데 사용 합 니 다.role 표 는 캐릭터 정 보 를 저장 하 는 데 사용 된다.user_role 표 는 user 와 role 을 연결 시 키 고 user 와 role 의 매 핑 관 계 를 저장 하여 한 사용자 가 여러 개의 역할 을 할 수 있 도록 합 니 다.모든 역할 은 그 중의 기록 에 대응 합 니 다.
새 사용자 테이블
CREATE TABLE user(
id INT PRIMARY KEY AUTO_INCREMENT,
username VARCHAR(20),
password VARCHAR(20)
)
새 role 테이블 을 만 들 고 데 이 터 를 삽입 합 니 다.
CREATE TABLE role(
id INT PRIMARY KEY AUTO_INCREMENT,
rolename VARCHAR(20)
)
INSERT INTO `role`(`rolename`) VALUES (' ');
INSERT INTO `role`(`rolename`) VALUES (' ');
INSERT INTO `role`(`rolename`) VALUES (' ');
INSERT INTO `role`(`rolename`) VALUES ('AI');
INSERT INTO `role`(`rolename`) VALUES (' ');
결 과 는 그림 과 같다.새 연결 표 userrole
CREATE TABLE user_role(
id INT PRIMARY KEY AUTO_INCREMENT,
userid INT,
roleid INT
)
자동 생 성 코드MyBatis Generator 는 MyBatis 공식 제품 의 코드 생 성기 로 모든 버 전의 MyBatis 와 버 전 2.2.0 이후 의 iBATIS 버 전에 코드 를 생 성 합 니 다.MyBatis 의 mapper,dao,enity 를 자동 으로 생 성하 여 가장 간단 한 중복 코드 작성 을 줄 일 수 있 습 니 다.자세 한 내용 은 홈 페이지 를 확인 할 수 있다.
1.pom.xml 의존 도 추가
<!-- MyBatis Generator -->
<plugin>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-maven-plugin</artifactId>
<version>1.3.7</version>
<configuration>
<verbose>true</verbose>
<overwrite>true</overwrite>
</configuration>
<dependencies>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.16</version>
</dependency>
</dependencies>
</plugin>
2.프로젝트 루트 디 렉 터 리 에 코드 를 자동 으로 생 성 하 는 프로필 generator Config.xml 을 추가 합 니 다.
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE generatorConfiguration
PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
"http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
<generatorConfiguration>
<!-- -->
<properties resource="application.properties"/>
<!--defaultModelType="flat" , -->
<context id="Mysql" targetRuntime="MyBatis3Simple" defaultModelType="flat">
<property name="autoDelimitKeywords" value="true" />
<property name="beginningDelimiter" value="`" />
<property name="endingDelimiter" value="`" />
<property name="javaFileEncoding" value="utf-8" />
<plugin type="org.mybatis.generator.plugins.SerializablePlugin" />
<plugin type="org.mybatis.generator.plugins.ToStringPlugin" />
<!-- -->
<commentGenerator >
<property name="suppressAllComments" value="true"/><!-- -->
<property name="suppressDate" value="true" /> <!-- -->
</commentGenerator>
<!-- -->
<jdbcConnection driverClass="${spring.datasource.driverClassName}"
connectionURL="${spring.datasource.url}"
userId="${spring.datasource.username}"
password="${spring.datasource.password}">
</jdbcConnection>
<!-- -->
<javaTypeResolver>
<!-- bigDecimal, false (Long, Integer, Short, etc.) -->
<property name="forceBigDecimals" value="false"/>
</javaTypeResolver>
<!-- Model -->
<javaModelGenerator targetPackage="com.shangguan.mybatis1.entity" targetProject="src/main/java">
<property name="enableSubPackages" value="true"/>
<property name="trimStrings" value="true"/>
</javaModelGenerator>
<sqlMapGenerator targetPackage="mapper" targetProject="src/main/resources" >
<property name="enableSubPackages" value="false" />
</sqlMapGenerator>
<javaClientGenerator targetPackage="com.shangguan.mybatis1.dao" targetProject="src/main/java" type="XMLMAPPER" >
<property name="enableSubPackages" value="false" />
</javaClientGenerator>
<!-- -->
<table tableName="user" enableCountByExample="true" enableUpdateByExample="true" enableDeleteByExample="true" enableSelectByExample="true" selectByExampleQueryId="true">
<generatedKey column="id" sqlStatement="Mysql" identity="true" />
</table>
<table tableName="role" enableCountByExample="true" enableUpdateByExample="true" enableDeleteByExample="true" enableSelectByExample="true" selectByExampleQueryId="true">
<generatedKey column="id" sqlStatement="Mysql" identity="true" />
</table>
<table tableName="user_role" enableCountByExample="true" enableUpdateByExample="true" enableDeleteByExample="true" enableSelectByExample="true" selectByExampleQueryId="true">
<generatedKey column="id" sqlStatement="Mysql" identity="true" />
</table>
</context>
</generatorConfiguration>
3.Maven 을 사용 하여 코드 생 성:저 는 Eclipse 를 사용 합 니 다.프로젝트 디 렉 터 리 에서 Run as-->Maven build 를 오른쪽 클릭 하고 Goals 에 my batis-generator:generate 명령 을 입력 하면 Run 단 추 를 누 르 면 코드 가 자동 으로 생 성 됩 니 다.
코드 를 자동 으로 생 성 할 때 발생 하 는 구덩이
오류 메시지:
Establishing SSL connection without server's identity verification is not recommended.
According to MySQL 5.5.45+, 5.6.26+ and 5.7.6+ requirements SSL
connection must be established by default if explicit option isn't set.
For compliance with existing applications not using
SSL the verifyServerCertificate property is set to 'false'.
You need either to explicitly disable SSL by setting useSSL=false,
or set useSSL=true and provide truststore for server certificate verification.
서버 인증 없 이 SSL 연결 을 권장 하지 않 는 다 는 뜻 이다.MySQL 5.5.45+,5.6.26+,5.7.6+의 요구 에 따라 명시 적 옵션 이 설정 되 어 있 지 않 으 면 기본적으로 SSL 연결 을 만들어 야 합 니 다.useSSL=false 디 스 플레이 를 설정 하여 SSL 을 사용 하지 않 거나 useSSL=true 를 설정 하여 서버 인증서 인증 에 신뢰 저장 소 를 제공 해 야 합 니 다.
솔 루 션:설정 파일 application.properties 에 데이터베이스 연결 뒤에&useSSL=true 를 추가 합 니 다.
Maven 은"BUILD SUCCESS"를 알려 주 었 지만,생 성 된 코드 와 데이터 베 이 스 는 일치 하지 않 습 니 다.알림 코드 가 다시 쓰 여 져 서 오류 가 발생 했 습 니 다.[WARNING]Table Configuration user matched more than one table(springboot..user,mysql..user,webshop..user,jeece-iyangcong..user)...구체 적 인 정 보 는 그림 과 같다.
이 는 MySQL 8.0 버 전 드라이브 가 인자 nullCatalogMeansCurrent 의 기본 값 을 true 에서 false 로 바 꾸 고,MyBatis Generator 를 사용 하여 표 에 대응 하 는 xml 등 을 생 성 할 때 서버 내 모든 데이터베이스 에 있 는 표를 스 캔 하기 때 문 입 니 다.데이터 베 이 스 를 스 캔 하 는 것 이 아 닙 니 다.
솔 루 션:설정 파일 application.properties 에 데이터베이스 연결 뒤에&nullCatalogMeansCurrent=true 를 추가 합 니 다.
의외 의 사고 가 발생 하지 않 으 면 실체 류 파일 3 개,dao 층 파일 3 개,mapper.xml 3 개가 자동 으로 생 성 됩 니 다.이 코드 들 은 매우 길 고 기술적 인 함량 이 없어 서 여기에 붙 이지 않 습 니 다.글 끝의 GitHub 주 소 를 찾 아 볼 필요 가 있 습 니 다.
CRUD 시작
다음은 Service 와 ServiceImpl 에서 dao 층 을 간단하게 포장 해 야 합 니 다.어떻게 써 야 하 는 지 다 들 알 고 있 을 것 입 니 다.여기에 도 코드 를 붙 이지 않 고 글 끝의 GitHub 주 소 를 자세히 보 세 요.
사용자 추가
사용자 의 논 리 를 추가 하 는 것 은 다음 과 같 습 니 다.백 엔 드 는 전단 에서 전 달 된 username,password,roleids 를 두 단계 로 나 누 어 처리 해 야 합 니 다.첫 번 째 단 계 는 username 과 password 를 user 표 에 저장 합 니 다.두 번 째 단 계 는 첫 번 째 생 성 된 userid 와 전단 에서 전 달 된 roleids 를 user 에 저장 합 니 다.role 표.이 두 작업 절 차 는 분명히 업무 의 ACID 특성 을 만족 시 키 는 것 이다.
Spring 은 프로 그래 밍 식 사무 관리 와 성명 식 사무 관리 두 가지 방식 을 지원 합 니 다.프로 그래 밍 식 사 무 는 인 코딩 방식 으로 사 무 를 실현 하 는 것 을 말한다.성명 식 사 무 는 AOP 를 기반 으로 구체 적 인 업무 논리 와 사무 처 리 를 결합 합 니 다.성명 식 사무 관 리 는 업무 코드 논리 가 오염 되 지 않도록 하기 때문에 실제 사용 에서 성명 식 사무 가 비교적 많이 사용 된다.성명 식 사 무 는 두 가지 방식 이 있 습 니 다.하 나 는 설정 파일(xml)에서 관련 된 사무 규칙 설명 을 하 는 것 이 고 다른 하 나 는@Transactional 주 해 를 바탕 으로 하 는 방식 입 니 다.본 고 는@Transactional 주 해 를 직접 사용 하여 사 무 를 실현 합 니 다.이런 방식 은 조작 이 간결 하고 코드 의 가 독성 이 높 기 때 문 입 니 다.
UserController 에 사용자 의 코드 를 추가 하 는 것 은 다음 과 같 습 니 다.
@RequestMapping("/addUser")
@Transactional(rollbackFor={RuntimeException.class, Exception.class})
public Result saveUser(@RequestParam(value = "username") String username,
@RequestParam(value = "password") String password,
@RequestParam(value = "roleids") List<Integer> roleids) {
User user = new User();
user.setUsername(username);
user.setPassword(password);
userService.addUser(user);
for(int i=0;i<roleids.size();i++) {
UserRole userRole = new UserRole();
userRole.setUserid(user.getId());
userRole.setRoleid(roleids.get(i));
userRoleService.addUserRole(userRole);
}
return ResultUtils.result(States.errorCode.SUCCESS, " ", null);
}
PostMan 테스트 로 사용자 추가:인 터 페 이 스 는"성공 추가"라 는 글 자 를 되 돌려 주 고 데이터베이스 에 가서 보 세 요.user 표 에 데이터 가 하나 더 있 습 니 다.userrole 표 에 도 세 개의 데 이 터 를 삽입 했다.이것 이 바로 필요 한 결과 임 이 분명 하 다.이것 은 정확 한 조작 이다.
사용자 삭제
사용자 의 논 리 를 삭제 하 는 것 은 사용자 의 논 리 를 추가 하 는 것 과 비슷 합 니 다.첫 번 째 단 계 는 전단 에서 보 내 온 id 에 따라 user 표 의 기록 을 삭제 합 니 다.두 번 째 userid 삭제 userrole 표 의 기록;이 두 단계 도 업무 특성 을 만족 시 키 고@Transactional 주 해 를 사용 하여 이 루어 집 니 다.
코드 는 다음 과 같 습 니 다:
@RequestMapping("/deleteUserById")
@Transactional(rollbackFor={RuntimeException.class, Exception.class})
public Result deleteUserById(Integer id) {
userService.deleteUserById(id);
List<UserRole> list = userRoleService.selectByUserId(id);
for(int i=0;i<list.size();i++) {
userRoleService.deleteByPrimaryKey(list.get(i).getId());
}
return ResultUtils.result(States.errorCode.SUCCESS, " ", null);
}
PostMan 테스트 를 사용 하여 사용자 삭제:인 터 페 이 스 는'삭제 성공'이라는 글 자 를 추가 한 다음 데이터베이스 에 가서 보 았 습 니 다.user 표 의 id 가 1 인 기록 이 삭제 되 었 습 니 다.userrole 표 에서 userid 가 1 인 세 개의 기록 도 모두 삭제 되 었 다.분명히 이것 이 바로 필요 한 결과 이다.
사용자 수정
사용자 논리 수정:user 표 에서 username 과 password 를 수정 하 는 동시에 userrole 표 에서 사용자 와 캐릭터 의 맵 기록 을 수정 합 니 다.사용자 와 캐릭터 맵 기록 을 수정 하 는 것 은 userid 에 따라 기록 을 삭제 한 다음 에 새로운 맵 정 보 를 삽입 하 는 것 입 니 다.여기 서도@Transactional 주 해 를 사용 하여 사 무 를 수행 합 니 다.
코드 는 다음 과 같 습 니 다:
@RequestMapping("/updateUser")
@Transactional(rollbackFor={RuntimeException.class, Exception.class})
public Result updateUser(@RequestParam(value = "id")Integer id,
@RequestParam(value = "username") String username,
@RequestParam(value = "password") String password,
@RequestParam(value = "roleids") List<Integer> roleids) {
userService.updateUser(id, username, password);
// user_role id
List<UserRole> list = userRoleService.selectByUserId(id);
for(int i=0;i<list.size();i++) {
userRoleService.deleteByPrimaryKey(list.get(i).getId());
}
// roleids
for(int i=0;i<roleids.size();i++) {
UserRole record = new UserRole();
record.setUserid(id);
record.setRoleid(roleids.get(i));
userRoleService.addUserRole(record);
}
return ResultUtils.result(States.errorCode.SUCCESS, " ", null);
}
메모:PostMan 을 사용 하여 테스트 를 진행 할 때 오류 가 발생 했 습 니 다:org.apache.ibatis.binding.bingException:Parameter'username'not found.Available parameters are [0, 1, 2, param3, param1, param2]。
해결 방법:dao 층 의 Mapper.자바 코드 의 매개 변수 에@param 주 해 를 추가 합 니 다.예 를 들 면:
void updateByPrimaryKey(@Param("id")Integer id,
@Param("username")String username, @Param("password")String
password);
PostMan 을 사용 하여 테스트 수정 사용자:결 과 를 되 돌려 주 는 데 문제 가 없습니다.데이터베이스 에 가서 보 세 요.데이터베이스 에 도 문제 가 없습니다.업데이트 작업 이 완료 되 었 습 니 다.
사용자 정보 조회
사용자 의 정 보 를 조회 하려 면 user 표 의 사용자 정보 뿐만 아니 라 user 도 필요 합 니 다.role 표 의 사용자 역할 맵 관 계 는 role 표 의 역할 정보 도 필요 합 니 다.이것 도 표 간 의 연합 이 필요 한 조작 이다.
본 논문 에서 사용 하 는 방법 은 Account Detail 류 를 새로 만들어 정 보 를 통합 하 는 것 이다.
public class UserDetail {
private Integer userid;
private String username;
private String password;
private List<Integer> roleids;
private List<String> rolenames;
// getter setter
}
이것 은 정 보 를 통합 하 는 관건 적 인 코드 이다.
public List<UserDetail> selectAll(){
List<User> userList = new ArrayList<>();
List<UserDetail> details = new ArrayList<>();
try{
userList = userMapper.selectAll();
details = getUserDetails(userList);
}catch(Exception e){
e.printStackTrace();
return details;
}
return details;
}
public List<UserDetail> getUserDetails(List<User> lists){
List<UserDetail> details = new ArrayList<>();
if(lists == null || lists.size() < 1){
return details;
}
Map<Integer, String> nameMap = roleService.getNameMap();
for(int i=0; i< lists.size();i++){
User user = lists.get(i);
UserDetail detail = new UserDetail();
detail.setUserid(user.getId());
detail.setUsername(user.getUsername());
detail.setPassword(user.getPassword());
List<Integer> roleids = new ArrayList<>();
List<String> rolenames = new ArrayList<>();
List<UserRole> userroles = userRoleMapper.selectByUserId(user.getId());
for(int j=0;j<userroles.size();j++) {
roleids.add(userroles.get(j).getRoleid());
rolenames.add(nameMap.get(userroles.get(j).getRoleid()));
}
detail.setRoleids(roleids);
detail.setRolenames(rolenames);
details.add(detail);
}
return details;
}
이것 은 봉 인 된 인터페이스 입 니 다.
@RequestMapping("/getAllUser")
public Result getAllUser() {
List<UserDetail> list = userService.selectAll();
return ResultUtils.result(States.errorCode.SUCCESS, " ", list);
}
PostMan 을 사용 하여 테스트 하여 사용자 정 보 를 조회 합 니 다.이 인 터 페 이 스 는 사용자 의 기본 정보 와 역할 정 보 를 포함 하여 모든 사용자 정 보 를 되 돌려 주 는 것 을 볼 수 있 습 니 다.정확 하고 틀림 없습니다.
총결산
Spring 과 MyBatis 는 한 쌍 의 다 중 관련 첨삭 검 사 를 실현 하 는 데 도 여러 가지 방식 이 있다.MyBatis 를 사용 하여 SQL 문 구 를 정의 하여 실현 할 수 있다.Spring 의 주 해 를 MyBatis 가 자동 으로 생 성 하 는 코드 와 결합 하여 실현 할 수도 있다.저 는 후 자 를 더 좋아 합 니 다.Mybatis Generator 를 통 해 코드 를 자동 으로 생 성 한 후에 이 코드 들 은 더 이상 수정 할 필요 가 없 기 때문에 service 와 contrller 를 직접 밀봉 할 수 있 습 니 다.본문 이 모두 에 게 유용 하 기 를 바란다.
자,이상 이 이 글 의 모든 내용 입 니 다.본 논문 의 내용 이 여러분 의 학습 이나 업무 에 어느 정도 참고 학습 가 치 를 가지 기 를 바 랍 니 다.여러분 의 저희 에 대한 지지 에 감 사 드 립 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Spring과 Hibernate의 통합 사무 관리에 대한 이해Spring 사무 관리를 이야기하기 전에 우리가 Spring을 사용하지 않을 때 Hibernate에서 데이터 조작을 어떻게 하는지 생각해 봅시다.Hibernate에서 우리가 매번 조작을 할 때마다 우리는 먼저 사무를...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.