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 를 직접 밀봉 할 수 있 습 니 다.본문 이 모두 에 게 유용 하 기 를 바란다.
자,이상 이 이 글 의 모든 내용 입 니 다.본 논문 의 내용 이 여러분 의 학습 이나 업무 에 어느 정도 참고 학습 가 치 를 가지 기 를 바 랍 니 다.여러분 의 저희 에 대한 지지 에 감 사 드 립 니 다.

좋은 웹페이지 즐겨찾기