MyBatis逆向⼯程(增删改查)
⼤致分为两类: 有where条件的增删改查;从example开始
⽆where条件的增删改查, 直接使⽤mapper接⼝
Mybatis中带有“Selective”和不带的区别
⽐如:
int updateByPrimaryKeySelective(TbItem record);
int updateByPrimaryKey(TbItem record)
updateByPrimaryKeySelective 如果你只想更新⼀部分字段,可以⽤这个⽅法。updateByPrimaryKey更新所有的字段⽤这个⽅法
mybatis中ByPrimaryKey和ByExample的区别:
PrimaryKey根据主键查询
ByExample ⾃定义查询条件进⾏查询
UserExample example = new UserExample();
Criteria criteria = ateCriteria();
criteria.andUsernameEqualTo("wyw");
criteria.andUsernameIsNull();
example.setOrderByClause("username asc,email desc");
List<?>list = XxxMapper.selectByExample(example);
⼀、mapper接⼝中的⽅法解析
mapper接⼝中的函数及⽅法
⽅法功能说明
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的字段
⼆、example实例解析
mybatis的逆向⼯程中会⽣成实例及实例对应的example,example⽤于添加条件,相当where后⾯的部分xxxExample example = new xxxExample();
Criteria criteria = new Example().createCriteria();
⽅法说明
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之间条件
三、应⽤举例
1.查询
① selectByPrimaryKey()
User user = XxxMapper.selectByPrimaryKey(100); //相当于select * from user where id = 100
1
② selectByExample() 和 selectByExampleWithBLOGs()
UserExample example = new UserExample();
Criteria criteria = ateCriteria();
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("wyw@163");
XxxMapper.insert(user);
//相当于:insert into user(ID,username,password,email) values ('dsfgsdfgdsfgds','admin','admin','wyw@126');
3.更新数据
①updateByPrimaryKey()
User user =new User();
user.setId("dsfgsdfgdsfgds");
user.setUsername("wyw");
user.setPassword("wyw");
user.setEmail("wyw@163");
XxxMapper.updateByPrimaryKey(user);
//相当于:update user set username='wyw', password='wyw', email='wyw@163' 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 = ateCriteria();
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 = ateCriteria();
criteria.andUsernameEqualTo("admin");
XxxMapper.deleteByExample(example);
//相当于:delete from user where username='admin'
5.查询数据数量
①countByExample()
UserExample example = new UserExample();
Criteria criteria = ateCriteria();
criteria.andUsernameEqualTo("wyw");
int count = untByExample(example);
//相当于:select count(*) from user where username='wyw'
1.( xx and xx) or ( xx and xx)
实例代码:
- BaUserExample baUserExample = **new** BaUserExample();
- Criteria criteria1 = ateCriteria();
- criteria1.andOrgIdEqualTo("1");
- criteria1.andDeptIdEqualTo("1");
- Criteria criteria2 = ateCriteria();
- criteria2.andUserNameEqualTo("name");
-
criteria2.andEmailLike("%test@%");
- (criteria2);
- untByExample(baUserExample);
执⾏的sql语句:
Preparing: select count(*) from ba_user WHERE ( org_id =? and dept_id =?)or( user_name =? and email like ?)
< and ( xx or xx)
暂时没到直接的sql语句构造⽅法,但是经过转换还是可以实现的
根据逻辑表达式可以知道 a and ( b or c ) = ( a and b) or ( a and c )
所以就转变成第⼀种⽅法
举个例⼦,假如想要实现 select count(*) from ba_user WHERE userName like ? and ( dept_id is null or dept_id <>? )
可以转化为select count(*) from ba_user WHERE (userName like ? and dept_id is null ) or ( userName like ? and dept_id <>? )
实例代码:
1. 1. BaUserExample baUserExample =**new**BaUserExample();
2.
3. Criteria criteria1 = ateCriteria();
4. criteria1.andUserNameLike("%name%");
基本的增删改查语句5. criteria1.andDeptIdIsNull();
6.
7. Criteria criteria2 = ateCriteria();
8. criteria2.andUserNameLike("%name%");
9. criteria2.andDeptIdNotEqualTo("1");
10.
11. (criteria2);
12.
13. untByExample(baUserExample);
执⾏的sql语句:
1. ==> Preparing: select count(*) from ba_user WHERE ( user_name like ? and dept_id is null )or( user_name like ? and dept_id <>?)
这算是⼀种取巧的⽅法吧,对于这样的问题可以⾃⼰编写l⽂件,或者在代码⾥⾯过滤,还有⼀种思路就是修改Criteria的代码实现and和or功能调换(还没尝试过)。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论