MyBatisの入門、これで十分です

パッケージSQLSESSIONオブジェクト内MyBatisの(接続オブジェクトをカプセル化する)、それによってデータベースCRUD操作するオブジェクト。

実行プロセス

XMLのMyBatisのは利便性のために、我々はMyBatisの-config.xmlが開始、取ることができますいずれかのマッピング、XMLファイル名をマッピングし、コンフィギュレーション・データソースの構成を有しています

我々は、この構成では、データベース・オブジェクト・クラスのCRUD操作の後ことにより、得られたSQLSESSIONをXMLを読み取ります

Reader reader = Resources.getResourceAsReader("mybatis-config.xml");
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(reader);
SqlSession sqlSession = factory.openSession();

はじめに

1.エンティティクラスとクラスダオを作成します。

MyBatisの-config.xmlファイルの設定、コンフィギュレーション・データ・ソース

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <!-- 引入外部资源文件-->
    <properties resource="jdbc.properties"/>

    <!-- 配置数据源环境 -->
    <environments default="development">
        <environment id="development">
            <!-- 数据库事务管理类型 -->
            <transactionManager type="JDBC"/>
            <!-- 数据源,type=pooled 说明是使用连接池方式,可以节省资源 -->
            <dataSource type="POOLED">
                <!-- 调用资源文件里的用户信息-->
                <property name="driver" value="${jdbc.driver}"/>
                <property name="url" value="${jdbc.url}"/>
                <property name="username" value="${jdbc.username}"/>
                <property name="password" value="${jdbc.password}"/>
            </dataSource>
        </environment>
    </environments>
</configuration>

3. SQLSESSIONオブジェクトを取得することができ、データベース接続ツールを定義します

DAOクラス各CRUD操作は、一度だけ実行openSession方法得られたSqlSession对象資源の浪費とコードの重複をもたらします

だから、前とJdbcUtilツール、我々はまた、ユーティリティクラスの定義定義MyBatisUtil返しますSQLSession对象

static SqlSessionFactory sqlSessionFactory = null;

static {
    try {
        // 加载mybatis配置文件,并创建SqlSessionFactory实例
        String resource = "mybatis-config.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        //这个build方法可以接受几种不同的参数,如Reader/InputSteam等
        sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
    } catch (IOException e) {

    }
}

public static SqlSession getSqlSession() {
    return sqlSessionFactory.openSession();
}

public static void closeSqlSession(SqlSession sqlSession){
    if (sqlSession != null) {
        sqlSession.close();
    }
}

マッパーで書か4. SQL文

以下のリソースでのマッパーファイル

、SQL文でMyBatisのは、XMLファイルに書き込まれ、これらのファイルは、マッパーXMLマッピング・ファイルと呼ばれています

xmlnプロパティを持つタグマッパーは、IDEAは、XML構文解析エラーを報告する場合は、あなたはxmlnプロパティを削除する必要があります

<?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">
<!--
namespace: 命名空间,用于标识每一个Mapper XML文件中的语句,预防在不同的Mapper XML文件中存在相同的语句ID
-->
<mapper namespace="employeeMapper">
    <!--
        resultType: 也称为自动映射,只有在表的列名与POJO类的属性完全一致时使用,会比较方便,全类名
    -->
    <select id="selectAll" resultType="com.wan.bean.Employee">
        select * from employee
    </select>
</mapper>

5.マッパーは、MyBatisの-config.xmlファイルに登録します

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <!-- 省略数据源配置-->
    <mappers>
        <mapper resource="com/wan/mapping/employeeMapper.xml"/>
        <!--如果还有mapper,则继续添加 -->
    </mappers>
</configuration>

SQLSESSION 6. DAOクラスのクエリ

SqlSession sqlSession = MybatisUtil.getSqlSession();
// 调用语句,如果有参数,传入参数 
//参数为命名空间namespace+id,执行xml中的sql语句
List<Employee> list = sqlSession.selectList("employeeMapper.selectAll");

PS:それは、挿入、更新、および削除操作である場合、また、操作をコミットする必要があり、デフォルトが自動的に送信されません

sqlSession.commit();

サプリメント

1.typeAliasesラベル

<select id="selectAll" resultType="com.wan.bean.Employee">
    select * from employee
</select>

resultTypeプロパティは、完全なクラス名を必要とし、我々は使用することができtypeAliases、入力を簡単にするために、タグを

