1. Mybatis Daoレイヤーの実装
1.1従来の開発方法
1.1.1 UserDaoインターフェースの作成
public interface UserDao {
List<User> findAll() throws IOException;
}
1.1.2。UserDaoImpl実装の記述
public class UserDaoImpl implements UserDao {
public List<User> findAll() throws IOException {
InputStream resourceAsStream =
Resources.getResourceAsStream("SqlMapConfig.xml");
SqlSessionFactory sqlSessionFactory = new
SqlSessionFactoryBuilder().build(resourceAsStream);
SqlSession sqlSession = sqlSessionFactory.openSession();
List<User> userList = sqlSession.selectList("userMapper.findAll");
sqlSession.close();
return userList;
}
}
1.1.3従来の方法のテスト
@Test
public void testTraditionDao() throws IOException {
UserDao userDao = new UserDaoImpl();
List<User> all = userDao.findAll();
System.out.println(all);
}
1.2エージェント開発方法
1.2.1エージェント開発の概要
Mybatisのエージェント開発メソッドを使用してDAOレイヤーの開発を実現するこのメソッドは、後で企業に参入する主流です。
Mapperインターフェース開発メソッドでは、プログラマーがMapperインターフェース(Daoインターフェースと同等)を作成するだけで済みます。Mybatisフレームワークは、インターフェース定義に従って、インターフェースの動的プロキシオブジェクトを作成します。プロキシオブジェクトのメソッド本体は、上記のDaoインターフェース実装クラスメソッドと同じです。
Mapperインターフェースの開発は、次の仕様に従う必要があります。
1)Mapper.xmlファイルの名前空間は、マッパーインターフェイスの完全修飾名と同じです。
2)Mapperインターフェースのメソッド名は、Mapper.xmlで定義されている各ステートメントのIDと同じです。
3)Mapperインターフェースメソッドの入力パラメータータイプは、mapper.xmlで定義されている各SQLのparameterTypeタイプと同じです。
4)Mapperインターフェースメソッドの出力パラメータータイプは、mapper.xmlで定義された各SQLのresultTypeと同じです。
1.2.2 UserMapperインターフェースの作成
1.2.3テストプロキシメソッド
@Test
public void testProxyDao() throws IOException {
InputStream resourceAsStream = Resources.getResourceAsStream("SqlMapConfig.xml");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
SqlSession sqlSession = sqlSessionFactory.openSession();
//获得MyBatis框架生成的UserMapper接口的实现类
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
User user = userMapper.findById(1);
System.out.println(user);
sqlSession.close();
}
1.3知識のまとめ
MyBatisのDaoレイヤーを実現する2つの方法:
Daoを手動で実装する:従来の開発方法
Daoを実現するための演技:
**UserMapper userMapper = sqlSession.getMapper(UserMapper.class);**
2. MyBatisマッピングファイルの詳細
2.1動的SQLステートメント
2.1.1動的SQLステートメントの概要
Mybatisのマッピングファイルでは、SQLは比較的単純です。ビジネスロジックが複雑な場合、SQLは動的に変化することがあります。現時点では、SQLは前の調査の要件を満たせません。
以下に説明する公式ドキュメントを参照してください。
2.1.2動的SQL < if>
エンティティークラスのさまざまな値に従ってクエリを実行するには、さまざまなSQLステートメントを使用します。たとえば、IDが空でない場合は、IDに基づいてクエリを実行できます。ユーザー名が異なる場合は、ユーザー名を条件として追加します。この状況は、複数条件の組み合わせクエリでよく発生します。
<select id="findByCondition" parameterType="user" resultType="user">
select * from User
<where>
<if test="id!=0">
and id=#{id}
</if>
<if test="username!=null">
and username=#{username}
</if>
</where>
</select>
クエリ条件IDとユーザー名の両方が存在する場合、コンソールによって出力されるSQLステートメントは次のとおりです。
… … …
//获得MyBatis框架生成的UserMapper接口的实现类
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
User condition = new User();
condition.setId(1);
condition.setUsername("lucy");
User user = userMapper.findByCondition(condition);
… … …
クエリ条件のIDのみが存在する場合、コンソールによって出力されるSQLステートメントは次のとおりです。
… … …
//获得MyBatis框架生成的UserMapper接口的实现类
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
User condition = new User();
condition.setId(1);
User user = userMapper.findByCondition(condition);
… … …
2.1.3動的SQL < foreach>
SQLのスプライス操作をループで実行します。例:SELECT * FROM USER WHERE id IN(1,2,5)。
<select id="findByIds" parameterType="list" resultType="user">
select * from User
<where>
<foreach collection="array" open="id in(" close=")" item="id" separator=",">
#{id}
</foreach>
</where>
</select>
テストコードスニペットは次のとおりです。
//获得MyBatis框架生成的UserMapper接口的实现类
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
int[] ids = new int[]{2,5};
List<User> userList = userMapper.findByIds(ids);
System.out.println(userList);
foreachタグの属性の意味は次のとおりです。
ラベルは、コレクションとその属性を走査するために使用されます。
•コレクション:トラバースするコレクション要素を表します。書き込み時には#{}を書き込まないように注意してください
•open:ステートメントの始まりを表します
•close:最後の部分を表します
•item:コレクションの各要素をたどって生成された変数名を表します
•スペレータ:セパレータに代わって
2.2 SQLフラグメントの抽出
SQLの繰り返しをSQLから抽出し、使用時に参照を含め、最終的にSQLの再利用の目的を達成することができます
<!--抽取sql片段简化编写-->
<sql id="selectUser">select * from User</sql>
<select id="findById" parameterType="int" resultType="user">
<include refid="selectUser"></include> where id=#{id}
</select>
<select id="findByIds" parameterType="list" resultType="user">
<include refid="selectUser"></include>
<where>
<foreach collection="array" open="id in(" close=")" item="id" separator=",">
#{id}
</foreach>
</where>
</select>
2.3知識の要約
MyBatisマッピングファイルの構成:
<select>:查询
<insert>:插入
<update>:修改
<delete>:删除
<where>:where条件
<if>:if判断
<foreach>:循环
<sql>:sql片段抽取
3. MyBatisコア設定ファイルの詳細
3.1typeHandlersタグ
MyBatisが準備済みステートメント(PreparedStatement)でパラメーターを設定する場合でも、結果セットから値を抽出する場合でも、取得した値は、タイププロセッサーによって適切な方法でJavaタイプに変換されます。次の表は、いくつかのデフォルトタイプのプロセッサ(インターセプト部分)を示しています。
タイププロセッサを書き換えるか、独自のタイププロセッサを作成して、サポートされていないタイプまたは非標準のタイプを処理できます。具体的なアプローチは、org.apache.ibatis.type.TypeHandlerインターフェースを実装するか、便利なクラスorg.apache.ibatis.type.BaseTypeHandlerを継承してから、JDBCタイプに選択的にマッピングすることです。たとえば、要件:Javaの日付データ型。1970年から現在までのミリ秒数で保存したいのですが、データベースに保存されると、取り出されると、Javaの日付とデータベースのvarcharミリ秒の値に変換されます。変換。
開発ステップ:
①変換クラスを継承したクラスBaseTypeHandlerを定義する
②4つの実装されていないメソッドをカバーします。setNonNullParameterは、Javaプログラムがデータベースにデータを設定するためのコールバックメソッドです。getNullableResultは、クエリ時にmysql文字列型をjava Type型に変換するメソッドです。
③MyBatisコア設定ファイルに登録
正しい変換をテストする
public class MyDateTypeHandler extends BaseTypeHandler<Date> {
public void setNonNullParameter(PreparedStatement preparedStatement, int i, Date date, JdbcType type) {
preparedStatement.setString(i,date.getTime()+"");
}
public Date getNullableResult(ResultSet resultSet, String s) throws SQLException {
return new Date(resultSet.getLong(s));
}
public Date getNullableResult(ResultSet resultSet, int i) throws SQLException {
return new Date(resultSet.getLong(i));
}
public Date getNullableResult(CallableStatement callableStatement, int i) throws SQLException {
return callableStatement.getDate(i);
}
}
<!--注册类型自定义转换器-->
<typeHandlers>
<typeHandler handler="com.ittest.typeHandlers.MyDateTypeHandler"></typeHandler>
</typeHandlers>
テスト追加操作:
user.setBirthday(new Date());
userMapper.add2(user);
データベースデータ:
クエリ操作のテスト:
3.2プラグインタグ
MyBatisはサードパーティのプラグインを使用して機能を拡張でき、ページングアシスタントのPageHelperはページングの複雑な操作をカプセル化し、ページングの関連データを簡単な方法で取得できます
開発ステップ:
①一般的なPageHelperの座標をインポートする
②mybatisのコア設定ファイルでPageHelperプラグインを設定します
③テストページングデータ取得
①一般的なPageHelper座標をインポートする
②mybatisのコア設定ファイルでPageHelperプラグインを設定します
細部
③ページングコード実装テスト
@Test
public void testPageHelper(){
//设置分页参数
PageHelper.startPage(1,2);
List<User> select = userMapper2.select(null);
for(User user : select){
System.out.println(user);
}
}
ページングに関連する他のパラメーターを取得する
//其他分页的数据
PageInfo<User> pageInfo = new PageInfo<User>(select);
System.out.println("总条数:"+pageInfo.getTotal());
System.out.println("总页数:"+pageInfo.getPages());
System.out.println("当前页:"+pageInfo.getPageNum());
System.out.println("每页显示长度:"+pageInfo.getPageSize());
System.out.println("是否第一页:"+pageInfo.isIsFirstPage());
System.out.println("是否最后一页:"+pageInfo.isIsLastPage());
3.3知識のまとめ
MyBatisコア設定ファイルの一般的なタグ:
1.プロパティタグ:このタグは外部プロパティファイルをロードできます
2. typeAliasesタグ:タイプエイリアスを設定します
3.環境ラベル:データソース環境構成ラベル
4. typeHandlersタグ:カスタムタイププロセッサを構成する
5. pluginsタグ:MyBatisプラグインを構成する
"