通用Mapper的使用

轉自[link]https://blog.csdn.net/jinYwuM/article/details/80535538)

1、導入依賴

  1. <dependency>
  2. <groupId>com.github.abel533</groupId>
  3. <artifactId>mapper</artifactId>
  4. <version>2.3.4</version>
  5. </dependency>

2、配置plugins(Mapper攔截器)

Mybatis-config.xml的plugins下新增plugin配置,配置通用Mapper的接口。

  1. <plugins>
  2. <!-- 分頁插件 -->
  3. <plugin interceptor="com.github.pagehelper.PageHelper">
  4. <property name="dialect" value="mysql" />
  5. </plugin>
  6. <plugin interceptor="com.github.abel533.mapperhelper.MapperInterceptor">
  7. <!--通用Mapper接口 -->
  8. <property name="mappers" value="com.github.abel533.mapper.Mapper" />
  9. </plugin>
  10. </plugins>

注意:通用Mapper的插件必須配置在分頁插件下

 

3、自定義接口繼承通用mapper的接口

  1. public interface NewMapper extends Mapper<User>{
  2. }

注意:繼承通用Mapper<T>的接口,必須指定泛型<T>

 

4、泛型實體類<T>的屬性的註解

實體類按照如下規則和數據庫表進行轉換,註解全部是JPA中的註解:

  1. 表名默認使用類名,駝峯轉下劃線,如UserInfo默認對應的表名爲user_info.

  2. 表名可以使用@Table(name = "tableName")進行指定,對不符合第一條默認規則的可以通過這種方式指定表名.

  3. 字段默認和@Column一樣,都會作爲表字段,表字段默認爲Java對象的Field名字駝峯轉下劃線形式.

  4. 可以使用@Column(name = "fieldName")指定不符合第3條規則的字段名

  5. 使用@Transient註解可以忽略字段,添加該註解的字段不會作爲表字段使用.

  6. 建議一定是有一個@Id註解作爲主鍵的字段,可以有多個@Id註解的字段作爲聯合主鍵.

  7. 默認情況下,實體類中如果不存在包含@Id註解的字段,所有的字段都會作爲主鍵字段進行使用(這種效率極低).

  8. 實體類可以繼承使用,可以參考測試代碼中的com.github.abel533.model.UserLogin2類.

  9. 由於基本類型,如int作爲實體類字段時會有默認值0,而且無法消除,所以實體類中建議不要使用基本類型.

除了上面提到的這些,Mapper還提供了序列(支持Oracle)、UUID(任意數據庫,字段長度32)、主鍵自增(類似Mysql,Hsqldb)三種方式,其中序列和UUID可以配置多個,主鍵自增只能配置一個。

這三種方式不能同時使用,同時存在時按照 序列>UUID>主鍵自增的優先級進行選擇.下面是具體配置方法:

  1. 使用序列可以添加如下的註解:

    <pre class="has" name="code" onclick="hljs.copyCode(event)"><code class="language-html hljs xml"><ol class="hljs-ln"><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="1"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">//可以用於數字類型,字符串類型(需數據庫支持自動轉型)的字段</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="2"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">@SequenceGenerator(name="Any",sequenceName="seq_userid")</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="3"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">@Id</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="4"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">private Integer id;</div></div></li></ol></code><div class="hljs-button" data-title="複製"></div></pre>
    </li>
    <li>
    <p>使用UUID時:</p>
    
    <pre class="has" name="code" onclick="hljs.copyCode(event)"><code class="language-html hljs xml"><ol class="hljs-ln"><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="1"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">//可以用於任意字符串類型長度超過32位的字段</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="2"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">@GeneratedValue(generator = "UUID")</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="3"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">private String countryname;</div></div></li></ol></code><div class="hljs-button" data-title="複製"></div></pre>
    </li>
    <li>
    <p>使用主鍵自增:</p>
    
    <pre class="has" name="code" onclick="hljs.copyCode(event)"><code class="language-html hljs xml"><ol class="hljs-ln"><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="1"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">//不限於@Id註解的字段,但是一個實體類中只能存在一個(繼承關係中也只能存在一個)</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="2"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">@Id</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="3"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">@GeneratedValue(strategy = GenerationType.IDENTITY)</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="4"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">private Integer id;</div></div></li></ol></code><div class="hljs-button" data-title="複製"></div></pre>
    </li>
    

