MyBatis学習の概要(4):MyBatis dynamic sql <select>、<insert>、<update>、<delete>タグ

1. <select>要素

<select>要素は、SQLのselectステートメントをマップするために使用されます。サンプルコードは次のとおりです。

    <!-- 根据id查询用户   -->
    <select id="findById" parameterType="Integer" resultType="com.day1.entity.User">
        select * from t_user where id = #{id}
    </select>

 上記のサンプルコードでは、idの値は一意の識別子です。整数型のパラメータを受け取り、User型のオブジェクトを返します。結果セットは自動的にUser属性にマッピングされます。

上記のサンプルコードのいくつかの属性に加えて、次の表に示すように、<select>要素には一般的に使用される属性もいくつかあります。

属性名 描 述
id Mapper名前空間と組み合わせて使用​​され、MyBatisが呼び出す一意の識別子です。
parameterType SQLステートメントで渡されるパラメータータイプの完全修飾名またはエイリアスを表します。これはオプションの属性であり、MyBatisは特定の着信ステートメントのパラメーターを推測できます
resultType SQLステートメントの実行後に返されるタイプ(完全修飾名またはエイリアス)。コレクションタイプの場合、コレクション要素のタイプが返され、returnのときにresultTypeまたはresultMapのいずれかを使用できます。
resultMap これはマッピングセットへの参照であり、<resultMap>要素と一緒に使用されます。returnの場合、resultTypeまたはresultMapのいずれかを使用できます。
flushCache これは、SQLステートメントの呼び出し後に以前に照会されたローカルキャッシュと第2レベルのキャッシュをクリアするためにMyBatisが必要かどうかを設定するために使用されます。デフォルト値はfalseです。trueに設定すると、ローカルキャッシュと第2レベルのキャッシュは次のようになります。 SQLステートメントが呼び出されるたびにクリアされます。
useCache 第2レベルのキャッシュを開始するためのスイッチ。デフォルト値はtrueです。これは、クエリ結果が第2レベルのキャッシュに保存されることを意味します。
タイムアウト
タイムアウトパラメータを設定するために使用されます。単位は秒です。タイムアウトは例外をスローします
fetchSize レコードの総数設定を取得する
statementType 使用するJDBCステートメントをMyBatisに指示します。値は、STATEMENT(ステートメント)、PREPARED(PreparedStatement)、CALLABLE(CallableStatement)です。
resultSetType これはJDBCのResultSetインターフェース用であり、値はFORWARD_ONLY(順方向アクセスのみを許可)、SCROLL_SENSITIVE(双方向スクロール、ただし時間内に更新されない)、SCROLLJNSENSITIVE(双方向スクロール、タイムリーな更新)に設定できます。

 しかし、実際の開発では、複数のパラメーターを渡す必要があるかもしれませんが、それをどのように達成するのですか?これは、Mapインターフェースの使用とJavaBeanの使用の2つの方法で実行できます。

方法1:Mapインターフェースを使用して、複数のパラメーターを渡します。

(1)データベーステーブルを作成し、データを挿入します

CREATE TABLE `t_student` (
  `username` varchar(20) DEFAULT NULL,
  `age` int(11) DEFAULT NULL,
  `address` varchar(20) DEFAULT NULL
);
insert into t_student values("tom", 23 ,"陕西");
 insert into t_student values("王刚", 43,"安徽");
 insert into t_student values("张伟", 43 ,"北京");
 insert into t_student values("刘倩", 19,"北京");
 insert into t_student values("陆风", 21,"上海");
 insert into t_student values("齐菲", 56,"河北");
 insert into t_student values("王可", 56,"河南");


(2)Studentクラスを作成します

public class Student {
    private String username;
    private Integer age;
    private String address;

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    @Override
    public String toString() {
        return "Student{" +
                "username='" + username + '\'' +
                ", age=" + age +
                ", address='" + address + '\'' +
                '}';
    }
}

(3)IStudentDaoを作成します

public interface IStudentDao {
    List<Student> findStudent(Map<String, Object> map);
}

 (4)studentMapper.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">
<!--namespace:指定了唯一的命名空间-->
<mapper namespace="com.day1.dao.IStudentDao">
    <!--  查找年龄大于30且名字开头为张的学生  -->
    <select id="findStudent" resultType="com.day1.entity.Student">
        select * from t_student where age > #{age} and username like #{nstart};
    </select>
</mapper>

 (5)SqlMapperConfig.xmlでマッピング構成ファイルを指定します

<mapper resource="com/day1/studentMapper.xml"></mapper>

(6)テスト。

    @Test
    public void testFindStudent() throws IOException {
        //1、读取配置文件
        InputStream in = Resources.getResourceAsStream("SqlMapperConfig.xml");
        //2、创建SqlSessionFactory工厂
        SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
        SqlSessionFactory factory = builder.build(in);
        //3、使用工厂生产SqlSession对象
        SqlSession sqlSession = factory.openSession();
        //4、使用SqlSession创建dao接口的代理对象
        IStudentDao studentDao = sqlSession.getMapper(IStudentDao.class);
        //5、使用代理对象执行方案
        Map<String, Object> map = new HashMap<>();
        map.put("age", 30);
        map.put("nstart","张%");
        List<Student> students = studentDao.findStudent(map);
        for(Student stu : students){
            System.out.println(stu);
        }
        //6、释放资源
        sqlSession.close();
        in.close();
    }

