MyBatis3 (2) 增刪改查

1. SQL配置文件

概念: SQL配置文件用於配置SQL語句塊以及SQL相關配置:java

  • 開發實體類:數據庫主鍵無符號使用Integer對應,有符號使用Long對應。
  • 配置別名:除mybatis內置別名外,核心配置文件中的 <typeAliases> 可配置自定義別名:
    • <typeAlias type="類全名" alias="別名">:單類配置別名。
    • <package name="包名">:整包配置別名,此時類名即別名,不區分大小寫。
  • 配置二級緩存:<cache> 用於開啓二級緩存,此時全部DQL都會被緩存,全部DML都會更新緩存:
    • eviction:緩存逐出機制,默認 LRU,逐出最長時間不被使用的緩存對象,可改成 FIFO,按對象進入緩存的順序逐出,或改成 SOFT,按照GC規則逐出,或改成 WEAK,更積極地按照GC規則逐出。
    • flushInterval:緩存刷新間隔,單位毫秒,默認不設置,表示緩存僅僅調用語句時刷新。
    • readOnly:默認 false,表示全部調用者都只能獲得緩存對象的一個拷貝,效率低但安全,可改成 true,全部調用者獲得的都是相同的緩存對象,性能高但不安全。
    • size:緩存大小,默認1024個,表示緩存會存儲1024個列表集合或對象的引用。
    • type:覆蓋緩存類,容許使用第三方或者自定義緩存的類全名,覆蓋mybatis的預約義緩存機制。
    • <cache-ref namespace=""> 用於引入其餘SQL配置文件的緩存配置,歸一原則。
  • 開發SQL配置文件:配置根標籤 <mapper> 的 namespace 以隔離語句。
  • 引入SQL配置文件:在覈心配置文件中使用 <mappers resource=""> 引入。
  • 取消IDEA中SQL語句黃綠色背景:File - Settings - Editor:
    • Inspections - SQL - 取勾 No data sources configured 和 SQL dialect detection
    • Color Scheme - General - Code - Injected language fragment - 取勾 Background

mybatis內置別名.mdsql

源碼: /mybatis3/數據庫

  • res: classpath:mybatis-crud.xml
