1. 程式人生 > 實用技巧 >Java架構師學習日記-Mybatis

Java架構師學習日記-Mybatis

mybatis能夠自動生成sql語句,也能夠新增自定義sql語句

使用mybatis generator生成XX.java,XXExample.java,XXmapper.java,XXmapper.xml四個資料庫表對映檔案,

一、Example例項解析

mybatis的逆向工程中會生成例項及例項對應的XXExample.java,XXExample.java包含了物件的常用查詢方法

XXExample有三個內部類,GeneratedCriteria,Criteria,Criterion

建立內部類Criteria用於查詢,程式碼示例如下看錶達:

XXExample example = new  XXExample();//新建XX物件的example物件進行查詢,XXExample繼承XX
XXExample.Criteria  c = example.creatCriteria();//new一個當前example的內部類Criteria
c.andXXIsNull();//設定查詢條件,某值為空
c.andXXIsNotNull();//設定查詢條件,某值不空
//使用mapper進行查詢
List<XX> data = new XXMapper.selectByExample(example);

方法說明
example.or();
example.setOrderByClause(“欄位名 ASC”); 添加升序排列條件,DESC為降序
example.setDistinct(false) 去除重複,boolean型,true為選擇不重複的記錄。
criteria.andXxxIsNull 新增欄位xxx為null的條件
criteria.andXxxIsNotNull 新增欄位xxx不為null的條件
criteria.andXxxEqualTo(value) 新增xxx欄位等於value條件
criteria.andXxxNotEqualTo(value) 新增xxx欄位不等於value條件
criteria.andXxxGreaterThan(value) 新增xxx欄位大於value條件
criteria.andXxxGreaterThanOrEqualTo(value) 新增xxx欄位大於等於value條件
criteria.andXxxLessThan(value) 新增xxx欄位小於value條件
criteria.andXxxLessThanOrEqualTo(value) 新增xxx欄位小於等於value條件
criteria.andXxxIn(List<?>) 新增xxx欄位值在List<?>條件
criteria.andXxxNotIn(List<?>) 新增xxx欄位值不在List<?>條件
criteria.andXxxLike(“%”+value+”%”) 新增xxx欄位值為value的模糊查詢條件
criteria.andXxxNotLike(“%”+value+”%”) 新增xxx欄位值不為value的模糊查詢條件
criteria.andXxxBetween(value1,value2) 新增xxx欄位值在value1和value2之間條件
criteria.andXxxNotBetween(value1,value2) 新增xxx欄位值不在value1和value2之間條件

二、mapper介面中的方法解析

mapper.java的函式及方法,按命名的字面意思理解用途。

countByExample,帶example的一般都是使用example查詢條目數。selectByPrimaryKey使用id查詢結果集

mapper中的方法和xml中的sql語句是對應的,

如果在mapper中傳入example物件,xml中會解析example的值,取值拼寫sql語句進行查詢

傳入String型別的key,id等,xml直接取值拼寫sql進行查詢

方法功能說明
int countByExample(UserExample example) thorws SQLException 按條件計數
int deleteByPrimaryKey(Integer id) thorws SQLException 按主鍵刪除
int deleteByExample(UserExample example) thorws SQLException 按條件查詢
String/Integer insert(User record) thorws SQLException 插入資料(返回值為ID)
User selectByPrimaryKey(Integer id) thorws SQLException 按主鍵查詢
ListselectByExample(UserExample example) thorws SQLException 按條件查詢
ListselectByExampleWithBLOGs(UserExample example) thorws SQLException 按條件查詢(包括BLOB欄位)。只有當資料表中的欄位型別有為二進位制的才會產生。
int updateByPrimaryKey(User record) thorws SQLException 按主鍵更新
int updateByPrimaryKeySelective(User record) thorws SQLException 按主鍵更新值不為null的欄位
int updateByExample(User record, UserExample example) thorws SQLException 按條件更新
int updateByExampleSelective(User record, UserExample example) thorws SQLException 按條件更新值不為null的欄位

三、XML檔案解析