方法2:JavaBeanを使用して複数のパラメーターを渡す

(1)IStudentDao addメソッドfindStudentNewWay();

List<Student> findStudentNewWay(Student student);

(2)studentMapper.xmlにクエリステートメントを追加します。

<select id="findStudentNewWay" resultType="com.day1.entity.Student" parameterType="com.day1.entity.Student">
        select * from t_student where age > #{age} and username like #{username};
    </select>

(3)テストを実行します。

    @Test
    public void testFindStudent2() throws IOException {
        //1、读取配置文件
        InputStream in = Resources.getResourceAsStream("SqlMapperConfig.xml");
        //2、创建SqlSessionFactory工厂
        SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
        SqlSessionFactory factory = builder.build(in);
        //3、使用工厂生产SqlSession对象
        SqlSession sqlSession = factory.openSession();
        //4、使用SqlSession创建dao接口的代理对象
        IStudentDao studentDao = sqlSession.getMapper(IStudentDao.class);
        //5、使用代理对象执行方案
        Student student = new Student();
        student.setAge(30);
        student.setUsername("张%");
        List<Student> students = studentDao.findStudentNewWay(student);
        for(Student stu : students){
            System.out.println(stu);
        }
        //6、释放资源
        sqlSession.close();
        in.close();
    }

推奨事項:パラメーターが少ない場合は、マップを選択することをお勧めします。パラメーターが多い場合は、JavaBeanを選択することをお勧めします。

2. <挿入>要素

<insert>要素は、挿入ステートメントをマップするために使用されます。挿入ステートメントを実行した後、MyBatisは影響を受ける行数を示す整数を返します。その属性は<select>要素の属性とほとんど同じですが、次の固有の属性があります。

  • keyProperty:このプロパティの機能は、挿入または更新操作の戻り値をPOクラスの特定のプロパティに割り当てることです。通常は、主キーに対応するプロパティに設定されます。共同主キーの場合、複数の値をカンマで区切ることができます。
  • keyColumn:このプロパティは、どの列が主キーであるかを設定するために使用されます。主キー列がテーブルの最初の列でない場合に設定する必要があります。共同主キーの場合、複数の値をカンマで区切ることができます。
  • useGeneratedKeys:この属性により、MyBatisはJDBCのgetGeneratedKeys()メソッドを使用して、MySQLやSQL Serverなどの自動インクリメントフィールドなど、データベースによって内部的に生成された主キーを取得します。デフォルト値はfalseです。

実際の開発で他のビジネスと関連付けるために主キーを使用する必要がある場合、それを完了するには2つの方法があります。1つ目はデータベーステーブルの自己インクリメント主キーを使用する方法、2つ目は<selectKeyを使用する方法です。 >主キーをカスタマイズして生成するMyBatisの要素。具体的な設定例のコードは次のとおりです。

    <!--  添加用户  -->
    <insert id="addUser" parameterType="com.day1.entity.User">
        <!--
        keyProperty:将查询到主键值设置到 parameterType 指定的对象的那个属性
        keyColumn:数据库中的列名
        order:SELECT LAST_INSERT_ID() 执行顺序,相对于 insert 语句来说它的执行顺序
        resultType:指定 SELECTLAST_INSERT_ID() 的结果类型
         -->
        <selectKey keyProperty="id" keyColumn="id" resultType="int" order="AFTER">
            select last_insert_id();
        </selectKey>
        insert into t_user(username, password) values(#{username}, #{password});
    </insert>

上記のサンプルコードを実行する場合、最初に<selectKey>要素が実行され、カスタムステートメントを介してデータテーブルの主キーが設定され、次に挿入ステートメントが実行されます。

<selectKey>要素のkeyProperty属性は、新しい主キー値が返されるPOクラスの属性を指定します。

  • order属性は、BEFOREまたはAFTERに設定できます。
  • BEFOREは、最初に<selectKey>要素を実行してから、挿入ステートメントを実行することを意味します。
  • AFTERは、最初に挿入ステートメントを実行してから、<selectKey>要素を実行することを意味します。

3. <update>および<delete>要素

<update>要素と<delete>要素は比較的単純です。それらの属性は<insert>要素と<select>要素の属性に似ています。また、実行後に整数を返し、データベースの行数が影響を受けました。構成例のコードは次のとおりです。

    <!--  删除用户  -->
    <delete id="deleteById" parameterType="int">
        delete from t_user where id = #{id}
    </delete>
    <!--  更新用户信息  -->
    <update id="updateUser" parameterType="com.day1.entity.User">
        update t_user set username =#{username}, password= #{password} where id = #{id}
    </update>

4.SQL要素

sql要素タグは再利用可能なSQLコードフラグメントを定義するために使用されます。これを使用する場合は、include要素タグを使用して引用するだけで、最終的にSQLステートメントの再利用の目的を達成できます。同時に静的に(読み込みパラメーター)パラメーター化、異なる属性値は、含まれているインスタンスによって変化し、次のように使用されます。

    <!--    建立sql片段-->
    <sql id="query_student">
        <if test="username != null and username !=''">
            and username like '%${username}%'
        </if>
    </sql>
    <!--    使用include引用sql片段-->
    <select id="findStudentList" parameterType="com.day1.entity.Student" resultType="com.day1.entity.Student">
        select * from t_student
        <where>
            <include refid="query_student"/>
        </where>
    </select>

 

おすすめ

転載: blog.csdn.net/weixin_47382783/article/details/113816962