mybatis 入門#
学習目標#
- 【応用】Mybatis の迅速な入門
- 【応用】MyBatis の CRUD 操作
- 【習得】MyBatis のコア設定ファイルの概要
1、Mybatis の紹介#
1.1 原始 jdbc 操作(データの照会)#
1.2 原始 jdbc 操作(データの挿入)#
1.3 原始 jdbc 操作の分析#
原始 jdbc 開発に存在する問題は以下の通りです:
①データベース接続の作成と解放が頻繁に行われ、システムリソースが浪費され、システム性能に影響を与える
②sql 文がコード内にハードコーディングされているため、コードのメンテナンスが困難で、実際のアプリケーションでは sql が変化する可能性が高く、sql の変更には java コードの変更が必要です。
③照会操作の際、結果セット内のデータを手動でエンティティに封装する必要があります。挿入操作の際、エンティティのデータを sql 文のプレースホルダーに手動で設定する必要があります。
上記の問題に対する解決策:
①データベース接続プールを使用して接続リソースを初期化する
②sql 文を xml 設定ファイルに抽出する
③リフレクション、インスペクションなどの低レベル技術を使用して、エンティティとテーブルの属性とフィールドの自動マッピングを行う
1.4 Mybatis とは#
mybatis は、java に基づく優れた永続層フレームワークであり、内部で jdbc を封装しているため、開発者は sql 文自体にのみ集中し、ドライバの読み込み、接続の作成、statement の作成などの複雑なプロセスにエネルギーを費やす必要がありません。
mybatis は xml またはアノテーションの方法で実行するさまざまな statement を設定し、java オブジェクトと statement 内の sql の動的パラメータを使用してマッピングし、最終的に実行される sql 文を生成します。
最後に mybatis フレームワークが sql を実行し、結果を java オブジェクトにマッピングして返します。ORM の考え方を採用してエンティティとデータベースのマッピングの問題を解決し、jdbc を封装し、jdbc api の低レベルのアクセス詳細を隠蔽することで、jdbc api とやり取りすることなくデータベースの永続化操作を完了できます。
1.5 Mybatis アーキテクチャ#
2、Mybatis の迅速な入門#
2.1 MyBatis 開発ステップ#
MyBatis 公式サイト:http://www.mybatis.org/mybatis-3/
MyBatis 開発ステップ:
①MyBatis の座標を追加する
②user データテーブルを作成する
③User エンティティクラスを作成する
④マッピングファイル UserMapper.xml を作成する
⑤コアファイル SqlMapConfig.xml を作成する
⑥テストクラスを作成する
2.2 環境構築#
1.MyBatis の座標とその他の関連座標をインポートする
<!‐‐mybatis座標‐‐>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.5</version>
</dependency>
<!‐‐ mysqlドライバ ‐‐>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql‐connector‐java</artifactId>
<version>5.1.39</version>
</dependency>
<!‐‐単体テスト座標‐‐>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<!‐‐ログ座標‐‐>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.12</version>
</dependency>
2.user データテーブルを作成する
drop table if EXISTS user;
##ユーザー
CREATE TABLE `user` (
`uid` INT AUTO_INCREMENT ,
`username` VARCHAR(20) DEFAULT NULL,
`password` VARCHAR(20) DEFAULT NULL,
PRIMARY KEY (`uid`)
);
INSERT INTO `user` VALUES (NULL,'wc001','888888'),
(NULL,'xq001','888888'),
(NULL,'xb001','888888');
3.User エンティティを作成する
public class User {
private int id;
private String username;
private String password;
//省略getとsetメソッド
}
4.UserMapper マッピングファイルを作成する
<
?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="userMapper">
<select id="findAll" resultType="com.summer.domain.User">
select * from User
</select>
</mapper>
5.MyBatis コアファイルを作成する
<!DOCTYPE configuration PUBLIC "‐//mybatis.org//DTD Config 3.0//EN“
"http://mybatis.org/dtd/mybatis‐3‐config.dtd">
<configuration>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql:///test"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
</environments>
<!‐‐マッピングファイルを読み込む‐‐>
<mappers>
<mapper resource="UserMapper.xml" />
</mappers>
</configuration>
2.3 テストコードを作成する#
@Test
public void test1() throws IOException {
//mybatis主設定ファイルを読み込む
InputStream inputStream = Resources.getResourceAsStream("SqlMapConfig.xml");
//セッションファクトリを取得する
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//セッションを作成する
SqlSession session = sqlSessionFactory.openSession();
//操作を実行する
List<User> users = session.selectList("userMapper.findAll");
//リソースを解放する
session.close();
System.out.println(users);
}
sql 文の実行情報を確認するために、resources 下にログファイルlog4j.properties
を追加する
# グローバルログ設定
log4j.rootLogger=DEBUG, stdout
# MyBatisログ設定...
log4j.logger.com.summer.test=DEBUG
# コンソール出力...
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] ‐ %m%n
2.4 知識のまとめ#
MyBatis 開発ステップ:
①MyBatis の座標を追加する
②user データテーブルを作成する
③User エンティティクラスを作成する
④マッピングファイル UserMapper.xml を作成する
⑤コアファイル SqlMapConfig.xml を作成する
⑥テストクラスを作成する
3、MyBatis のマッピングファイルの概要#
4.MyBatis の CRUD 操作#
4.1 MyBatis のデータ挿入操作#
1.UserMapper マッピングファイルを作成する
<insert id="save" parameterType="com.summer.domain.User" >
insert into user values (null,#{username},#{password});
</insert>
2.User エンティティを挿入するコードを作成する
//追加
@Test
public void test2() throws IOException {
User user = new User();
user.setUsername("如花");
user.setPassword("888");
//mybatis主設定ファイルを読み込む
InputStream inputStream = Resources.getResourceAsStream("SqlMapConfig.xml");
//セッションファクトリを取得する
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//セッションを作成する
SqlSession session = sqlSessionFactory.openSession();
//操作を実行する
int i = session.insert("userMapper.save",user);
//リソースを解放する
session.commit();
session.close();
System.out.println(i);
}
3. 挿入操作の注意点
・挿入文は insert タグを使用する
・マッピングファイル内で parameterType 属性を使用して挿入するデータタイプを指定する
・Sql 文内で #{エンティティ属性名} 方式でエンティティの属性値を参照する
・挿入操作で使用する API は sqlSession.insert (“名前空間.id”, エンティティオブジェクト);
・挿入操作はデータベースのデータ変化に関わるため、sqlSession オブジェクトを使用して明示的にトランザクションをコミットする必要がある、すなわち sqlSession.commit ()
4.2 MyBatis のデータ更新操作#
1.UserMapper マッピングファイルを作成する
<update id="update" parameterType="com.summer.domain.User" >
update user set username = #{username} , password = #{password} where uid =#{uid}
</update>
2.User エンティティを更新するコードを作成する
//更新
@Test
public void test3() throws IOException {
User user = new User();
user.setUid(1);
user.setUsername("如花2222");
user.setPassword("888");
//mybatis主設定ファイルを読み込む
InputStream inputStream = Resources.getResourceAsStream("SqlMapConfig.xml");
//セッションファクトリを取得する
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//セッションを作成する
SqlSession session = sqlSessionFactory.openSession();
//操作を実行する
int i = session.update("userMapper.update",user);
//トランザクションをコミットする
session.commit();
//リソースを解放する
session.close();
System.out.println(i);
}
3. 更新操作の注意点
・更新文は update タグを使用する
・更新操作で使用する API は sqlSession.update (“名前空間.id”, エンティティオブジェクト);
4.3 MyBatis のデータ削除操作#
1.UserMapper マッピングファイルを作成する
<delete id="delete" parameterType="java.lang.Integer" >
delete from user where uid = #{uid}
</delete>
2. データ削除のコードを作成する
//削除
@Test
public void test4() throws IOException {
//mybatis主設定ファイルを読み込む
InputStream inputStream = Resources.getResourceAsStream("SqlMapConfig.xml");
//セッションファクトリを取得する
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//セッションを作成する
SqlSession session = sqlSessionFactory.openSession();
//操作を実行する
int i = session.delete("userMapper.delete",1);
//トランザクションをコミットする
session.commit();
//リソースを解放する
session.close();
System.out.println(i);
}
3. 削除操作の注意点
・削除文は delete タグを使用する
・Sql 文内で #{任意の文字列} 方式で渡された単一パラメータを参照する
・削除操作で使用する API は sqlSession.delete (“名前空間.id”,Object);
5. MyBatis コア設定ファイルの概要#
5.1 MyBatis コア設定ファイルの階層関係#
5.2 MyBatis の一般的な設定の解析#
1.environments タグ
データベース環境の設定で、複数の環境設定をサポート
2.mapper タグ
このタグの役割はマッピングを読み込むことで、読み込み方法は以下の通りです:
・クラスパスに対する相対リソース参照を使用する、例えば:
<mapper resource="org/mybatis/builder/AuthorMapper.xml"/>
・完全修飾リソースロケータ(URL)を使用する、例えば:
<mapper url="file:///var/mappers/AuthorMapper.xml"/>
・mapper インターフェースの完全修飾クラス名を使用してアノテーション mapper インターフェースを使用する、例えば:
<mapper class="org.mybatis.builder.AuthorMapper"/>
・指定されたパッケージ内のすべての mapper インターフェースを登録する、例えば:
<package name="org.mybatis.builder"/>
3.Properties タグ
4.typeAliases タグ
タイプエイリアスは java タイプに短い名前を設定するためのものです。元の設定は以下の通りです
<select id="findAll" resultType="com.summer.pojo.User">
select * from user
</select>
typeAliases を設定し、com.summer.pojo.User にエイリアスを User として定義します
<typeAliases>
<typeAlias type="com.summer.pojo.User" alias="user"></typeAlias>
</typeAliases>
その後の mapper.xml ではエイリアスを使用できます
<select id="findAll" resultType="User">
select * from user
</select>
上記は自分で定義したエイリアスで、mybatis フレームワークはすでに私たちのために設定した一般的なタイプのエイリアスを持っています
5.3 知識のまとめ#
コア設定ファイルの一般的な設定:
properties タグ:このタグは外部の properties ファイルを読み込むことができます
<properties resource="jdbc.properties"></properties>
typeAliases タグ:タイプエイリアスを設定する
<typeAlias type="com.summer.domain.User" alias="user"></typeAlias>
mappers タグ:マッピング設定を読み込む
<mapper resource="com/summer/mapper/UserMapping.xml"></mapper>