舉例一個xml檔案中的一條語句

  <select id="countByExample" parameterType="com.ctvit.cportal.core.config.entity.XXExample" resultType="java.lang.Integer" >
    select count(*) from t_app_second_config_item
    <if test="_parameter != null" >
      <include refid="Example_Where_Clause" />
    </if>
  </select>

語句的id與mapper.java中的方法名對應,

parameterType是傳入引數的型別,resultType是返回結果的型別,傳參和返回有很多種情況,另開文章講

這樣對照起來的話,我們可以自主在mapper.java和mapper.xml中增加或刪除相應的查詢語句,以供呼叫

比如增加一條新增版本批量複製語句“copyBatchByVersion”

mapper.java中增加方法

int copyBatchByVersion(String old_version,String new_version) thorws SQLException;
/*根據舊版本號old_version查詢記錄
複製記錄
同時將其中的old_version替換為new_version
返回值為複製成功的條數
*/

mapper.xml中增加語句

  <insert id="copyBatchByVersion">
    insert into t_xx
    (XX_id,xx_value,xx_version)
    (select
    XX_id,xx_value,#{1})
    from t_xx where xx_version = #{0})
  </insert>

其中#{0},#{1}代表輸入的第1,2個引數

四、應用舉例

1.查詢

① selectByPrimaryKey()

User user = XxxMapper.selectByPrimaryKey(100); //相當於select * from user where id = 100    

② selectByExample() 和 selectByExampleWithBLOGs()

UserExample example = new UserExample();
Criteria criteria = example.createCriteria();
criteria.andUsernameEqualTo("wyw");
criteria.andUsernameIsNull();
example.setOrderByClause("username asc,email desc");
List<?>list = XxxMapper.selectByExample(example);
//相當於:select * from user where username = 'wyw' and  username is null order by username asc,email desc

注:在iBator逆向工程生成的檔案XxxExample.Java中包含一個static的內部類Criteria,Criteria中的方法是定義SQL 語句where後的查詢條件。

2.插入資料

①insert()

User user = new User();
user.setId("dsfgsdfgdsfgds");
user.setUsername("admin");
user.setPassword("admin")
user.setEmail("[email protected]");
XxxMapper.insert(user);
//相當於:insert into user(ID,username,password,email) values ('dsfgsdfgdsfgds','admin','admin','[email protected]');

3.更新資料

①updateByPrimaryKey()

User user =new User();
user.setId("dsfgsdfgdsfgds");
user.setUsername("wyw");
user.setPassword("wyw");
user.setEmail("[email protected]");
XxxMapper.updateByPrimaryKey(user);
//相當於:update user set username='wyw', password='wyw', email='[email protected]' where id='dsfgsdfgdsfgds'

②updateByPrimaryKeySelective()

User user = new User();
user.setId("dsfgsdfgdsfgds");
user.setPassword("wyw");
XxxMapper.updateByPrimaryKey(user);
//相當於:update user set password='wyw' where id='dsfgsdfgdsfgds'

③ updateByExample() 和 updateByExampleSelective()

UserExample example = new UserExample();
Criteria criteria = example.createCriteria();
criteria.andUsernameEqualTo("admin");
User user = new User();
user.setPassword("wyw");
XxxMapper.updateByPrimaryKeySelective(user,example);
//相當於:update user set password='wyw' where username='admin'

updateByExample()更新所有的欄位,包括欄位為null的也更新,建議使用 updateByExampleSelective()更新想更新的欄位

4.刪除資料

①deleteByPrimaryKey()

XxxMapper.deleteByPrimaryKey(1);  //相當於:delete from user where id=1

②deleteByExample()

UserExample example = new UserExample();
Criteria criteria = example.createCriteria();
criteria.andUsernameEqualTo("admin");
XxxMapper.deleteByExample(example);
//相當於:delete from user where username='admin'

5.查詢資料數量

①countByExample()

UserExample example = new UserExample();
Criteria criteria = example.createCriteria();
criteria.andUsernameEqualTo("wyw");
int count = XxxMapper.countByExample(example);
//相當於:select count(*) from user where username='wyw'

countByExample