mybatisプライマリマッピング

序文

体系的な学習知識については、知識の探求者を特定してください(公開番号と同じ)。著者を逃した場合、最初の紹介記事を何度も迂回する必要があるかもしれません。白人は、mybatisの構築プロセスに精通している必要があります。この記事主な話は、mybatisを使用してデータベースの追加、削除、変更を実装する方法、および関連するラベル属性と構成手順です。この記事は、将来の調査と作業の確固たる基盤であると言えます。Xiaobaiは、注意深く読んで慎重にノックする必要があります。以下は準備されたSQLステートメントです。この記事はとても強いので友達はいない!

CREATE TABLE `course` (
  `courseName` varchar(255) DEFAULT NULL COMMENT '课程名称',
  `coursePrice` decimal(10,2) DEFAULT NULL COMMENT '课程价格',
  `courseId` int(11) NOT NULL AUTO_INCREMENT COMMENT '课程id',
  PRIMARY KEY (`courseId`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8 COMMENT='课程';


INSERT INTO `mybatis`.`course`(`courseName`, `coursePrice`, `courseId`) VALUES ('java基础课', 500.00, 1);
INSERT INTO `mybatis`.`course`(`courseName`, `coursePrice`, `courseId`) VALUES ('javaWeb课程', 1000.00, 2);

复制代码

2つのpom.xml

導入された依存関係は前回の記事と一致していますが、今回はjunit単体テストを使用します。

 <dependencies>
        <!-- mybatis support-->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.4.6</version>
        </dependency>
        <!-- log4j support -->
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.17</version>
        </dependency>
        <!-- junit support -->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </dependency>
        <!-- mysql support -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>6.0.5</version>
        </dependency>

    </dependencies>
复制代码

3つのlog4j.properties

Log4j.propertiesはリソースディレクトリに配置され、パッケージ名を変更して、SQLの出力に使用されるログレベルをデバッグに設定します。

log4j.rootLogger = info,stdout

log4j.appender.stdout = org.apache.log4j.ConsoleAppender
## 注意改薄
log4j.logger.com.zszxz.mybatis.config.mapper = debug
log4j.appender.stdout.Target = System.out
log4j.appender.stdout.layout = org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern = [%-5p] %d{yyyy-MM-dd HH:mm:ss,SSS} method:%l%n%m%n

复制代码

4つのエンティティ

Mybatisは多くの場合、カプセル化パラメータとして使用できるエンティティを使用するか、返された結果セットをエンティティにマップします。

/**
 * @Author lsc
 * <p> </p>
 */
public class Course {

    // 课程名称
    private String courseName;
    // 课程价格
    private double coursePrice;
    // 主键
    private Long courseId;

    public String getCourseName() {
        return courseName;
    }

    public void setCourseName(String courseName) {
        this.courseName = courseName;
    }

    public double getCoursePrice() {
        return coursePrice;
    }

    public void setCoursePrice(double coursePrice) {
        this.coursePrice = coursePrice;
    }

    public Long getCourseId() {
        return courseId;
    }

    public void setCourseId(Long courseId) {
        this.courseId = courseId;
    }
}
复制代码

5つのマッパー構成

mybatis-config.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">

<!-- mybaits配置 -->
<configuration>

    <!-- 全局环境配置-->
    <environments default="development">
        <environment id="development">
            <!-- 事物 -->
            <transactionManager type="JDBC"/>
            <!-- 配置数据源 -->
            <dataSource type="POOLED">
                <!-- 数据库驱动 5.6以上版本使用com.mysql.cj.jdbc.Driver -->
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <!-- 数据库路径 -->
                <property name="url" value="jdbc:mysql://192.168.0.105:3306/mybatis"/>
                <!-- 账号-->
                <property name="username" value="root"/>
                <!--密码 -->
                <property name="password" value="123456"/>
            </dataSource>
        </environment>
    </environments>

    <!-- 引入自定义mapper.xml 在resource 目录下 -->
    <mappers>
        <mapper resource="configMapper/CourseMapper.xml"/>
    </mappers>
</configuration>
复制代码

6つのメソッド名クエリ

6.1 Mapperインターフェースとmxl

名前空間とインターフェースの関係、メソッド名とIDの関係、および戻り値はクラスの完全修飾名に注意してください。CourseMapper.xmlファイルは、リソースディレクトリの下のconfigMapperに配置されます。

CourseMapper.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.zszxz.mybatis.config.mapper.CourseMapper">

    <select id="getCourseList" resultType="com.zszxz.mybatis.config.entity.Course">
        SELECT * FROM course
    </select>
</mapper>    
复制代码

マッパーインターフェイス

public interface CourseMapper {

    /* *
     * @Author lsc
     * <p> 查询课程列表</p>
     * @Param []
     * @Return java.util.List<com.zszxz.mybatis.config.entity.Course>
     */
    List<Course> getCourseList();
  
  }  
复制代码

6.2クエリテスト

ここの@beforeアノテーションは、テストクラスが実行されるたびに実行されます。リストの背後にあるクエリテストでは、テストメソッドが直接リストされ、@ beforeアノテーションの下のメソッドは繰り返されません。

@RunWith(JUnit4.class)
public class SelectTest {

    SqlSession sqlSession = null;

    // @Before 会在执行测试类之前执行该方法
    @Before
    public void before() throws IOException {
        // 资源路径 resource目录下
        String resource = "mybatis-config.xml";
        // 配置mybatis获得输入流
        InputStream inputStream = Resources.getResourceAsStream(resource);
        // 创建 SqlSessionFactory
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        //从 SqlSessionFactory 中获取 SqlSession
        sqlSession= sqlSessionFactory.openSession();
    }
    /* *
     * @Author lsc
     * <p> 查询课程列表</p>
     * @Param []
     * @Return void
     */
    @Test
    public void testSelect(){
        // 使用传入方法名查询形式
        List<Course> getCourseList = sqlSession.selectList("getCourseList");
        for (Course course : getCourseList){
            System.out.println(course.getCourseName());
        }
        sqlSession.close();
    }
}    
复制代码

6.3テスト結果

==>  Preparing: SELECT * FROM course 
[DEBUG] 2019-12-05 21:02:00,238 method:org.apache.ibatis.logging.jdbc.BaseJdbcLogger.debug(BaseJdbcLogger.java:159)
==> Parameters: 
[DEBUG] 2019-12-05 21:02:00,256 method:org.apache.ibatis.logging.jdbc.BaseJdbcLogger.debug(BaseJdbcLogger.java:159)
<==      Total: 2
java基础课
javaWeb课程
复制代码

7つは取得インターフェイスを使用してクエリを実行します

このメソッドは主流のメソッドであり、クエリを実行するたびにメソッド名を入力することはできません。非常に非現実的です。目的の結果を得るために、オブジェクト指向の方法でメソッドを直接呼び出すことをお勧めします

7.1クエリテスト

テスト結果は前回と一致しています。

 @Test
    public void testSelect2(){
        // 获得mapper的形式
        CourseMapper courseMapper = sqlSession.getMapper(CourseMapper.class);
        // 遍历打印课程
        for (Course course : courseMapper.getCourseList()){
            System.out.println(course.getCourseName());
        }
        sqlSession.close();
    }


复制代码

7.2 selectタグの属性の説明

の属性 解説
id SQLを参照できる名前空間内の一意の識別子
parameterType 入力パラメーターの完全修飾名または別名、オプションの操作、デフォルトでは設定されていません。
resultType 期待されるタイプの戻り値のクラスの完全修飾名またはエイリアス。resultTypeまたはresultMapを使用できますが、両方は使用できません
resultMap 外部結果セットマッピング構成。エンティティフィールドでマッピングできます。resultTypeまたはresultMapは使用できますが、同時に使用することはできません
flushCache ローカルキャッシュと二次キャッシュをクリアするにはtrueを設定します。デフォルトはfalseです
useCache trueに設定すると、クエリ結果セットが2次キャッシュに保存されます。デフォルトは選択に対してtrueです。
タイムアウト ドライバーが例外をスローする前に待機する最大ミリ秒数。これはデフォルトでは設定されておらず、ドライバーによって異なります
fetchSize ドライバーは毎回バッチで行を返します。これはデフォルトでは設定されていません
statementType STATEMENT、PREPARE、またはCALLABLEを設定します。ステートメント、PreparedStatementまたはCallableStatementをそれぞれ使用します。デフォルト値はPREPAREDです。
resultSetType 結果セットタイプFORWARD_ONLY、SCROLL_SENSITIVE、SCROLL_INSENSITIVE、またはDEFAULT(未設定と同等)のデフォルトをDEFAULTの設定に設定します
databaseId データベースベンダー識別子(databaseIdProvider)が構成されている場合、databaseIdがないか、現在のdatabaseIdに一致するすべてのステートメントが読み込まれます。ステートメントがある場合とない場合は、ステートメントがない場合は無視されます。
resultOrdered ネストされたクエリステートメントで使用され、trueに設定されている場合、SQL実行結果はネストされた結果またはグループ化されます。
resultSets 複数の結果セットの場合、結果セット名がコンマで区切られてリストされます

8つの通常の追加

8.1マッパーインターフェースメソッド

    /* *
     * @Author lsc
     * <p> 普通新增</p>
     * @Param [course]
     * @Return int
     */
    int addCourse(Course course);
复制代码

8.2 mxlステートメント

    <insert id="addCourse" parameterType="com.zszxz.mybatis.config.entity.Course">
        INSERT INTO course ( courseName, coursePrice ) VALUES ( #{ courseName },#{ coursePrice });
    </insert>
复制代码

8.3テスト

 @Test
    public void testInsert(){

		// 创建入参实体 Course
        Course course = new Course();
        course.setCourseName("知识追寻者的心理课");
        course.setCoursePrice(10000);
        // 获得mapper
        CourseMapper courseMapper = sqlSession.getMapper(CourseMapper.class);
        // 调用添加课程方法
        courseMapper.addCourse(course);
        // 事物提交
        sqlSession.commit();
        // 关闭会话
        sqlSession.close();
    }
复制代码

8.4実行結果

#{}を使用してネイティブjdbcプリコンパイル結果をxmlで取得していることがわかります。各エントリはa?プレースホルダーの形式であり、SQLインジェクションの問題を効果的に防止します。通常、$ {}はフィールド名とテーブル名の取得に使用されますパラメータを入力する代わりに、それ以外の場合はSQLインジェクションのリスクがあります。

[DEBUG] 2019-12-05 21:58:44,193 method:org.apache.ibatis.logging.jdbc.BaseJdbcLogger.debug(BaseJdbcLogger.java:159)
==>  Preparing: INSERT INTO course ( courseName, coursePrice ) VALUES ( ?,?); 
[DEBUG] 2019-12-05 21:58:44,221 method:org.apache.ibatis.logging.jdbc.BaseJdbcLogger.debug(BaseJdbcLogger.java:159)
==> Parameters: 知识追寻者的心理课(String), 10000.0(Double)
[DEBUG] 2019-12-05 21:58:44,224 method:org.apache.ibatis.logging.jdbc.BaseJdbcLogger.debug(BaseJdbcLogger.java:159)
<==    Updates: 1
复制代码

主キーに戻るための9つの新しい方法

9.1 Mapperインターフェースメソッド

    /* *
     * @Author lsc
     * <p> 新增数据并获得主键方式1</p>
     * @Param [course]
     * @Return int
     */
    int addCourseAndGetIdbyGen(Course course);
复制代码

9.2 mxlステートメント

では<insert>ラベルと比較して、<select>ラベルの余分な3つの属性。

  1. useGeneratedKeystrueの場合、JDBCのgetGeneratedKeysメソッドを使用して、データベースによって内部的に生成された主キーを取得することを意味します。これは、mysqlやsqlServerなど、自己拡張型の主キーを持つデータベース管理システムに適していますデフォルトはfalseで、挿入および更新操作でのみ有効です。
  2. keyProperty 主キーに代わって、mybaitsはこの列に主キーを割り当てます。ここではエンティティフィールドCourseIdを構成します。複数の列に割り当てることを希望します。デフォルトはカンマで区切られます。デフォルトは設定されていません。挿入および更新操作でのみ有効です。
  3. keyColumn主キー列がテーブルの最初の列でない場合に設定する必要があります。生成された複数の列を使用する場合は、属性名のコンマ区切りのリストを設定することもできます。ここで設定する必要があります。作成者が3番目の列に主キーを配置し、作成者の記事を読んでいない子がエラーを注意深く待機するためです。デフォルトは未設定で、挿入および更新操作でのみ有効です。
   <insert id="addCourseAndGetIdbyGen" parameterType="com.zszxz.mybatis.config.entity.Course" useGeneratedKeys="true" keyProperty="courseId" keyColumn="courseId">
        INSERT INTO course ( courseName, coursePrice ) VALUES ( #{ courseName },#{ coursePrice });
    </insert>
复制代码

9.3テスト

Xiaobai、挿入から取得された主キーは、入力のコースエンティティ属性から取得されることに注意してください。

    @Test
    public void testInsertGetId1(){

        Course course = new Course();
        course.setCourseName("知识追寻者的课程1");
        course.setCoursePrice(100000);
        CourseMapper courseMapper = sqlSession.getMapper(CourseMapper.class);
        courseMapper.addCourseAndGetIdbyGen(course);
        //
        System.out.println("返回的课程id: "+course.getCourseId());
        sqlSession.commit();
        sqlSession.close();
    }
复制代码

9.4結果

[DEBUG] 2019-12-05 22:17:01,788 method:org.apache.ibatis.logging.jdbc.BaseJdbcLogger.debug(BaseJdbcLogger.java:159)
==>  Preparing: INSERT INTO course ( courseName, coursePrice ) VALUES ( ?,?); 
[DEBUG] 2019-12-05 22:17:01,820 method:org.apache.ibatis.logging.jdbc.BaseJdbcLogger.debug(BaseJdbcLogger.java:159)
==> Parameters: 知识追寻者的课程1(String), 100000.0(Double)
[DEBUG] 2019-12-05 22:17:01,822 method:org.apache.ibatis.logging.jdbc.BaseJdbcLogger.debug(BaseJdbcLogger.java:159)
<==    Updates: 1
返回的课程id: 4
复制代码

主キーに戻る10の新しい方法

10.1 Mapperインターフェースメソッド

    /* *
     * @Author lsc
     * <p> 新增数据并获得主键方式2</p>
     * @Param [course]
     * @Return int
     */
    int addCourseAndGetIdbyKey(Course course);
复制代码

10.2 mxlステートメント

ここで使用されるように、<selectKey>タグは、Oracleのように、これは、主キー自己増力データベース管理システムを持っていないために使用されているデータをプライマリキーを持つ自己増力データベース管理システムでは、このように使用されるプライマリキーを挿入するためのリターンを行い、およびサポートするために、各データベース管理システム<selectKey>タグを内容は異なりますが、すべて似ていますので、データベース管理システムの関連ドキュメントを参照して利用できます。MySQLなどの主キー自己増加データベース管理システムは、ステートメントが挿入された後に主キーを取得するため順序属性が使用されることに注意してください。それがOracleなどの非自己増加主キーデータベース管理システムの場合、主キーそして存在するためには、プロパティを以前に設定する必要があります。

    <insert id="addCourseAndGetIdbyKey" parameterType="com.zszxz.mybatis.config.entity.Course">
        INSERT INTO course ( courseName, coursePrice, courseId ) VALUES ( #{ courseName },#{ coursePrice },#{ courseId });
        <selectKey resultType="long" order="AFTER" keyProperty="courseId">
            SELECT LAST_INSERT_ID();
        </selectKey>
    </insert>
复制代码

10.3テスト

コードは非常に美しく、作者からの追加コメントは必要ありません。

	 @Test
    public void testInsertGetId2(){

        Course course = new Course();
        course.setCourseName("知识追寻者的课程2");
        course.setCoursePrice(100000);
        CourseMapper courseMapper = sqlSession.getMapper(CourseMapper.class);
        courseMapper.addCourseAndGetIdbyGen(course);
        //
        System.out.println("返回的课程id: "+course.getCourseId());
        sqlSession.commit();
        sqlSession.close();
    }
复制代码

10.4実行結果

[DEBUG] 2019-12-05 22:25:31,232 method:org.apache.ibatis.logging.jdbc.BaseJdbcLogger.debug(BaseJdbcLogger.java:159)
==>  Preparing: INSERT INTO course ( courseName, coursePrice ) VALUES ( ?,?); 
[DEBUG] 2019-12-05 22:25:31,258 method:org.apache.ibatis.logging.jdbc.BaseJdbcLogger.debug(BaseJdbcLogger.java:159)
==> Parameters: 知识追寻者的课程2(String), 100000.0(Double)
[DEBUG] 2019-12-05 22:25:31,261 method:org.apache.ibatis.logging.jdbc.BaseJdbcLogger.debug(BaseJdbcLogger.java:159)
<==    Updates: 1
返回的课程id: 5
复制代码

11の更新操作

更新は、クエリや挿入に比べて比較的簡単です。

11.1 Mapperインターフェースメソッド

    /* *
     * @Author lsc
     * <p> </p>
     * @Param [course]
     * @Return int
     */
    int updateCourse(Course course);
复制代码

11.2 mxlステートメント

    <update id="updateCourse" parameterType="com.zszxz.mybatis.config.entity.Course">
        UPDATE  course set courseName = #{courseName}, coursePrice = #{coursePrice}
         WHERE courseId = #{courseId}
    </update>
复制代码

11.3テスト

    @Test
    public void testUpdate2(){

        Course course = new Course();
        course.setCourseName("知识追寻者的课程3");
        course.setCoursePrice(1000);
        course.setCourseId(5L);
        CourseMapper courseMapper = sqlSession.getMapper(CourseMapper.class);
        courseMapper.updateCourse(course);
        sqlSession.commit();
        sqlSession.close();
    }
复制代码

11.4実行結果

[DEBUG] 2019-12-05 22:38:46,093 method:org.apache.ibatis.logging.jdbc.BaseJdbcLogger.debug(BaseJdbcLogger.java:159)
==>  Preparing: UPDATE course set courseName = ?, coursePrice = ? WHERE courseId = ? 
[DEBUG] 2019-12-05 22:38:46,121 method:org.apache.ibatis.logging.jdbc.BaseJdbcLogger.debug(BaseJdbcLogger.java:159)
==> Parameters: 知识追寻者的课程3(String), 1000.0(Double), 5(Long)
[DEBUG] 2019-12-05 22:38:46,124 method:org.apache.ibatis.logging.jdbc.BaseJdbcLogger.debug(BaseJdbcLogger.java:159)
<==    Updates: 1
复制代码

12の削除操作

削除操作は更新操作に似ており、スキルに問題はありません。

12.1 Mapperインターフェースメソッド

    /* *
     * @Author lsc
     * <p> </p>
     * @Param []
     * @Return int
     */
    int deleteCourse(Long courseId);
复制代码

12.2 mxlステートメント

    <delete id="deleteCourse" parameterType="long">
        DELETE FROM course WHERE courseId = #{courseId}
    </delete>
复制代码

12.3テスト

    @Test
    public void testDelte(){

        CourseMapper courseMapper = sqlSession.getMapper(CourseMapper.class);
        courseMapper.deleteCourse(1L);
        sqlSession.commit();
        sqlSession.close();
    }
复制代码

12.4実行結果

[DEBUG] 2019-12-05 22:39:29,926 method:org.apache.ibatis.logging.jdbc.BaseJdbcLogger.debug(BaseJdbcLogger.java:159)
==>  Preparing: DELETE FROM course WHERE courseId = ? 
[DEBUG] 2019-12-05 22:39:29,952 method:org.apache.ibatis.logging.jdbc.BaseJdbcLogger.debug(BaseJdbcLogger.java:159)
==> Parameters: 1(Long)
[DEBUG] 2019-12-05 22:39:29,955 method:org.apache.ibatis.logging.jdbc.BaseJdbcLogger.debug(BaseJdbcLogger.java:159)
<==    Updates: 1
复制代码

13の参照ドキュメント

mybatis公式ドキュメント

おすすめ

転載: juejin.im/post/5e959b356fb9a03c451bd177