爲了可以回寫主鍵的值,使用註解:@GeneratedValue(generator ="JDBC"

爲了可以使用通用mapper中通過主鍵查詢的方法:一定要配置主鍵@Id

 

5、通用方法的使用

    1、selectOne():查詢單個對象,返回值爲實體類對象

  1. public void testSelectOne() {
  2. User user = new User();
  3. // 設置一個唯一的屬性用來查詢
  4. user.setId(2L);
  5. User selectOne = newMapper.selectOne(user);
  6. System.out.println(selectOne);
  7. }

注意:

        a、初始化的user對象中封裝的查詢條件必須是唯一的,否則查詢會報ToManyResultsException異常。

        b、若實體類中的屬性與表對應不了,也會報錯,可以使用註解@Transient忽略字段


    2、select():查詢多個對象,返回值爲List<T>

  1.    /**
  2. * 條件爲null或者是未初始化的實體類對象,會查詢所有數據
  3. * user中設置了數據:就按user中封裝的數據進行條件查詢
  4. * 條件只能按照=來查詢,不能按照>或者<等方式來查詢
  5. */
  6. public void testSelect() {
  7. User user = new User();
  8. List<User> select = newMapper.select(user);
  9. for (User user2 : select) {
  10. System.out.println(user2);
  11. }
  12. }

3、selectCount()統計查詢,返回值爲int類型

  1. /**
  2. * 統計查詢:
  3. * 1、賦值爲null或未初始化的實體類對象:統計所有記錄數
  4. * 2、若設置屬性,則按照屬性查詢符合的記錄數
  5. */
  6. public void testSelectCount() {
  7. User user = new User();
  8. user.setAge(20);
  9. int selectCount = newMapper.selectCount(user);
  10. System.out.println(selectCount);
  11. }

 

4、selectByPrimaryKey():按照主鍵查詢單個,返回返回值爲實體類對象

  1. /**
  2. * 通過主鍵進行查詢:
  3. * 1、參數類型一定要主鍵一致
  4. * 2、必須在對象中通過@Id指定主鍵
  5. * 如果滿足前兩點,但沒有查詢到,返回null,若不滿足前兩點,報ClassCastException
  6. */
  7. public void testSelectByPrimaryKey() {
  8. User user = newMapper.selectByPrimaryKey(2l);
  9. System.out.println(user);
  10. }

5、insert():返回值爲int類型

  1.       /**
  2. * 新增方法:按全屬性插入數據,如果不設置屬性,自動設置爲null
  3. */
  4. public void testInsert() {
  5. }

6、insertSelective()(推薦使用):返回值爲int類型

  1. /**
  2. * 按屬性插入數據:如果不設置屬性,自動設置爲null
  3. */
  4. public void testInsertSelective() {
  5. User user = new User();
  6. user.setUserName("huahu");
  7. user.setPassword("123456");
  8. user.setName("花花");
  9. newMapper.insertSelective(user);
  10. }

注意:雖然從結果來說,insert()與insertSelective()執行效果都是一樣的,但是從效率上來說insertSelective()更高。前者按照全屬性插入,後者按照給定屬性插入, 不設置屬性,則自動設置爲null。

 

7、delete():返回值爲int類型

  1.         // 條件刪除:如果條件爲null或未初始化的實體類對象,刪除全部數據
  2. public void testDelete() {
  3. User user = new User();
  4. user.setUserName("admin1");
  5. newMapper.delete(user);
  6. }

注意:如果有外鍵約束,並且主鍵被某個外鍵所引用,無法刪除。

8、deleteByPrimaryKey():返回值爲int類型

  1. // 按主鍵刪除
  2. public void testDeleteByPrimaryKey() {
  3. newMapper.deleteByPrimaryKey(18L);
  4. }

9、updateByPrimaryKey()(不推薦):返回值爲int類型

  1. /**
  2. * 通過主鍵更新:
  3. * 將設置的屬性進行更新,如果不設置屬性,自動更新爲null。
  4. * 必須設置主鍵
  5. */
  6. public void testUpdateByPrimaryKey() {
  7. }

10、updateByPrimaryKeySelective():返回值爲int類型

  1. /**
  2. * 通過主鍵按屬性進行選擇更新:
  3. * 必須設置主鍵
  4. * 將設置的屬性進行更新,沒有設置的屬性不更新
  5. */
  6. public void testUpdateByPrimaryKeySelective() {
  7. User user = new User();
  8. user.setId(1L);
  9. user.setUserName("admin");
  10. user.setPassword("123");
  11. newMapper.updateByPrimaryKeySelective(user);
  12. }

11、selectCountByExample():返回值爲int類型

  1. /**
  2. * 通過條件統計記錄數
  3. * 1、需要初始化Example對象
  4. * 2、通過example獲取criteria來設置條件
  5. */
  6. public void testSelectCountByExample() {
  7. Example example = new Example(User.class);
  8. Criteria criteria = example.createCriteria();
  9. criteria.andBetween("age", 15, 30);
  10. int count = newMapper.selectCountByExample(example);
  11. System.out.println(count);
  12. }

12、selectByExample():返回值類型爲List<T>

通過Example對象設置查詢條件的步驟:

  1. 初始化Example對象
  2. 通過Example對象獲取多個Criteria對象來設置查詢條件
  3. 通過example設置並集查詢or
  4. 通過example設置排序查詢
  1.         /**
  2. * 通過條件進行查詢:
  3. * 查詢年齡在15-30之間的並且用戶名中有zhang的用戶,或者密碼是123456的用戶。
  4. * 顯示的時候通過age倒序排序,如果age一樣那麼根據id正序執行。
  5. */
  6. public void testSelectByExample() {
  7. Example example = new Example(User.class);
  8. Criteria criteria = example.createCriteria();
  9. criteria.andBetween("age", 15, 30);
  10. criteria.andLike("userName", "%zhang%");
  11. //添加or的條件
  12. Criteria criteria2 = example.createCriteria();
  13. criteria2.andEqualTo("password", "123456");
  14. example.or(criteria2);
  15. //按年齡倒序排序,如果年齡相同,按id正序排序
  16. example.setOrderByClause("age desc,id asc");
  17. List<User> list = newMapper.selectByExample(example);
  18. for (User user : list) {
  19. System.out.println(user);
  20. }
  21. }

13、deleteByExample():返回值爲int類型

  1. // 條件查詢
  2. @Test
  3. public void testDeleteByExample() {
  4. Example example = new Example(User.class);
  5. Criteria criteria = example.createCriteria();
  6. criteria.andLike("userName", "admin");
  7. newUserMapper.deleteByExample(example);
  8. }

14、updateByExampleSelective():返回值爲int類型

  1. /**
  2. * 按條件選擇更新:沒設置的屬性就不做修改
  3. * 將年齡>22的用戶的密碼修改成123
  4. */
  5. public void testUpdateByExampleSelective() {
  6. Example example = new Example(User.class);
  7. Criteria criteria = example.createCriteria();
  8. criteria.andGreaterThan("age", 22);
  9. User user = new User();
  10. user.setPassword("123");
  11. newMapper.updateByExampleSelective(user, example);
  12. }

15、updateByExample():返回值爲int類型

  1. /**
  2. * 將年齡大於22的用的密碼修改爲321
  3. * 條件更新:沒有設置屬性的都更新爲null.
  4. */
  5. public void testUpdateByExample() {
  6. Example example = new Example(User.class);
  7. Criteria criteria = example.createCriteria();
  8. criteria.andGreaterThan("age", 22);
  9. User user = new User();
  10. user.setPassword("321");
  11. newMapper.updateByExample(user, example);
  12. }

附上Criteria類中設置條件的方法

 

 










 




 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章