- 開発技術
MyBatis-Plus Wrapperクラスについて
- #SpringBoot
- #Java
MyBatis-Plusとは?
【エンジニア募集中】フルリモート可◎、売上/従業員数9年連続UP、平均残業8時間、有給取得率90%、年休124日以上 etc. 詳細はこちらから>
JavaのフレームワークであるmyBatisの拡張版で、開発に使用するJava オブジェクトとデータベースレコードとのやり取りをより簡単にするためのフレームワークです。Javaプロジェクトにクエリパラメータ、条件分岐や繰り返し処理などを加えたsql文の記載が可能になります。Wrapperクラスを使用することで、xmlファイルにSQL文を記載することなく、データを取得でき、コードの短縮になるので便利です。
例としてUserテーブルが以下のように定義されているとして、xmlでのuserの取得の書き方と、Wrapperクラスを利用した書き方とで比較していきます。
1 2 3 4 5 6 7 8 |
CREATE TABLE `user` ( `id` bigint(20) NOT NULL COMMENT 'Primary key', `name` varchar(30) DEFAULT NULL COMMENT 'name', `age` int(11) DEFAULT NULL COMMENT 'age', PRIMARY KEY (`id`) ) INSERT INTO `user` VALUES (1,'Jone',18),(2,'Maria',21),(3,'Ken',28); |
ファイル構成は以下の通りです
src/main/java
|_ com.example
|_controller
|_UserController.java
|_dao
|_UserMapper.java
|_entity
|_User.java
|_service
|_UserService.java
impl
|_ UserServiceImpl.java
src/main/resource
|_mapper
|_UserMapper.xml
|_application.yml
application.ymlには、以下の設定を追加してください。
1 |
mybatis-plus: mapper-locations: classpath:mapper/*.xml |
UserMapper.xmlでの取得
UserMapper.xmlでの取得には、com.exapmle下の5つのファイル(controller dao serive entity)と当然ですがsrc/main/resource下のUserMapper.xmlの記載が必要になります。Userテーブルから年齢が20歳以上のレコードを取得するような処理を書いてみましょう。SQL文では以下のようになります。
1 |
SELECT * FROM user WHERE age >= 20; |
UserMapper.xmlはこのようになります。
1 2 3 4 5 6 7 8 |
<?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.example.dao.UserMapper"> <select id="selectUsersAbove20" resultType="com.example.entity.User"> SELECT * FROM user WHERE age >= 20 </select> </mapper> |
mapperタグの属性のnamespaceにはUserMapperのパッケージ名とクラス名を、selectタグの属性のidには後述するserviceに定義するメゾット名を記載します。selectタグ内にさきほどのSQL文があり、取得結果がresultTypeとしてUserのEntityが返されます。そのほかのファイルも以下のように記載します。
UserMapper.java
1 2 3 |
public interface UserMapper extends BaseMapper<User> { List<User> selectUsersAbove20(); } |
User.java
1 2 3 4 5 6 7 |
@Data @TableName("user") public class User { private Long id; private String name; private Integer age; } |
UserService.java
1 2 3 |
public interface UserService { List<User> getUsersAbove20(); } |
UserServiceImpl.java
1 2 3 4 5 6 7 8 9 10 |
@Service public class UserServiceImpl implements UserService { @Autowired private UserMapper userMapper; @Override public List<User> getUsersAbove20() { return userMapper.selectUsersAbove20(); } } |
UserController.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
@RestController @RequestMapping("/users") public class UserController { @Autowired private UserService userService; @GetMapping("/above20") public List<User> getUsersAbove20() { List<User> users = userService.getUsersAbove20() System.out.println(users); return userService.getUsersAbove20(); } } |
“users/above20”のパスにgetリクエストが送信された時のUsersの出力結果
1 2 |
User(id=2, name=Maria, age=21) User(id=3, name=Ken, age=28) |
Wrapperクラスでの取得
User.java、UserController.java、UserService.javaは同じですが、UserMapper.java、UserServiceImpl.javaの記載方法が異なります。
UserMapper.java
1 2 3 |
public interface UserMapper extends BaseMapper<User> { } |
先ほどのUserMapper.javaとくらべて、xmlに定義したUserテーブルから年齢が20歳以上のレコードを取得するメゾットがなくなりました。かわりのもの(Wrapperクラスを利用したもの)をUserServiceImpl.javaに記載します。
UserServiceImpl.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
package com.example.service.impl; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.example.dao.UserMapper; import com.example.entity.User; import com.example.service.UserService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.List; @Service public class UserServiceImpl implements UserService { @Autowired private UserMapper userMapper; @Override public List<User> getUsersAbove20() { QueryWrapper<User> queryWrapper = new QueryWrapper<>(); queryWrapper.ge("age", 20); return userMapper.selectList(queryWrapper); } } |
記載方法が大きく異なりますが、取得結果は同じになります。
1 2 |
QueryWrapper<User> queryWrapper = new QueryWrapper<>(); queryWrapper.ge("age", 20); |
QueryWrapperはWrapperクラスで最も一般的ものの一つです。型に取得したいEntityを指定し、インスタンス化します。
queryWrapper.geのgeは>=の比較演算子を意味し、“age >= 20に当てはまるレコードを取得する”という意味になります。その他比較演算子やソート句なども用意されています。
Wrapperクラスを使用するメリットは、src/main/resource下のUserMapper.xmlを記載する必要がない点にあります。
今回のように、Userテーブルからシンプルな条件でのデータ取得する際は、Wrapperクラスを使用することをコードの量を減らすことができます。
【エンジニア募集中】フルリモートも◎(リモート率85.7%)、平均残業8時間、年休124日以上、有給取得率90% etc. 詳細はこちらから>