SpringBoot MyBatisの設定
22246 ワード
📌 MyBatis
これは、オブジェクト向け言語javaを使用してリレーショナル・データベースのプログラミングを容易に支援するフレームワークです.
cf) JDBC
-Javaプログラムがデータベースに接続され、データ交換が可能なプログラミングインターフェース
MyBasisはJDBCをより使いやすくするために開発されました.
✔MyBasisの特性
✔ 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'
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インタフェースと同じパスに配置します.
@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);
}
上のコードから文法を削除するだけでいいです.
@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값을 가져온다.
}
( nullを返さないで )
Reference
この問題について(SpringBoot MyBatisの設定), 我々は、より多くの情報をここで見つけました https://velog.io/@ayoung0073/springboot-MyBatisテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol