SpringBoot MyBatisの設定


📌 MyBatis


これは、オブジェクト向け言語javaを使用してリレーショナル・データベースのプログラミングを容易に支援するフレームワークです.
  • JavaオブジェクトとSQL間の自動マッピングをサポートします.
  • Javaは、リレーショナル・データベース・プログラミングのためのJDBCを提供します.
    cf) JDBC
    -Javaプログラムがデータベースに接続され、データ交換が可能なプログラミングインターフェース
  • .
  • JDBCは、様々なリレーショナル・データベースのプログラミングにAPIを提供する.
    MyBasisはJDBCをより使いやすくするために開発されました.
  • ✔MyBasisの特性

  • SQLを個別のファイルとして管理します.(完全離脱コード)
  • 生産性:コード短縮.
  • の保守性が向上:MapperファイルにSQLコードのみを入力し、以降SQLコードを変更するときはここでのみメンテナンスを行い、DAOは影響を受けません.DAOでは、Mapperファイルに書かれたSQLコードをインポートするだけなので.
  • HiberateやJava Persistence APIのように新しいDBプログラミングモードを熟知する必要がなく、SQLを直接使用してJDBCコードの作成の不便を解消し、ドメインオブジェクトやVOオブジェクトを中心に開発することができます.
  • ✔ MyBatis Architecture



    ✔Springboot-MyBasis設定

  • 依存性
  • を追加
    implementation 'org.springframework.boot:spring-boot-starter-data-jdbc'
    implementation 'org.mybatis.spring.boot:mybatis-spring-boot-starter:2.1.4'
  • データベース(アプリケーション.yml)
  • への接続
    spring:
      datasource:
        driver-class-name: com.mysql.jdbc.Driver
        url: jdbc:mysql://localhost:3306/mybatis?characterEncoding=UTF-8&useTimezone=true&serverTimezone=Asia/Seoul
        username: [username]
        password: [password]
    mybatis: # type을 쉽게 쓰기 위해서 dto 패키지를 type-aliaes에 설정
      type-aliases-package: com.may.mybatispractice.dto 
    cf)接続テスト
    @RunWith(SpringJUnit4ClassRunner.class)
    @SpringBootTest
    public class ConnectionTests {
    
        @Autowired
        private SqlSessionFactory sqlSessionFactory;
    
        @Test
        public void connection_test(){
            try(Connection con = sqlSessionFactory.openSession().getConnection()){
                System.out.println("커넥션 성공");
            }catch(Exception e){
                e.printStackTrace();
            }
        }
    }
  • プロジェクト構造
    プロジェクト構造に示すように、
    resourcesサブアイテムと同じcom.may.クリープ経路を形成する.
    次に、Mapperディレクトリを作成し、UserMapperインタフェースと同じパスに配置します.
  • データメソッド2種
  • UserMapper.xmlの代わりに音声を使用してデータにアクセスできます.
  • @Mapper
    public interface UserMapper {
    
        @Select("SELECT * FROM user")
        List<UserDto> findAll();
        
        @Select("SELECT * FROM user where id = #{id}")
        UserDto findById(Long id);
        
        @Insert("INSERT INTO user (name, age) values (#{name}, #{age})")
        void save(@Param("name") String name, @Param("age") int age);
    }
  • UserMapper.xmlの使用
    上のコードから文法を削除するだけでいいです.
  • @Mapper
    public interface UserMapper {
    
        List<UserDto> findAll();
    
        UserDto findById(Long id);
    
        String nameCheck(String name);
    
        void save(@Param("name") String name, @Param("age") int age);
    }
    resources > com.may.mybatis.practice.mapper > UserMapper.xml
    <?xml version="1.0" encoding="UTF-8" ?>
    
    <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
            "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    
    <mapper namespace="com.may.mybatispractice.mapper.UserMapper">
        <select id="findById" resultType="UserDto">
            SELECT * FROM user WHERE id = #{id}
        </select>
        
        <select id="findAll" resultType="UserDto">
            SELECT * FROM user
        </select>
    
        <select id="nameCheck" resultType="String">
            SELECT COUNT(name) FROM user WHERE name = #{name}
        </select>
    
        <insert id="save">
            INSERT INTO user (name, age) values (#{name}, #{age})
        </insert>
    </mapper>
    application.ymlでtype-aliases-package: com.may.mybatispractice.dto が作成されました.
    resultTypeは、UserDtoとして直接記述できます.

    ✔表自動生成、データ挿入

    spring:
    	schema: classpath:schema.sql
    追加後、resources>schema.sqlを作成します.
    このファイルにSQL構文を挿入し、ctrl+enterを押してクエリーを実行します.
    ex)
    DROP TABLE IF EXISTS board;
    
    create table board (
                           id BigInt not null auto_increment,
                           user_id BigInt not null,
                           title varchar(100) not null,
                           content varchar(255),
                           regdate timestamp default now(),
                           primary key(id),
                           FOREIGN KEY (user_id) REFERENCES user(id)
    );
    alter table user modify id int not null auto_increment;
    INSERT INTO board(user_id, title, content) VALUES (1, 'title1', '');

    ✔insert直後にPK(auto increment)値を取得する


    ユーザデータを挿入するとsave時にパラメータがname,ageを渡す.これじゃPK値が戻らない.
    今PK値を持ってきてみましょう.
    パラメータでBoardtoを渡した後、PK値BoardIdを訪問者メソッドにインポートすればよい.

    BoardMapper Interface

        int save(BoardDto boardDto);

    BoardMapper SQL

    <insert id="save" useGeneratedKeys="true" keyProperty="boardId">
    	INSERT INTO board (userId, title, content) values (#{userId}, #{title}, #{content})
    </insert>
    useGeneratedKeys="true" keyProperty="boardId"Mapperに追加すると、自動的に値が入力されます.

    BoardDto

    @AllArgsConstructor
    @NoArgsConstructor
    @Getter
    @Setter
    public class BoardDto {
    
        private Long boardId;
    
        private Long userId;
    
        private String title;
    
        private String content;
    
    }

    BoardService

    @Transactional
    public Long save(BoardDto boardDto){
    	if(boardMapper.save(boardDto) == 0){
        		throw new IllegalArgumentException("데이터베이스에 저장되지 않았습니다.");
           	}
    	return boardDto.getBoardId(); // 생성된 데이터의 pk값을 가져온다.
    }
  • Option Usesコメントリンク
    ( nullを返さないで )