MyBatis的Mapper接口以及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 按主键查询
List<T> selectByExample(UserExample example) thorws SQLException 按条件查询
List<T> selectByExampleWithBLOGs(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

② 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("wyw@163.com");
XxxMapper.insert(user);
//相当于:insert into user(ID,username,password,email) values ('dsfgsdfgdsfgds','admin','admin','m@haah.net');

3.更新数据

①updateByPrimaryKey()

User user =new User();
user.setId("dsfgsdfgdsfgds");
user.setUsername("wyw");
user.setPassword("wyw");
user.setEmail("wyw@163.com");
XxxMapper.updateByPrimaryKey(user);
//相当于:update user set username='wyw', password='wyw', email='wyw@163.com' 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'

四、处理and、or关系的方法

1.( xx and xx) or ( xx and xx)

(1)实例代码:

BaUserExample baUserExample = new BaUserExample();

Criteria criteria1 = baUserExample.createCriteria();

criteria1.andOrgIdEqualTo("1");

criteria1.andDeptIdEqualTo("1");

Criteria criteria2 = baUserExample.createCriteria();

criteria2.andUserNameEqualTo("name");

criteria2.andEmailLike("%test@%");

baUserExample.or(criteria2);

userMapper.countByExample(baUserExample);

执行的sql语句:

Preparing: select count(*) from ba_user WHERE ( org_id = ? and dept_id = ? ) 
or( user_name = ? and email like ? )

(2)

TestTableExample example = new TestTableExample();

example.or().andField1EqualTo(5).andField2IsNull();

example.or().andField3NotEqualTo(9).andField4IsNotNull();

List<Integer> field5Values = new ArrayList<Integer>();
field5Values.add(8);
field5Values.add(11);
field5Values.add(14);
field5Values.add(22);

example.or().andField5In(field5Values);

example.or().andField6Between(3, 7);
select * from table where (field1 = 5 and field2 is null)
or (field3 <> 9 and field4 is not null)
or (field5 in (8, 11, 14, 22))
or (field6 between 3 and 7)

2.xx 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 <>? )

实例代码:

BaUserExample baUserExample = new BaUserExample();

Criteria criteria1 = baUserExample.createCriteria();

criteria1.andUserNameLike("%name%");

criteria1.andDeptIdIsNull();

Criteria criteria2 = baUserExample.createCriteria();

criteria2.andUserNameLike("%name%");

criteria2.andDeptIdNotEqualTo("1");

baUserExample.or(criteria2);

userMapper.countByExample(baUserExample);

执行的sql语句:

select count(*) from ba_user WHERE 
( user_name like ? and dept_id is null ) or( user_name like ? and dept_id <> ? )

五. 扩充

封装包使用

Example example = new Example(AfwFlowDtl.class);

for(int i=0;i < 10;i++) {

example.createCriteria().andEqualTo("roleCode",bean.getRoleCode)

.andNotIn("status",Arrays.asList("0","1"))

.andCondition("(FLAG <> '0' OR FLAG IS NULL)")

.andCondition("(role_nodecode is null or role_nodecode ='"+fean.getNextRoleNodeCode+"')");

example.selectProperties("serialNo", "roleCode", "employeeCode", "roleNodeCode");

example.setDistinct(true); // 去除重复,boolean型,true为选择不重复的记录。

example.orderBy("serialNo"); // 对应实体类中属性名

example.setOrderByClause("SERIAL_NO desc"); // 对应表结构字段名称

// 排序另外写法

example.orderBy("serialNo").asc().orderBy("employeeCode").asc();

List<AfwFlowDtl> afwFlowDtlList = afwFlowDtlMapper.selectList(example);

example.clear();// 把条件清空,可以循环使用,嵌套在for循环里面使用

}

这里面有一个坑,就是.andCondition("(role_nodecode is null or role_nodecode =' "+fean.getNextRoleNodeCode+" ')");
若是和面的参数role_nodecode是字符串类型,在拼接SQL时,一定要加上单引号“‘”,数值类型的可以加可不加,加了单引号也没影响,即使是数值类型的加引号也没有关系,因为它可以自动的隐士转换。只是浪费点转换时间而已。

转载:

https://blog.csdn.net/biandous/article/details/65630783

https://blog.csdn.net/wang_song_yan/article/details/49081901

文章链接:https://www.haah.net/archives/6322.html
文章标题:MyBatis的Mapper接口以及Example的实例函数及详解
文章版权:辉哥博客 (haah.net) 所发布的内容,部分为原创文章,转载请注明来源,网络转载文章如有侵权请联系我们!

给TA买糖
共{{data.count}}人
人已赞赏
技术文档软件教程

IDEA热部署插件Jrebel安装使用教程

2021-4-13 23:52:39

技术文档网站教程

WordPresss网站数据较多,数据库查询该如何优化?

2021-5-11 22:38:19

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索