typeAliasesラベルはする必要があるmybatis-config.xmlファイルを設定します

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
    PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
    "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <properties resource="jdbc.properties"/>
    <!--指定一个bean包 -->
    <typeAliases>
        <package name="com.wan.bean"/>
    </typeAliases>
    <!--省略配置数据源等-->
</configuration>

私たちのマッパーファイルを書き込むことができた後、

<!--resultType就可以不用写全包名 -->
<select id="selectAll" resultType="Employee">
    select * from employee
</select>

私はここだけの使用は、以下のリンク参照で詳しく見ています

詳細なリファレンスMyBatisの構成typeAliases

4つの方法マッパーの2.はじめに

1.ファイルパス登録

<mappers>
    <mapper resource="com/wan/mapper/EmployeeMapper.xml" />
</mappers>

2.パッケージ名の登録をスキャン

<mappers>
    <package name="com.wan.mapper" />
</mappers>

これを使用して、我々はまったく同じことxxxMapper.javaとxxxMapper.xml両方の名前を確認する必要があります!そして、同じパッケージに

3.クラス名の登録

<mappers>
    <mapper class="com.shizongger.chapter2.mapper.UserMapper" />
</mappers>

4. URL登録

<mappers>
    <mapper url="file:/home/shizongger/workspace/Chapter3/src/com/shizongger/chapter2/mapper/RoleMapper.xml" />
</mappers>

参考:ソリューションエラーメッセージは、MyBatisの設定

SQLSESSIONメソッド説明

メソッド名 説明
インサート 挿入
削除 削除
更新 更新
一つ選択してください 一方向の結果を検索し、オブジェクトを返します。
SelectListの リストを返し、複数行の結果を探します

最初の引数に、前と同じようにnamespce + IDを使用するには、SQL文の実行と内部のマッパーを指定されたファイルを見つけることができます

CRUD

お問い合わせ

に対応する従業員、属性テーブルと列の名前

<select id="selectAll" resultType="Employee">
    select * from employee
</select>

列名と属性テーブルに不整合がある場合は、列名のマッピングこのresultMapラベルを使用することができます(つまり、自動的にエイリアスに変換されます)

<!--type也是需要全包名,由于之前定义的别名,所以就可以不写-->
<resultMap id="baseResultMap" type="Employee">
    <!--使用映射,把对应的列名映射为对应的属性 -->
    <id property="empno" column="EMPNO" />
    <result property="ename" column="ENAME"/>
    <result property="job" column="JOB"/>
    <result property="mgr" column="MGR"/>
    <result property="hiredate" column="HIREDATE"/>
    <result property="sal" column="SAL"/>
    <result property="comm" column="COMM"/>
    <result property="deptno" column="DEPTNO"/>
</resultMap>
<!--引用上面定义的resultMap-->
<select id="selectAll" resultMap="baseResultMap">
    select * from employee
</select>

条件付きクエリ

<select id="selectById" parameterType="int" resultMap="baseResultMap">
    <!-- 如果参数类型是简单的基本或者包装类型,#{} 里面的可以任取,都是可以获得参数 -->
    select * from EMPLOYEE where EMPNO=#{id}
</select>

//使用
Employee e = sqlsession.selectOne("employeeMapper.selectById",7369);

上記のSELECT文は、プリコンパイルされた文と同じです。

String s = "SELECT * FROM employee WHERE empno=?";
PreparedStatement ps = conn.prepareStatement(s);
ps.setInt(1,empno);

多基準クエリ

タグを使用できる場所、もちろん、単一の条件でも使用することができます前に、どこラベルは自動的に余分な利益を削除しますラベル、および

<select id="selectSelective" parameterType="Employee" resultMap="baseResultMap">
    select * from EMPLOYEE
    <where>
        <!--自动删除多余的and -->
        <!--#相当于从传入的bean对象(Employee)中通过getDeptno方法获得属性值 -->
        and deptno=#{deptno}
        and sal>=2000
    </where>
</select>

サイズ比較条件

比較的サイズ、における条件<CDATA貯蔵条件によって得られた数

