轉自[link]https://blog.csdn.net/jinYwuM/article/details/80535538)
- <dependency>
- <groupId>com.github.abel533</groupId>
- <artifactId>mapper</artifactId>
- <version>2.3.4</version>
- </dependency>
2、配置plugins(Mapper攔截器)
Mybatis-config.xml的plugins下新增plugin配置,配置通用Mapper的接口。
- <plugins>
- <!-- 分頁插件 -->
- <plugin interceptor="com.github.pagehelper.PageHelper">
- <property name="dialect" value="mysql" />
- </plugin>
- <plugin interceptor="com.github.abel533.mapperhelper.MapperInterceptor">
- <!--通用Mapper接口 -->
- <property name="mappers" value="com.github.abel533.mapper.Mapper" />
- </plugin>
- </plugins>
注意:通用Mapper的插件必須配置在分頁插件下
3、自定義接口繼承通用mapper的接口
- public interface NewMapper extends Mapper<User>{
-
- }
注意:繼承通用Mapper<T>的接口,必須指定泛型<T>
4、泛型實體類<T>的屬性的註解
實體類按照如下規則和數據庫表進行轉換,註解全部是JPA中的註解:
-
表名默認使用類名,駝峯轉下劃線,如
UserInfo
默認對應的表名爲user_info
. -
表名可以使用
@Table(name = "tableName")
進行指定,對不符合第一條默認規則的可以通過這種方式指定表名. -
字段默認和
@Column
一樣,都會作爲表字段,表字段默認爲Java對象的Field
名字駝峯轉下劃線形式. -
可以使用
@Column(name = "fieldName")
指定不符合第3條規則的字段名 -
使用
@Transient
註解可以忽略字段,添加該註解的字段不會作爲表字段使用. -
建議一定是有一個
@Id
註解作爲主鍵的字段,可以有多個@Id
註解的字段作爲聯合主鍵. -
默認情況下,實體類中如果不存在包含
@Id
註解的字段,所有的字段都會作爲主鍵字段進行使用(這種效率極低). -
實體類可以繼承使用,可以參考測試代碼中的
com.github.abel533.model.UserLogin2
類. -
由於基本類型,如int作爲實體類字段時會有默認值0,而且無法消除,所以實體類中建議不要使用基本類型.
除了上面提到的這些,Mapper還提供了序列(支持Oracle)、UUID(任意數據庫,字段長度32)、主鍵自增(類似Mysql,Hsqldb)三種方式,其中序列和UUID可以配置多個,主鍵自增只能配置一個。
這三種方式不能同時使用,同時存在時按照 序列>UUID>主鍵自增
的優先級進行選擇.下面是具體配置方法:
-
使用序列可以添加如下的註解:
<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():查詢單個對象,返回值爲實體類對象
- public void testSelectOne() {
- User user = new User();
- // 設置一個唯一的屬性用來查詢
- user.setId(2L);
- User selectOne = newMapper.selectOne(user);
- System.out.println(selectOne);
-
- }
注意:
a、初始化的user對象中封裝的查詢條件必須是唯一的,否則查詢會報ToManyResultsException異常。
b、若實體類中的屬性與表對應不了,也會報錯,可以使用註解@Transient
忽略字段
2、select():查詢多個對象,返回值爲List<T>
- /**
- * 條件爲null或者是未初始化的實體類對象,會查詢所有數據
- * user中設置了數據:就按user中封裝的數據進行條件查詢
- * 條件只能按照=來查詢,不能按照>或者<等方式來查詢
- */
- public void testSelect() {
- User user = new User();
- List<User> select = newMapper.select(user);
- for (User user2 : select) {
- System.out.println(user2);
- }
- }
3、selectCount():統計查詢,返回值爲int類型
- /**
- * 統計查詢:
- * 1、賦值爲null或未初始化的實體類對象:統計所有記錄數
- * 2、若設置屬性,則按照屬性查詢符合的記錄數
- */
- public void testSelectCount() {
- User user = new User();
- user.setAge(20);
- int selectCount = newMapper.selectCount(user);
- System.out.println(selectCount);
- }
4、selectByPrimaryKey():按照主鍵查詢單個,返回返回值爲實體類對象
- /**
- * 通過主鍵進行查詢:
- * 1、參數類型一定要主鍵一致
- * 2、必須在對象中通過@Id指定主鍵
- * 如果滿足前兩點,但沒有查詢到,返回null,若不滿足前兩點,報ClassCastException
- */
- public void testSelectByPrimaryKey() {
- User user = newMapper.selectByPrimaryKey(2l);
- System.out.println(user);
- }
5、insert():返回值爲int類型
- /**
- * 新增方法:按全屬性插入數據,如果不設置屬性,自動設置爲null
- */
- public void testInsert() {
-
- }
6、insertSelective()(推薦使用):返回值爲int類型
- /**
- * 按屬性插入數據:如果不設置屬性,自動設置爲null
- */
- public void testInsertSelective() {
- User user = new User();
- user.setUserName("huahu");
- user.setPassword("123456");
- user.setName("花花");
- newMapper.insertSelective(user);
- }
注意:雖然從結果來說,insert()與insertSelective()執行效果都是一樣的,但是從效率上來說insertSelective()更高。前者按照全屬性插入,後者按照給定屬性插入, 不設置屬性,則自動設置爲null。
7、delete():返回值爲int類型
- // 條件刪除:如果條件爲null或未初始化的實體類對象,刪除全部數據
- public void testDelete() {
- User user = new User();
- user.setUserName("admin1");
- newMapper.delete(user);
- }
注意:如果有外鍵約束,並且主鍵被某個外鍵所引用,無法刪除。
8、deleteByPrimaryKey():返回值爲int類型
- // 按主鍵刪除
- public void testDeleteByPrimaryKey() {
- newMapper.deleteByPrimaryKey(18L);
- }
9、updateByPrimaryKey()(不推薦):返回值爲int類型
- /**
- * 通過主鍵更新:
- * 將設置的屬性進行更新,如果不設置屬性,自動更新爲null。
- * 必須設置主鍵
- */
- public void testUpdateByPrimaryKey() {
-
- }
10、updateByPrimaryKeySelective():返回值爲int類型
- /**
- * 通過主鍵按屬性進行選擇更新:
- * 必須設置主鍵
- * 將設置的屬性進行更新,沒有設置的屬性不更新
- */
- public void testUpdateByPrimaryKeySelective() {
- User user = new User();
- user.setId(1L);
- user.setUserName("admin");
- user.setPassword("123");
- newMapper.updateByPrimaryKeySelective(user);
- }
11、selectCountByExample():返回值爲int類型
- /**
- * 通過條件統計記錄數
- * 1、需要初始化Example對象
- * 2、通過example獲取criteria來設置條件
- */
- public void testSelectCountByExample() {
- Example example = new Example(User.class);
- Criteria criteria = example.createCriteria();
- criteria.andBetween("age", 15, 30);
- int count = newMapper.selectCountByExample(example);
- System.out.println(count);
- }
12、selectByExample():返回值類型爲List<T>
通過Example對象設置查詢條件的步驟:
- 初始化Example對象
- 通過Example對象獲取多個Criteria對象來設置查詢條件
- 通過example設置並集查詢or
- 通過example設置排序查詢
- /**
- * 通過條件進行查詢:
- * 查詢年齡在15-30之間的並且用戶名中有zhang的用戶,或者密碼是123456的用戶。
- * 顯示的時候通過age倒序排序,如果age一樣那麼根據id正序執行。
- */
- public void testSelectByExample() {
- Example example = new Example(User.class);
- Criteria criteria = example.createCriteria();
- criteria.andBetween("age", 15, 30);
- criteria.andLike("userName", "%zhang%");
-
- //添加or的條件
- Criteria criteria2 = example.createCriteria();
- criteria2.andEqualTo("password", "123456");
- example.or(criteria2);
- //按年齡倒序排序,如果年齡相同,按id正序排序
- example.setOrderByClause("age desc,id asc");
- List<User> list = newMapper.selectByExample(example);
- for (User user : list) {
- System.out.println(user);
- }
-
- }
13、deleteByExample():返回值爲int類型
- // 條件查詢
- @Test
- public void testDeleteByExample() {
- Example example = new Example(User.class);
- Criteria criteria = example.createCriteria();
- criteria.andLike("userName", "admin");
- newUserMapper.deleteByExample(example);
- }
14、updateByExampleSelective():返回值爲int類型
- /**
- * 按條件選擇更新:沒設置的屬性就不做修改
- * 將年齡>22的用戶的密碼修改成123
- */
- public void testUpdateByExampleSelective() {
- Example example = new Example(User.class);
- Criteria criteria = example.createCriteria();
- criteria.andGreaterThan("age", 22);
- User user = new User();
- user.setPassword("123");
- newMapper.updateByExampleSelective(user, example);
- }
15、updateByExample():返回值爲int類型
- /**
- * 將年齡大於22的用的密碼修改爲321
- * 條件更新:沒有設置屬性的都更新爲null.
- */
- public void testUpdateByExample() {
- Example example = new Example(User.class);
- Criteria criteria = example.createCriteria();
- criteria.andGreaterThan("age", 22);
-
- User user = new User();
- user.setPassword("321");
- newMapper.updateByExample(user, example);
- }
附上Criteria類中設置條件的方法