<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd"><configuration><properties resource="jdbc/db.propertiesyap"/><!--別名掃描--><typeAliases><!--<typeAlias type="com.yap.pojo.Student" alias="student"/>--><package name="com.yap.pojo"/></typeAliases><environments default="development"><environment id="development"><transactionManager type="JDBC"/><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><mappers><mapper resource="mapper/student-mapper.xml"/><mapper resource="mapper/teacher-mapper.xml"/><mapper resource="mapper/worker-mapper.xml"/></mappers></configuration>複製代碼
  • res: classpath:mapper/student-mapper.xml
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"><mapper namespace="studentSpace"><cache readOnly="true"/><!--sql重用快--><sql id="cols">`id`, `name`, `gender`, `age`, `info`</sql><insert id="insert" parameterType="student" useGeneratedKeys="true" keyProperty="id">INSERT INTO `student` (<include refid="cols"/>)
        VALUES (#{id}, #{name}, #{gender}, #{age}, #{info})</insert><insert id="insertWithSelectKey"><selectKey order="AFTER" keyProperty="id" resultType="int">SELECT last_insert_id()</selectKey>INSERT INTO `student` (<include refid="cols"/>)
        VALUES (#{id}, #{name}, #{gender}, #{age}, #{info})</insert><select id="findById" resultType="student">SELECT<include refid="cols"/>FROM `student`
        WHERE `id` = #{id}</select><select id="findLikeName" resultType="student">SELECT<include refid="cols"/>FROM `student`
        WHERE `name` like '%${value}%'</select><select id="findLikeNameWithConcat" resultType="student">SELECT<include refid="cols"/>FROM `student`
        WHERE `name` like concat('%', #{name}, '%')</select><update id="updateById">UPDATE `student`
        SET `name`   = #{name},
            `age`    = #{age},
            `gender` = #{gender},
            `info`   = #{info}
        WHERE `id` = #{id}</update><delete id="deleteById">DELETE
        FROM `student`
        WHERE `id` = #{id}</delete><resultMap id="findAllMap" type="student"><id column="name" property="id" javaType="int" jdbcType="INT"/><result column="name" property="name" javaType="string" jdbcType="VARCHAR"/><result column="age" property="age" jdbcType="VARCHAR"/><result column="gender" property="gender"/><result column="info" property="info"/></resultMap><select id="findAll" resultMap="findAllMap">SELECT<include refid="cols"/>FROM `student`</select></mapper>複製代碼
  • res: classpath:mapper/worker-mapper.xml
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"><mapper namespace="com.yap.mapper.WorkerMapper"><insert id="insert" useGeneratedKeys="true" keyProperty="id">INSERT INTO `worker` (`id`, `name`, `gender`, `age`, `info`)
        VALUES (#{id}, #{name}, #{gender}, #{age}, #{info})</insert><select id="findById" resultType="worker">SELECT `id`, `name`, `gender`, `age`, `info`
        FROM `worker`
        WHERE `id` = #{id}</select><select id="findLikeName" resultType="worker">SELECT `id`, `name`, `gender`, `age`, `info`
        FROM `worker`
        WHERE `name` like concat('%', #{name}, '%')</select><update id="updateById">UPDATE `worker`
        SET `name`   = #{name},
            `age`    = #{age},
            `gender` = #{gender},
            `info`   = #{info}
        WHERE `id` = #{id}</update><delete id="deleteById">DELETE
        FROM `worker`
        WHERE `id` = #{id}</delete></mapper>複製代碼
  • res: classpath:mapper/teacher-mapper.xml
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"><mapper namespace="com.yap.mapper.TeacherMapper"><cache-ref namespace="studentSpace"/></mapper>複製代碼
  • src: c.y.pojo.Student/Worker/Teacher
package com.yap.pojo;import lombok.AllArgsConstructor;import lombok.Data;import lombok.NoArgsConstructor;import java.io.Serializable;/**
 * @author yap
 */@Data@AllArgsConstructor@NoArgsConstructorpublic class Teacher implements Serializable {private Integer id;private String name;private Integer gender;private Integer age;private String info;
}複製代碼
2. DML語句塊

流程: DML操做能夠省略 parameterType,必須省略 resultType:apache

  • 開發 <insert id="insert">:單表添加普通版語句塊:
    • useGeneratedKeys="true":啓用主鍵回注機制。
    • keyProperty="id":指定主鍵回注到哪一個字段中。
  • 開發 <insert id="insertWithSelectKey">:單表添加SelectKey版語句塊:
    • <selectKey>:設置子語句塊,伴隨 <insert> 一同執行。
    • order="BEFORE":設置子語句塊在 <insert> 語句以前執行。
    • keyProperty="id":設置子語句塊的查詢結果回注到 id 字段中。
    • resultType:指定回注字段的類全名,不可省略。
    • SELECT last_insert_id():返回最後一條插入記錄的註解。
    • SELECT uuid():返回一個隨機字符串。
  • 開發 <update id="updateById">:單表修改語句塊。
  • 開發 <delete id="deleteById">:單表刪除語句塊。
  • 開發SQL語句: 支持佔位符 #{} 時,自動補充單引號:
    • 參數若爲實體類,則佔位符中必須爲實體類中對應屬性名,支持多級連調。
    • 參數若爲簡單類,則佔位符中內容能夠隨意填寫,但不能不寫。
  • 測試:
    • session.insert("命名空間.SQL語句塊ID", 入參):添加數據。
    • session.update("命名空間.SQL語句塊ID", 入參):修改數據。
    • session.delete("命名空間.SQL語句塊ID", 入參):刪除數據。

源碼: /mybatis3/緩存

  • res: classpath:mapper/student-mapper.xml
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"><mapper namespace="studentSpace"><cache readOnly="true"/><sql id="cols">`id`, `name`, `gender`, `age`, `info`</sql><insert id="insert" parameterType="student" useGeneratedKeys="true" keyProperty="id">INSERT INTO `student` (<include refid="cols"/>)
        VALUES (#{id}, #{name}, #{gender}, #{age}, #{info})</insert><insert id="insertWithSelectKey"><selectKey order="AFTER" keyProperty="id" resultType="int">SELECT last_insert_id()</selectKey>INSERT INTO `student` (<include refid="cols"/>)
        VALUES (#{id}, #{name}, #{gender}, #{age}, #{info})</insert><select id="findById" resultType="student">SELECT<include refid="cols"/>FROM `student`
        WHERE `id` = #{id}</select><select id="findLikeName" resultType="student">SELECT<include refid="cols"/>FROM `student`
        WHERE `name` like '%${value}%'</select><select id="findLikeNameWithConcat" resultType="student">SELECT<include refid="cols"/>FROM `student`
        WHERE `name` like concat('%', #{name}, '%')</select><update id="updateById">UPDATE `student`
        SET `name`   = #{name},
            `age`    = #{age},
            `gender` = #{gender},
            `info`   = #{info}
        WHERE `id` = #{id}</update><delete id="deleteById">DELETE
        FROM `student`
        WHERE `id` = #{id}</delete><resultMap id="findAllMap" type="student"><id column="name" property="id" javaType="int" jdbcType="INT"/><result column="name" property="name" javaType="string" jdbcType="VARCHAR"/><result column="age" property="age" jdbcType="VARCHAR"/><result column="gender" property="gender"/><result column="info" property="info"/></resultMap><select id="findAll" resultMap="findAllMap">SELECT<include refid="cols"/>FROM `student`</select></mapper>複製代碼
  • tst: c.y.crud.StudentTest.insert()
package com.yap.crud;import com.yap.pojo.Student;import com.yap.util.MyBatisUtil;import org.apache.ibatis.session.SqlSession;import org.apache.ibatis.session.SqlSessionFactory;import org.junit.Test;/**
 * @author yap
 */public class StudentTest {private SqlSessionFactory factory = MyBatisUtil.getFactory("mybatis-crud.xml");@Testpublic void insert() {
        Student zhaosi = new Student(null, "趙四", 1, 58, "亞洲舞王");
        Student liunneng = new Student(10, "劉能", 0, 19, "玉田花圃");
        SqlSession session = factory.openSession();try {
            session.insert("studentSpace.insert", zhaosi);
            session.insert("studentSpace.insert", liunneng);
            session.commit();
            System.out.println(zhaosi);
            System.out.println(liunneng);
        } catch (Exception e) {
            session.rollback();
            e.printStackTrace();
        } finally {
            session.close();
        }
    }
}複製代碼
  • tst: c.y.crud.StudentTest.insertWithSelectKey()
    @Testpublic void insertWithSelectKey() {
        Student dajiao = new Student(null, "大腳", 0, 18, "大腳超市");
        SqlSession session = factory.openSession();try {
            session.insert("studentSpace.insertWithSelectKey", dajiao);
            session.commit();
            System.out.println(dajiao);
        } catch (Exception e) {
            session.rollback();
            e.printStackTrace();
        } finally {
            session.close();
        }
    }複製代碼
  • tst: c.y.crud.StudentTest.updateById()
    @Testpublic void updateById() {
        SqlSession session = factory.openSession();
        Student zhaosi = new Student(1, "謝廣坤", 1, 60, "廣坤山貨");try {
            session.update("studentSpace.updateById", zhaosi);
            session.commit();
        } catch (Exception e) {
            session.rollback();
            e.printStackTrace();
        } finally {
            session.close();
        }
    }複製代碼
  • tst: c.y.crud.StudentTest.deleteById()
@Testpublic void deleteById() {
        SqlSession session = factory.openSession();try {
            session.delete("studentSpace.deleteById", 1);
            session.commit();
        } catch (Exception e) {
            session.rollback();
            e.printStackTrace();
        } finally {
            session.close();
        }
    }複製代碼
3. DQL語句塊

流程: DQL能夠省略 parameterType,必須使用 resultType 指定返回值或其泛型的類全名或別名:安全

  • 開發 <select id="findById">:單表單查語句塊。
  • 開發 <select id="findLikeName">:單表多查拼接符版語句塊。
  • 開發 <select id="findLikeNameWithConcat">:單表多查佔位符版語句塊。
  • 開發SQL語句:支持拼接符 ${value} 時,不會自動補充單引號,有注入漏洞:
    • 參數若爲實體類,則佔位符中必須爲實體類中對應屬性名,支持多級連調。
    • 參數若爲簡單類,則佔位符中內容必須是 value。
  • SQL注入漏洞:此WEB漏洞的本質是將用戶輸入的數據當作代碼執行以***系統:
    • like '%${value}%':有漏洞,若***者傳入 'or' 時會直接執行全查。
    • like concat('%', #{name}, '%'):無注入漏洞問題。
  • SQL重用塊:
    • <sql id=""> 用來封裝一個SQL重用代碼段。
    • <include refid=""> 能夠在當前文件中任意位置引入某個SQL重用代碼段。
  • SQL高級映射:resultMap 用於替代 resultType,指向一個獨立的 <resultMap id="">:
    • 使用屬性 type 指定最終返回值類型全名或別名。
    • 使用子標籤 <result> 中的 column 映射表字段名。
    • 使用子標籤 <result> 中的 jdbcType 映射表字段類型,必須大寫。
    • 使用子標籤 <result> 中的 property 映射實體類對應屬性名。
    • 使用子標籤 <result> 中的 javaType 映射實體類的屬性類型,能夠省略。
    • 使用子標籤 <id> 配置主鍵字段,屬性同上。
  • DQL語句塊其餘屬性:
    • resultMap:引用 <resultMap> 的id 名,不能與 resultType 同時使用。
    • flushCache:每次調用該語句塊前是否清空其緩存以保證結果最新,默認 false。
    • useCache:該語句塊的結果集是否會被緩存,默認 true。
    • timeout:語句塊超時時間,默認數值由驅動器決定。
    • fetchSize:結果集條目數達到此閾值時馬上返回結果,默認數值由驅動器決定。
    • statementType:SQL媒介類型默認爲預處理 PREPARED,可改成不預處理 STATEMENT 或存儲過程 CALLABLE。
  • 測試:
    • session.selectOne("命名空間.SQL語句塊ID", 入參):查詢單條數據。
    • session.selectList("命名空間.SQL語句塊ID", 入參):查詢多條數據。

jdbcType枚舉類型.pngsession

源碼: /mybatis3/mybatis

  • res: classpath:mapper/student-mapper.xml
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"><mapper namespace="studentSpace"><cache readOnly="true"/><sql id="cols">`id`, `name`, `gender`, `age`, `info`</sql><insert id="insert" parameterType="student" useGeneratedKeys="true" keyProperty="id">INSERT INTO `student` (<include refid="cols"/>)
        VALUES (#{id}, #{name}, #{gender}, #{age}, #{info})</insert><insert id="insertWithSelectKey"><selectKey order="AFTER" keyProperty="id" resultType="int">SELECT last_insert_id()</selectKey>INSERT INTO `student` (<include refid="cols"/>)
        VALUES (#{id}, #{name}, #{gender}, #{age}, #{info})</insert><select id="findById" resultType="student">SELECT<include refid="cols"/>FROM `student`
        WHERE `id` = #{id}</select><select id="findLikeName" resultType="student">SELECT<include refid="cols"/>FROM `student`
        WHERE `name` like '%${value}%'</select><select id="findLikeNameWithConcat" resultType="student">SELECT<include refid="cols"/>FROM `student`
        WHERE `name` like concat('%', #{name}, '%')</select><update id="updateById">UPDATE `student`
        SET `name`   = #{name},
            `age`    = #{age},
            `gender` = #{gender},
            `info`   = #{info}
        WHERE `id` = #{id}</update><delete id="deleteById">DELETE
        FROM `student`
        WHERE `id` = #{id}</delete><resultMap id="findAllMap" type="student"><id column="name" property="id" javaType="int" jdbcType="INT"/><result column="name" property="name" javaType="string" jdbcType="VARCHAR"/><result column="age" property="age" jdbcType="VARCHAR"/><result column="gender" property="gender"/><result column="info" property="info"/></resultMap><select id="findAll" resultMap="findAllMap">SELECT<include refid="cols"/>FROM `student`</select></mapper>複製代碼
  • tst: c.y.crud.StudentTest.findById()
    @Testpublic void findById() {try (SqlSession session = factory.openSession();) {
            System.out.println((Student) session.selectOne("studentSpace.findById", 1));
            System.out.println((Student) session.selectOne("studentSpace.findById", new Student(1, null, null, null, null)));
        } catch (Exception e) {
            e.printStackTrace();
        }
    }複製代碼
  • tst: c.y.crud.StudentTest.findLikeName()
    @Testpublic void findLikeName() {try (SqlSession session = factory.openSession()) {
            System.out.println(session.selectList("studentSpace.findLikeName", "劉"));
            System.out.println(session.selectList("studentSpace.findLikeName", "'or'"));
        } catch (Exception e) {
            e.printStackTrace();
        }
    }複製代碼
  • tst: c.y.crud.StudentTest.findLikeNameWithConcat()
    @Testpublic void findLikeNameWithConcat() {try (SqlSession session = factory.openSession()) {
            System.out.println(session.selectList("studentSpace.findLikeNameWithConcat", "劉"));
            System.out.println(session.selectList("studentSpace.findLikeNameWithConcat", "'or'"));
        } catch (Exception e) {
            e.printStackTrace();
        }
    }複製代碼
  • tst: c.j.crud.StudentTest.findAll()
複製代碼
4. 接口開發

流程: 接口動態代理模式須要額外開發一個遵照對應關係的java接口:app

  • 四大對應:
    • 接口類全名對應SQL配置文件的 namespace。
    • 接口方法返回值類型對應SQL語句塊的 resultType。
    • 接口方法方法名對應SQL語句塊的 id。
    • 接口方法形參對應SQL語句塊的 parameterType。
  • 測試:session.getMapper():獲取接口對象後直接調用接口方法。

源碼: /mybatis3/ide

  • res: classpath:mapper/worker-mapper.xml
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"><mapper namespace="com.yap.mapper.WorkerMapper"><insert id="insert" useGeneratedKeys="true" keyProperty="id">INSERT INTO `worker` (`id`, `name`, `gender`, `age`, `info`)
        VALUES (#{id}, #{name}, #{gender}, #{age}, #{info})</insert><select id="findById" resultType="worker">SELECT `id`, `name`, `gender`, `age`, `info`
        FROM `worker`
        WHERE `id` = #{id}</select><select id="findLikeName" resultType="worker">SELECT `id`, `name`, `gender`, `age`, `info`
        FROM `worker`
        WHERE `name` like concat('%', #{name}, '%')</select><update id="updateById">UPDATE `worker`
        SET `name`   = #{name},
            `age`    = #{age},
            `gender` = #{gender},
            `info`   = #{info}
        WHERE `id` = #{id}</update><delete id="deleteById">DELETE
        FROM `worker`
        WHERE `id` = #{id}</delete></mapper>複製代碼
  • src: c.y.mapper.WorkerMapper
package com.yap.mapper;import com.yap.pojo.Worker;import java.util.List;/**
 * @author yap
 */public interface WorkerMapper {/**
     * 根據主鍵查詢一條信息
     *
     * @param id 主鍵
     * @return 對應主鍵的一條信息
     */Worker findById(int id);/**
     * 添加一條工人信息
     *
     * @param worker 工人實體
     */void insert(Worker worker);/**
     * 按照姓名模糊查詢全部符合條件的工人
     *
     * @param name 姓名的模糊查詢部分
     * @return 全部符合條件的工人
     */List<Worker> findLikeName(String name);/**
     * 根據主鍵修改一條工人信息
     *
     * @param worker 工人實體
     */void updateById(Worker worker);/**
     * 根據主鍵刪除工人
     *
     * @param id 主鍵
     */void deleteById(int id);
}複製代碼
  • tst: c.y.crud.WorkerTest
package com.yap.crud;import com.yap.mapper.WorkerMapper;import com.yap.pojo.Worker;import com.yap.util.MyBatisUtil;import org.apache.ibatis.session.SqlSession;import org.apache.ibatis.session.SqlSessionFactory;import org.junit.Test;/**
 * @author yap
 */public class WorkerTest {private SqlSessionFactory factory = MyBatisUtil.getFactory("mybatis-crud.xml");@Testpublic void insert() {
        SqlSession session = factory.openSession();
        WorkerMapper workerMapper = session.getMapper(WorkerMapper.class);try {
            workerMapper.insert(new Worker(null, "趙四", 1, 58, "亞洲舞王"));
            workerMapper.insert(new Worker(null, "趙五", 1, 58, "亞洲舞王"));
            workerMapper.insert(new Worker(null, "王四", 1, 58, "亞洲舞王"));
            workerMapper.insert(new Worker(null, "王五", 1, 58, "亞洲舞王"));
            session.commit();
        } catch (Exception e) {
            session.rollback();
            e.printStackTrace();
        } finally {
            session.close();
        }
    }@Testpublic void findById() {try (SqlSession session = factory.openSession()) {
            WorkerMapper workerMapper = session.getMapper(WorkerMapper.class);
            System.out.println(workerMapper.findById(1));
        } catch (Exception e) {
            e.printStackTrace();
        }
    }@Testpublic void findLikeName() {try (SqlSession session = factory.openSession()) {
            WorkerMapper workerMapper = session.getMapper(WorkerMapper.class);
            System.out.println(workerMapper.findLikeName("四"));
        } catch (Exception e) {
            e.printStackTrace();
        }
    }@Testpublic void updateById() {
        SqlSession session = factory.openSession();
        WorkerMapper workerMapper = session.getMapper(WorkerMapper.class);try {
            workerMapper.updateById(new Worker(1, "劉能", 1, 58, "村副主任"));
            session.commit();
        } catch (Exception e) {
            session.rollback();
            e.printStackTrace();
        } finally {
            session.close();
        }
    }@Testpublic void deleteById() {
        SqlSession session = factory.openSession();
        WorkerMapper workerMapper = session.getMapper(WorkerMapper.class);try {
            workerMapper.deleteById(1);
            session.commit();
        } catch (Exception e) {
            session.rollback();
            e.printStackTrace();
        } finally {
            session.close();
        }
    }
}複製代碼

4.2 註解SQL

流程: 接口開發模式下,可以使用註解替代SQL語句塊,雖簡化了代碼,但不適用於複雜SQL:

  • 開發SQL配置文件:即便不寫SQL語句塊,namespace 仍要對應接口類全名。
  • 開發接口:在接口方法上直接使用註解來完成SQL的編寫:
    • @Select/@Insert/@Update/@Delete:編寫增刪改查的SQL語句。
    • @Options:用於配置緩存,超時時間,主鍵回注等。
  • 測試:session.getMapper():獲取接口對象後直接調用接口方法。

源碼: /mybatis3/

  • res: classpath:mapper/teacher-mapper.xml
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"><mapper namespace="com.yap.mapper.TeacherMapper"><cache-ref namespace="studentSpace"/></mapper>複製代碼
  • src: c.y.mapper.TeacherMapper
package com.yap.mapper;import com.yap.pojo.Teacher;import org.apache.ibatis.annotations.*;import java.util.List;/**
 * @author yap
 */public interface TeacherMapper {/**
     * 添加一條教師信息
     *
     * @param teacher 教師實體
     */@Insert("INSERT INTO `teacher` (`name`, `gender`, `age`, `info`) VALUES (#{name}, #{gender}, #{age}, #{info})")@Options(useGeneratedKeys = true, keyProperty = "id")void insert(Teacher teacher);/**
     * 根據主鍵查詢一條信息
     *
     * @param id 主鍵
     * @return 對應主鍵的一條信息
     */@Select("SELECT `id`, `name`, `gender`, `age`, `info` FROM `teacher` WHERE `id` = #{id}")Teacher findById(int id);/**
     * 按照姓名模糊查詢全部符合條件的教師
     *
     * @param name 姓名的模糊查詢部分
     * @return 全部符合條件的教師
     */@Select("SELECT `id`, `name`, `gender`, `age`, `info` FROM `teacher` WHERE `name` like concat('%', #{name}, '%')")List<Teacher> findLikeName(String name);/**
     * 根據主鍵修改一條教師信息
     *
     * @param teacher 教師實體
     */@Update("UPDATE `teacher` SET `name` = #{name}, `age` = #{age}, `gender` = #{gender}, `info` = #{info} WHERE `id` = #{id}")void updateById(Teacher teacher);/**
     * 根據主鍵刪除教師
     *
     * @param id 主鍵
     */@Delete("DELETE FROM `teacher` WHERE `id` = #{id}")void deleteById(int id);
}複製代碼
  • tst: c.y.crud.TeacherTest
package com.yap.crud;import com.yap.mapper.TeacherMapper;import com.yap.pojo.Teacher;import com.yap.util.MyBatisUtil;import org.apache.ibatis.session.SqlSession;import org.apache.ibatis.session.SqlSessionFactory;import org.junit.Test;/**
 * @author yap
 */public class TeacherTest {private SqlSessionFactory factory = MyBatisUtil.getFactory("mybatis-crud.xml");@Testpublic void insert() {
        SqlSession session = factory.openSession();
        TeacherMapper teacherMapper = session.getMapper(TeacherMapper.class);try {
            teacherMapper.insert(new Teacher(null, "趙四", 1, 58, "亞洲舞王"));
            teacherMapper.insert(new Teacher(null, "趙五", 1, 58, "亞洲舞王"));
            teacherMapper.insert(new Teacher(null, "王四", 1, 58, "亞洲舞王"));
            teacherMapper.insert(new Teacher(null, "王五", 1, 58, "亞洲舞王"));
            session.commit();
        } catch (Exception e) {
            session.rollback();
            e.printStackTrace();
        } finally {
            session.close();
        }
    }@Testpublic void findById() {try (SqlSession session = factory.openSession()) {
            TeacherMapper teacherMapper = session.getMapper(TeacherMapper.class);
            System.out.println(teacherMapper.findById(1));
        } catch (Exception e) {
            e.printStackTrace();
        }
    }@Testpublic void findLikeName() {try (SqlSession session = factory.openSession()) {
            TeacherMapper teacherMapper = session.getMapper(TeacherMapper.class);
            System.out.println(teacherMapper.findLikeName("四"));
        } catch (Exception e) {
            e.printStackTrace();
        }
    }@Testpublic void updateById() {
        SqlSession session = factory.openSession();
        TeacherMapper teacherMapper = session.getMapper(TeacherMapper.class);try {
            teacherMapper.updateById(new Teacher(1, "劉能", 1, 58, "村副主任"));
            session.commit();
        } catch (Exception e) {
            session.rollback();
            e.printStackTrace();
        } finally {
            session.close();
        }
    }@Testpublic void deleteById() {
        SqlSession session = factory.openSession();
        TeacherMapper teacherMapper = session.getMapper(TeacherMapper.class);try {
            teacherMapper.deleteById(1);
            session.commit();
        } catch (Exception e) {
            session.rollback();
            e.printStackTrace();
        } finally {
            session.close();
        }
    }
}複製代碼
相關文章
相關標籤/搜索