<select id="selectSelective" parameterType="Employee" resultMap="baseResultMap">
    select * from EMPLOYEE
    <where>
        <!--loSal为Employee的一个属性,#{loSal}相当于是通过Employee对象的get方法来获得loSal的属性值 -->
        and SAL>=#{loSal}
        <!--CDATA中的数据不会被解析器解析 -->
        <![CDATA[ and SAL<=#{hiSal} ]]>
    </where>
</select>

#と$の違い:

${}どこに我々は我々自身のローカルプログラマーの割り当て値を決定するために使用することができます。
そして、#{}ユーザーが値を入力することができ、通常使用!

参考:
$番号{}でMyBatisのと{} {} $異なると魔法

ファジィクエリ:

ファジィクエリが使用必要があり%、私たちはより良いXMLでワイルドカードを定義することができ、自動スプライシングワイルドカード

<select id="selectSelective" parameterType="Employee" resultMap="baseResultMap">
    select * from EMPLOYEE
    <where>
        <if test="ename != null">
            <!--使用bind标签,设置格式,自动拼接通配符 -->
            <bind name="pattern" value="'%' + ename + '%'"/>
            and ENAME like #{pattern}
        </if>
    </where>
</select>

動的なクエリ

MyBatisの提供ifラベルは、動的なクエリを実装するために使用され、JSTLタグライブラリは、同様の使用します

<select id="selectSelective" parameterType="Employee" resultMap="baseResultMap">
    select * from EMPLOYEE
    <where>
        <!--#{ename}其实是通过Employee类中的get方法来获得对象的ename属性值 -->
        <if test="ename != null">
            and ename=#{ename}
        </if>
        <if test="job != null and job.trim().length>0">
            and JOB=#{job}
        </if>
        <if test="deptno != null">
            and DEPTNO=#{deptno}
        </if>
    </where>
</select>

挿入

プライマリキーシーケンス

マスターキーは、Oracleシーケンスによって生成されます

<insert id="insert_1" parameterType="Employee">
    <!--
        keyProperty: 表示将从序列获得的值赋予实体的哪个属性
        order: 表示主键值生成的方式,可取值:BEFORE | AFTER
             由于不同的数据库对插入的数据时主键生成方式是不同,例如:
             mysql and ms server: 主键生成方式为后生成方式。
             oracle: 主键生成方式预生成.
    -->
    <!--调用数据库中的序列,并赋值给传入的Employee对象的empno属性 -->
    <selectKey keyProperty="empno" resultType="integer" order="BEFORE">
        select EMP_SEQ.nextval from dual
    </selectKey>
    <!--
        如果使用这种整表插入的方式,那当数据库表的某些列可以为空值时,我将要告诉底层的JDBC驱动如何处理空值的情况,这不是mybatis所需要的,
        而是底层有些JDBC驱动所需的特性,实际上就是让JDBC驱动去调用PrepareStatement.setNull()来设置空值
     -->
    <!--如果是常用的数据类型int,date等,jdbcType可以省略不写 -->
    insert into EMPLOYEE
    values (#{empno},#{ename},#{job},#{mgr,jdbcType=INTEGER},#{hiredate,jdbcType=DATE},#{sal,jdbcType=DOUBLE},#{comm,jdbcType=DOUBLE},#{deptno,jdbcType=INTEGER})

</insert>

多重のSQL文

SQLタグで記述されたカラム名と値を挿入するために挿入するには、簡単に再利用した後、再使用の後に使用する必要がある場合include、子はスプライシングSQL文をタグ付け

<!--insert into employee(ENAME,JOB..) values(xx,xx) -->
<!--(ENAME,JOB..) -->
<sql id="insert_set_column">
    <!-- suffixOverrides属性,会自动把多余的“,”删除 -->
    <trim prefix="(" suffix=")" suffixOverrides=",">
        empno,
        <if test="ename != null">ENAME,</if>
        <if test="job != null">JOB,</if>
        <if test="mgr != null">MGR,</if>
        <if test="hiredate != null">HIREDATE,</if>
        <if test="sal != null">SAL,</if>
        <if test="comm != null">COMM,</if>
        <if test="deptno != null">DEPTNO,</if>
    </trim>
</sql>
<!--(xx,xx,xx) -->
<sql id="insert_values">
    <trim prefix="values(" suffix=")" suffixOverrides=",">
        #{empno},
        <if test="ename != null">#{ename},</if>
        <if test="job != null">#{job},</if>
        <if test="mgr != null">#{mgr},</if>
        <if test="hiredate != null">#{hiredate},</if>
        <if test="sal != null">#{sal},</if>
        <if test="comm != null">#{comm},</if>
        <if test="deptno != null">#{deptno},</if>
    </trim>
</sql>

<insert id="insert_2" parameterType="Employee">
    <selectKey keyProperty="empno" resultType="integer" order="BEFORE">
        select EMP_SEQ.nextval from dual
    </selectKey>
    insert into EMPLOYEE 
    <!--拼接sql -->
    <include refid="insert_set_column"/> 
    <include refid="insert_values"/>
</insert>

更新

<update id="update_1" parameterType="Employee">
    update EMPLOYEE
    <set>
        <if test="ename != null and ename.trim().length>0">ENAME=#{ename},</if>
        <if test="job != null and job.trim().length>0">JOB=#{job},</if>
        <if test="mgr != null">MGR=#{mgr},</if>
        <if test="hiredate != null">HIREDATE=#{hiredate},</if>
        <if test="sal != null">SAL=#{sal},</if>
        <if test="comm != null">COMM=#{comm},</if>
        <if test="deptno != null">DEPTNO=#{deptno},</if>
    </set>
   <!-- <where>如果带多条件的更依然可以使<where>元素动态生成where子句</where> -->
   where EMPNO=#{empno}
</update>
<update id="update_2" parameterType="Employee">
    update EMPLOYEE
    <trim prefix="set" suffixOverrides=",">
        <if test="ename != null and ename.trim().length>0">ENAME=#{ename},</if>
        <if test="job != null and job.trim().length>0">JOB=#{job},</if>
        <if test="mgr != null">MGR=#{mgr},</if>
        <if test="hiredate != null">HIREDATE=#{hiredate},</if>
        <if test="sal != null">SAL=#{sal},</if>
        <if test="comm != null">COMM=#{comm},</if>
        <if test="deptno != null">DEPTNO=#{deptno},</if>
    </trim>
   <!-- <where>如果带多条件的更依然可以使<where>元素动态生成where子句</where> -->
   where EMPNO=#{empno}
</update>

削除

<delete id="delete" parameterType="Employee">
    delete EMPLOYEE EMPNO=#{empno}
    <!--条件多的话也可以使用<where>...</where> -->
</delete>

などW3Cの選択タグ、タグを削除して、詳細な

高度な使用

1.ダイナミックエージェント

私たちの前に、前の段落のsqlsession.selectOne / SelectListの中ダオクラスで書かれたすべての上に、それは非常に面倒です

したがってMyBatisのステップを簡略化することができる動的プロキシ(インターフェースクラス)を使用して簡単な方法を提供します

こうした大会でMyBatisの:

  1. マッパーインターフェースメソッド名と同じid
  2. インターフェイスメソッドのパラメータのParameterTypeと同じタイプ
  3. タイプresultTypeと同じタイプのインタフェースメソッドの戻り値

MyBatisのはダオ、ダオの書き込み方法を再作成することなく、クラスやマッパSQL文1アップでメソッドをインタフェースする、上記の条件を満たしているクラスで

具体的な手順:

1.エンティティクラスの書き込み

2.新しいインターフェイスクラスを作成します。

ボイドのメソッドの戻り値場合、マッパーは、属性を定義する必要はありませresultTypeと

メソッドの戻り値がリストなら、マッパーは、一般的なresultTypeとTであります

package com.wan.mapping;

import com.wan.bean.Employee;

import java.util.List;

/**
 * @author StarsOne
 * @date Create in  2019/9/16 0016 20:38
 * @description
 */
public interface EmployeeMapper {
    List<Employee> selectAll();
}

2.書き込みmapper.xml

<?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.wan.mapping.EmployeeMapper">
    <!--特例:返回值为list,resultType=bean类-->
    <select id="selectAll" resultType="Employee" >
        select * from employee
    </select>
</mapper>

3.登録マッパー

ここでは、登録パッケージマッパーの使用を持って、同じケースであることをxxmapper.javaとxxmapper.xml同じ2人の名前を確認する必要があります

Mapper.xmlとインターフェイスが同じパッケージマッパーパスは、XML構成ファイルは、MyBatisのが指定されていることを確実にするために

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <!--省略数据源配置 -->...
    <!-- 注册SQL映射文件,在这些文件中写SQL语句 -->
    <mappers>
        <!--指定整个包中的全部Mapper -->
        <package name="com.wan.mapper"/>
    </mappers>
</configuration>

4.

getMapper法、着信インターフェイスクラスを有するSQLSESSIONオブジェクトを取得し、使用するか前に、方法は、インターフェイスは引き戻すことができます

Reader reader = Resources.getResourceAsReader("mybatis-config.xml");
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(reader);
SqlSession sqlSession = factory.openSession();

EmployeeMapper mapper = sqlSession.getMapper(EmployeeMapper.class);
List<Employee> employees = mapper.selectAll();

EmployeeMapper.xml対応するインタフェースクラスおよびメソッド名

使用します。

EmployeeMapper mapper = sqlsession.getMapper(EmployeeMapper.class);
mapper.selectById(7369);

リストトラバース2

MyBatisのはトラバースのために、foreachのラベルを提供しました

メソッドの引数がリストで渡された場合、このラベルは、以下の例を横断するために使用することができます。

<!--相当于select * from employee where job in (...)) -->
<select id="selectByJobs" parameterType="list" resultMap="baseResultMap">
    select * from EMPLOYEE
    <where>
        <foreach item="job" collection="list" open="JOB IN(" close=")" separator=",">
            #{job}
        </foreach>
    </where>
</select>

プロパティのforeachタグ主要項目、インデックス、コレクション、オープン、セパレーター、近い、とのforeachタグ内にJSTLタグを使用して、ほとんど

プロパティ名 説明
項目 コレクションで表される各反復別名要素
指数 反復プロセスを表現するために名前を指定し、位置に各反復、
開いた 文は何の始まりを表し、
分離機 各反復の間に区切り記号としてどのシンボルを表し、
閉じる それはどのような終わりを表します。

キー属性:コレクション

  1. 単一のパラメータおよびパラメータの型の流入は、リストの時間、コレクション属性値のリストである場合
  2. 1つのパラメータが渡され、時間パラメータは、配列型の配列、コレクション属性値の配列の場合
  3. 渡された引数が多い場合、私たちは地図にそれらをパッケージ化する必要があり、当然のことながら、また、単一のパラメータマップとしてパッケージ化することができ、キーはパラメータ名であるので、この時間は、コレクションがプロパティ値または一覧に渡されるマップそのパッケージ内の配列マップ内のキーのターゲット

リファレンスは:3でMyBatisのはのforeachのコレクションを使用しています

3.スレッドの安全性を考えてみましょう

ThreadLocalのオブジェクトが同じオブジェクトSQLSESSIONのうち、その各スレッドを確保することである使用

方法 説明
空のセット(Object値) 現在のスレッドのスレッドローカル変数の値。
パブリックオブジェクトのget() この方法は、スレッドローカル変数に対応する現在のスレッドを返します。
公共ボイドのremove() 現在のスレッドローカル変数削除の値は、目的は、JDK 5.0の新しい方法であるメモリ使用量を低減することです。
保護されたオブジェクトはinitialValue() どうやらサブクラスがデザインをカバーできるようにするために保護された方法であり、このスレッドローカル変数の初期値に戻ります。
static ThreadLocal<SqlSession> threadLocal = new ThreadLocal<SqlSession>();
//设置
threadLocal.set(sqlsession);
//取出
SqlSession s = threadLocal.get();

ネストされたクエリ

<!-- 结果集映射: 列《》属性名 -->
<resultMap id="baseResultMap" type="Employee">
    <!-- 专门映射主键列 -->
    <id property="empno" column="EMPNO" />
    <result property="ename" column="ENAME"/>
    <result property="job" column="JOB"/>
    <result property="mgr" column="MGR"/>
    <result property="hiredate" column="HIREDATE"/>
    <result property="sal" column="SAL"/>
    <result property="comm" column="COMM"/>
    <result property="deptno" column="DEPTNO"/>
</resultMap>

<!-- 扩展另一个结果映射 -->
<resultMap id="extendBaseResultMap" type="Employee" extends="baseResultMap">
    <association property="department" javaType="Department">
        <!-- 关联的嵌套结果 -->
        <id property="deptno" column="DEPTNO"/>
        <result property="dname" column="DNAME"/>
        <result property="location" column="LOC"/>
    </association>
</resultMap>


<!--
    1.嵌套结果(推荐使用)
    优点:性能好,一条语句把所有实体的数据完全查询出来。
    缺点:对SQL编写的要求高了,因为涉及多表连接查询
-->
<select id="selectById" resultMap="extendBaseResultMap" parameterType="int">
    select e.EMPNO,
          e.ENAME,
          e.JOB,
          e.MGR,
          e.HIREDATE,
          e.SAL,
          e.COMM,
          d.DEPTNO,
          d.DNAME,
          d.LOC
    from EMPLOYEE E
      inner join DEPARTMENT D
          on E.DEPTNO = D.DEPTNO
     where E.EMPNO=#{id}
</select>

<!--
    2. 嵌套查询
    优点:编写SQL简单,无需做多表的连接查询;关联的实体通过单独的SQL语句查询并单独封装。
    缺点:执行了N+1条件语句。性能差
-->
<resultMap id="extendBaseResultMap_2" type="Employee" extends="baseResultMap">
    <association property="department" column="DEPTNO" select="selectDepartmentById" />
</resultMap>

<select id="selectDepartmentById" parameterType="int" resultType="Department">
    select deptno,
           dname,
           loc as location
    from DEPARTMENT where DEPTNO=#{id}
</select>

<select id="selectById_2" resultMap="extendBaseResultMap_2" parameterType="int">
    select e.EMPNO,
          e.ENAME,
          e.JOB,
          e.MGR,
          e.HIREDATE,
          e.SAL,
          e.COMM,
          e.DEPTNO
    from EMPLOYEE E
     where E.EMPNO=#{id}
      <!-- or e.empno=7902 or e.empno=7844 -->
</select>

ページングクエリ

ページは、その後、以前のように3つのネストされたクエリをも達成することができることを使用します。

プラグインMyBatisのが開いしかし、開発者があるPageHelperを、より容易にページングクエリを使用するために使用することができます

1. JARパッケージを追加します。

<dependency>
    <groupId>com.github.pagehelper</groupId>
    <artifactId>pagehelper</artifactId>
    <!--自动下载最新版本 -->
    <version>REALSE</version>
</dependency>

2. [設定インターセプタプラグイン

<!-- 
    plugins在配置文件中的位置必须符合要求,否则会报错,顺序如下:
    properties?, settings?, 
    typeAliases?, typeHandlers?, 
    objectFactory?,objectWrapperFactory?, 
    plugins?, 
    environments?, databaseIdProvider?, mappers?
-->
<plugins>
    <!-- com.github.pagehelper为PageHelper类所在包名 -->
    <plugin interceptor="com.github.pagehelper.PageInterceptor">
        <!-- 使用下面的方式配置参数,后面会有所有的参数介绍 -->
        <property name="param1" value="value1"/>
    </plugin>
</plugins>

3.コードを使用します

のみでのお問い合わせのコールの前にstartPageいずれかのoffsetPage方法で、リストのクエリ結果は、ページングクエリの背面外となります

次の2つのクエリは、最初のページは、各ページには10のデータを持っています

//第二种,Mapper接口方式的调用,推荐这种使用方式。

PageHelper.startPage(1, 10);
List<Employee> employees = employeeMapper.selectAll();

//第三种,Mapper接口方式的调用,推荐这种使用方式。
PageHelper.offsetPage(1, 10);
List<Employee> employees = employeeMapper.selectAll();

このプラグも設けられており、ここで言及PageInfoクラス、記録することができる情報の様々な種類があります

最初は、私はそれが前だと思ったし、詳細を見ると、私は、パッケージページを所有するJSPの研究ノート(4) -ページングクエリを

しかし、実際には、同じではない、この情報のすべての種類があり、PageInfoパッケージであり、単にデータのみを格納するために使用されます

プロパティ 説明
PAGENO 現在のページ番号(最初の数ページ)
ページサイズ ページごとのデータの数が表示されます
サイズ データの現在表示されているページ数
startRow属性 データベース内の行の現在のページ番号の最初の要素
endRow 現在のページは、データベース内の行番号の最後の要素であります
ページ 総ページ数
PRE-PAYS 前のページ番号
次のページ 次のページ番号
isFirstPage 最初のページのためかどうか、
isLastPage 最後のページかどうか
hasPreviousPage 前のページがあります
hasNextPage 次はあります
navigatePages ナビゲーションページ番号
navigatepageNums すべてのナビゲーション・ページ数
navigatePages ナビゲーションバー上の最初のページ
navigateFirstPage ナビゲーションバー上の最初のページ
navigateLastPage ナビゲーションバー上の最後のページ

そこでgetTotalは、レコードクエリ結果の合計数を取得することができる方法は、

PageHelper.startPage(1, 10);
List<Employee> employees = mapper.selectAll();
PageInfo<Employee> pageInfo = new PageInfo<>(employees);

おすすめ

転載: www.cnblogs.com/kexing/p/11537439.html