Mybatis
基盤が必要:
- JDBC
- Mysql
- Javaの基本
- Maven
- JUnit
1はじめに
1.1Mybatisとは
- MyBatisは、カスタムSQL、ストアドプロシージャ、および高度なマッピングをサポートする優れた永続性レイヤーフレームワークです。
- MyBatisは、ほとんどすべてのJDBCコードと、パラメーターの設定および結果セットの取得の作業を排除します。
- MyBatisは、プリミティブ型、インターフェイス、およびJava POJO(Plain Old Java Objects)を、単純なXMLまたはアノテーションを介してデータベース内のレコードとして構成およびマップできます。
- MyBatisは元々ApacheのオープンソースプロジェクトiBatisでした。2010年に、このプロジェクトはapacheソフトウェアファウンデーションから[google code](https://baike.baidu.com/item/google code / 2346604)に移行され、MyBatisに名前が変更されました。 。
- 2013年11月にGithubに移行しました。
1.2、Mybatisの入手方法
- Github:
1.3、持久化
データの永続性
- 永続性は、プログラムデータを永続状態と一時状態に変換するプロセスです。
- メモリ:電源を切ると失われます
- データベース(jdbc)、ioファイルの永続性。
- 生活の中で:冷蔵、缶詰、写真
なぜ永続性が必要なのですか?
-
彼を手放すことができないいくつかのオブジェクトがあります。
-
メモリが高すぎる
1.4、永続層
Daoレイヤー、サービスレイヤー、コントローラーレイヤー
- 永続化作業を完了するためのコードブロック
- 境界は非常に明確でした
1.5なぜMybatisが必要なのですか
-
利便性
-
従来のjdbcコードは複雑すぎます。単純化するために、フレームワーク、自動化があります
-
プログラムがデータベースにデータを保存するのを手伝ってください
-
mybatisは必要ありません。始めるのは簡単です。
-
利点:
- シンプルで習得が容易:それ自体は小さくてシンプルです。サードパーティの依存関係がない場合、最も簡単なインストールは、2つのjarファイルといくつかのSQLマッピングファイルの構成だけです。習得と使用が簡単です。ドキュメントとソースコードを通じて、その設計アイデアと実装を完全に把握できます。
- 柔軟性:Mybatisは、アプリケーションまたはデータベースの既存の設計に影響を与えません。sqlはxmlで記述されており、統合された管理と最適化に便利です。データベースを操作するためのすべての要件は、sqlステートメントを介して満たすことができます。
- SQLとプログラムコードの分離:DAOレイヤーを提供することにより、ビジネスロジックとデータアクセスロジックが分離され、システム設計がより明確になり、保守が容易になり、単体テストが容易になります。SQLとコードを分離すると、保守性が向上します。
- マッピングタグを提供し、オブジェクトとデータベースormフィールド間のマッピングをサポートします。
- オブジェクトリレーショナルマッピングタグを提供し、オブジェクトリレーショナルの確立と維持をサポートします。
- xmlタグを提供し、動的SQLの記述をサポートします。
2.最初のMybatisプログラム
アイデア:環境を構築する-> Mybatisをインポートする->コードを書く->テストする
3、CRUD
1、名前空間
名前空間のパッケージ名は、Dao / mapperインターフェースのパッケージ名と一致している必要があります。
2、選択
選択、クエリステートメント:
- id:対応する名前空間のメソッド名
- resultType:SQLステートメント実行の戻り値
- parameterType:抽象メソッドの入力パラメータータイプ
実装プロセス:次の手順は、挿入、変更、および削除について同じです。
- インターフェイスの抽象メソッドを書く
List<User> getUserInfo();
- 対応するSQLステートメントをmapper.xmlに記述します
<mapper namespace="com.kuber.dao.UserMapper">
<select id="getUserInfo" resultType="com.kuber.pojo.User">
select * from users
</select>
</mapper>
- テスト
@Test
public void getUserInfo(){
/*获取SqlSession*/
SqlSession sqlSession;
try {
/*获取SqlSession*/
sqlSession = MybatisUtils.getSqlSession();
/*执行sql*/
/*相当于 UserMapper mapper = new UserMapperImpl();*/
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
List<User> users = mapper.getUserInfo();
for (User user : users) {
System.out.println(user);
}
sqlSession.close();
}finally {
MybatisUtils.closeSqlSession();
}
}
[外部リンク画像の転送に失敗しました。ソースサイトにヒル防止リンクメカニズムがある可能性があります。画像を保存して直接アップロードすることをお勧めします(img-rfdhL4xD-1604566530913)(img \ execution result1.png)]
3、挿入
- インターフェイスメソッドの記述
int addUser(User user);
- 対応するSQLステートメントをmapper.xmlに記述します
<insert id="addUser" parameterType="com.kuber.pojo.User">
insert into users values(#{uid},#{username},#{password})
</insert>
- テスト
@Test
public void addUser(){
/*增删改必须要提交事务*/
SqlSession sqlSession;
try {
sqlSession = MybatisUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
User user = new User(null,"tonyma","111");
int num = mapper.addUser(user);
if(num > 0){
System.out.println("插入成功");
}else {
System.out.println("插入失败");
}
/*提交事务*/
sqlSession.commit();
}finally {
MybatisUtils.closeSqlSession();
}
}
4、更新
- インターフェイスメソッドの記述
int updateUser(User user);
- 対応するSQLステートメントをmapper.xmlに記述します
<update id="updateUser" parameterType="com.kuber.pojo.User">
update users set username = #{username},password = #{password} where uid = #{uid}
</update>
- テスト
@Test
public void updateUser(){
SqlSession sqlSession;
try {
sqlSession = MybatisUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
int num = mapper.updateUser(new User(7,"jackma","123456"));
if (num > 0){
System.out.println("修改成功");
}else {
System.out.println("修改失败");
}
sqlSession.commit();
}finally {
MybatisUtils.closeSqlSession();
}
}
5、削除
- インターフェイスメソッドの記述
int deleteUser(int id);
- 対応するSQLステートメントをmapper.xmlに記述します
<delete id="deleteUser" parameterType="int">
delete from users where uid = #{id}
</delete>
- テスト
@Test
public void deleteUser(){
SqlSession sqlSession;
try {
sqlSession = MybatisUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
int num = mapper.deleteUser(9);
if (num > 0){
System.out.println("删除成功");
}else{
System.out.println("删除失败");
}
sqlSession.commit();
}finally {
MybatisUtils.closeSqlSession();
}
}
- 追加、削除、変更はトランザクションをコミットする必要があります!
6.エラーが発生しやすいポイント
-
間違ったタグと一致しないでください
-
リソースバインディングマッパー、パスを使用する必要があります
-
プログラム構成ファイルは仕様に準拠している必要があります
-
Mavenリソースはエクスポートされません
次のコードブロックをpom.xmlファイルに追加します
<!--在build中配置resours,来防止我们资源导出失败的问题--> <build> <resources> <resource> <directory>src/main/resources</directory> <includes> <include>**/*.properties</include> <include>**/*.xml</include> </includes> <filtering>true</filtering> </resource> <resource> <directory>src/main/java</directory> <includes> <include>**/*.properties</include> <include>**/*.xml</include> </includes> <filtering>true</filtering> </resource> </resources> </build>
7.ユニバーサルマップ
データベース内のエンティティクラス、テーブル、フィールド、またはパラメータが多すぎると仮定すると、Mapを使用できます。
<insert id="addUser2" parameterType="map">
insert into users(uid,username,password) values(#{uid},#{uname},#{upwd})
</insert>
@Test
public void addUser2(){
SqlSession sqlSession;
try {
sqlSession = MybatisUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
Map<String, Object> map = new HashMap<String, Object>();
map.put("uid",8);
map.put("uname","jacktony");
map.put("upwd","22333");
int counter = mapper.addUser2(map);
if (counter > 0){
System.out.println("插入成功!");
}else {
System.out.println("插入失败!");
}
sqlSession.commit();
}finally {
MybatisUtils.closeSqlSession();
}
}
8.考える
ファジークエリの書き方は?
- Javaコードが実行されるとき、ワイルドカード%%を渡します
- SQLスプライシングでワイルドカードを使用する(SQLインジェクションを防ぐための注意)
<select id="getLikeUserInfo" parameterType="string" resultType="com.kuber.pojo.User">
select * from users where username like #{value}
</select>
@Test
public void getLikeUserInfo(){
SqlSession sqlSession;
try {
sqlSession = MybatisUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
List<User> users = mapper.getLikeUserInfo("%han%");
for (User user : users) {
System.out.println(user);
}
}finally {
MybatisUtils.closeSqlSession();
}
}