JAVAEEは、フレームワーク09-Mybatis動的SQLマッピング、コア構成ファイルの詳細、pageHelperの使用を確認します

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プラグインを構成する

"
78件のオリジナル記事が掲載されました 高く評価されました30 訪問数3634

おすすめ

転載: blog.csdn.net/ZMW_IOS/article/details/105239881