代码参考mybatis-demo
1.动态sql元素
2.动态查询语句
- 有问题的if语句
测试代码:
@Test
// if用于select,并与where配合
public void testSelectIfOper() {
// 2.获取sqlSession
SqlSession sqlSession = sqlSessionFactory.openSession();
// 3.获取对应mapper
TUserMapper mapper = sqlSession.getMapper(TUserMapper.class);
String email = "qq.com";
Byte sex = null;
List list = mapper.selectIfOper(email, sex);
// List list = mapper.selectIfandWhereOper(email, sex);
System.out.println(list.size());
}
错误:多了and
2018-09-24 15:44:16.146 [main] DEBUG c.e.mybatis.mapper.TUserMapper.selectIfOper - ==> Preparing: select id, user_name, real_name, sex, mobile, email, note, position_id from t_user a where a.email like CONCAT('%', ?, '%') and
一种不优雅的解决方法——添加1=1
优雅的解决方法——where
测试代码:
@Test
// if用于select,并与where配合
public void testSelectIfOper() {
// 2.获取sqlSession
SqlSession sqlSession = sqlSessionFactory.openSession();
// 3.获取对应mapper
TUserMapper mapper = sqlSession.getMapper(TUserMapper.class);
String email = "qq.com";
Byte sex = null;
// List list = mapper.selectIfOper(email, sex);
List list = mapper.selectIfandWhereOper(email, sex);
System.out.println(list.size());
}
结果:
2018-09-24 15:54:05.008 [main] DEBUG c.e.m.mapper.TUserMapper.selectIfandWhereOper - ==> Preparing: select id, user_name, real_name, sex, mobile, email, note, position_id from t_user a WHERE a.email like CONCAT('%', ?, '%')
2018-09-24 15:54:05.049 [main] DEBUG c.e.m.mapper.TUserMapper.selectIfandWhereOper - ==> Parameters: qq.com(String)
2018-09-24 15:54:05.072 [main] DEBUG c.e.m.mapper.TUserMapper.selectIfandWhereOper - <== Total: 2
2
3.动态更新语句
update t_user
set
user_name = #{userName,jdbcType=VARCHAR},
real_name = #{realName,jdbcType=VARCHAR},
sex = #{sex,jdbcType=TINYINT},
mobile = #{mobile,jdbcType=VARCHAR},
email = #{email,jdbcType=VARCHAR},
note = #{note,jdbcType=VARCHAR},
position_id = #{positionId,jdbcType=INTEGER}
where id = #{id,jdbcType=INTEGER}
测试代码:
@Test
// if用于update,并与set配合
public void testUpdateIfOper() {
// 2.获取sqlSession
SqlSession sqlSession = sqlSessionFactory.openSession();
// 3.获取对应mapper
TUserMapper mapper = sqlSession.getMapper(TUserMapper.class);
TUser user = new TUser();
user.setId(3);
user.setUserName("cindy");
user.setRealName("王美丽");
user.setEmail("[email protected]");
user.setMobile("18695988747");
user.setNote("cindy's note");
user.setSex((byte) 2);
user.setPositionId(1);
System.out.println(mapper.updateIfOper(user));
// System.out.println(mapper.updateIfAndSetOper(user));
}
有问题,当position没有时,会多余一个逗号。
- 优雅的解决方法——使用set
update t_user
user_name = #{userName,jdbcType=VARCHAR},
real_name = #{realName,jdbcType=VARCHAR},
sex = #{sex,jdbcType=TINYINT},
mobile = #{mobile,jdbcType=VARCHAR},
email = #{email,jdbcType=VARCHAR},
note = #{note,jdbcType=VARCHAR},
position_id = #{positionId,jdbcType=INTEGER},
where id = #{id,jdbcType=INTEGER}
4.动态插入语句
insert into t_user (
id,
user_name,
real_name,
sex,
mobile,
email,
note,
position_id
)
values(
#{id,jdbcType=INTEGER},
#{userName,jdbcType=VARCHAR},
#{realName,jdbcType=VARCHAR},
#{sex,jdbcType=TINYINT},
#{mobile,jdbcType=VARCHAR},
#{email,jdbcType=VARCHAR},
#{note,jdbcType=VARCHAR},
#{positionId,jdbcType=INTEGER}
)
测试代码:
@Test
// if用于insert,并与trim配合
public void testInsertIfOper() {
// 2.获取sqlSession
SqlSession sqlSession = sqlSessionFactory.openSession();
// 3.获取对应mapper
TUserMapper mapper = sqlSession.getMapper(TUserMapper.class);
TUser user = new TUser();
user.setUserName("mark");
user.setRealName("毛毛");
user.setEmail("[email protected]");
user.setMobile("18695988747");
user.setNote("mark's note");
user.setSex((byte) 1);
user.setPositionId(1);
System.out.println(mapper.insertIfOper(user));
// System.out.println(mapper.insertSelective(user));
}
有问题,当position没有时,会多余一个逗号。
- 优雅的解决方法——使用trim
insert into t_user
id,
user_name,
real_name,
sex,
mobile,
email,
note,
position_id,
#{id,jdbcType=INTEGER},
#{userName,jdbcType=VARCHAR},
#{realName,jdbcType=VARCHAR},
#{sex,jdbcType=TINYINT},
#{mobile,jdbcType=VARCHAR},
#{email,jdbcType=VARCHAR},
#{note,jdbcType=VARCHAR},
#{positionId,jdbcType=INTEGER},
5.foreach
List selectForeach4In(String[] names);
其中collection可以是array/ list/ map。
测试程序:
@Test
// Foreach用于in查询
public void testForeach4In() {
// 2.获取sqlSession
SqlSession sqlSession = sqlSessionFactory.openSession();
// 3.获取对应mapper
TUserMapper mapper = sqlSession.getMapper(TUserMapper.class);
String[] names = new String[]{"lison","james"};
List users = mapper.selectForeach4In(names);
System.out.println(users.size());
}
结果:
2018-09-24 16:17:28.262 [main] DEBUG c.e.mybatis.mapper.TUserMapper.selectForeach4In - ==> Preparing: select id, user_name, real_name, sex, mobile, email, note, position_id from t_user a where a.user_name in ( ? , ? )
2018-09-24 16:17:28.308 [main] DEBUG c.e.mybatis.mapper.TUserMapper.selectForeach4In - ==> Parameters: lison(String), james(String)
2018-09-24 16:17:28.328 [main] DEBUG c.e.mybatis.mapper.TUserMapper.selectForeach4In - <== Total: 2
2
5.1 批量操作
int insertForeach4Batch(List users);
insert into t_user (user_name, real_name,
sex, mobile,email,note, position_id)
values
(
#{user.userName,jdbcType=VARCHAR},
#{user.realName,jdbcType=VARCHAR},
#{user.sex,jdbcType=TINYINT},
#{user.mobile,jdbcType=VARCHAR},
#{user.email,jdbcType=VARCHAR},
#{user.note,jdbcType=VARCHAR},
#{user.positionId,jdbcType=INTEGER}
)
测试代码:
@Test
// Foreach用于批量插入
public void testForeach4Insert() {
// 2.获取sqlSession
SqlSession sqlSession = sqlSessionFactory.openSession();
// 3.获取对应mapper
TUserMapper mapper = sqlSession.getMapper(TUserMapper.class);
TUser user1 = new TUser();
user1.setUserName("king");
user1.setRealName("李小京");
user1.setEmail("[email protected]");
user1.setMobile("18754548787");
user1.setNote("king's note");
user1.setSex((byte)1);
TUser user2 = new TUser();
user2.setUserName("deer");
user2.setRealName("陈大林");
user2.setEmail("[email protected]");
user2.setMobile("18723138787");
user2.setNote("deer's note");
user2.setSex((byte)1);
int i = mapper.insertForeach4Batch(Arrays.asList(user1,user2));
System.out.println(i);
}
结果:
2018-09-24 16:20:27.404 [main] DEBUG c.e.mybatis.mapper.TUserMapper.insertForeach4Batch - ==> Preparing: insert into t_user (user_name, real_name, sex, mobile,email,note, position_id) values ( ?, ?, ?, ?, ?, ?, ? ) , ( ?, ?, ?, ?, ?, ?, ? )
2018-09-24 16:20:27.452 [main] DEBUG c.e.mybatis.mapper.TUserMapper.insertForeach4Batch - ==> Parameters: king(String), 李小京(String), 1(Byte), 18754548787(String), [email protected](String), king's note(String), null, deer(String), 陈大林(String), 1(Byte), 18723138787(String), [email protected](String), deer's note(String), null
2018-09-24 16:20:27.453 [main] DEBUG c.e.mybatis.mapper.TUserMapper.insertForeach4Batch - <== Updates: 2
2
延伸:在Mysql中怎样进行批量操作
- 1)通过foreach动态拼装SQL语句
insert into t_user (user_name, real_name, sex, mobile,email,note, position_id) values ( ?, ?, ?, ?, ?, ?, ? ) , ( ?, ?, ?, ?, ?, ?, ? )
2)通过JDBC的stmt.addBatch(sql)执行批量操作
3)使用BATCH类型的executor
@Test
// 批量更新
public void testBatchExcutor() {
// 2.获取sqlSession
// SqlSession sqlSession = sqlSessionFactory.openSession(true);
SqlSession sqlSession = sqlSessionFactory.openSession(ExecutorType.BATCH, true);
// 3.获取对应mapper
TUserMapper mapper = sqlSession.getMapper(TUserMapper.class);
TUser user = new TUser();
user.setUserName("mark");
user.setRealName("毛毛");
user.setEmail("[email protected]");
user.setMobile("18695988747");
user.setNote("mark's note");
user.setSex((byte) 1);
user.setPositionId(1);
System.out.println(mapper.insertSelective(user));
TUser user1 = new TUser();
user1.setId(3);
user1.setUserName("cindy");
user1.setRealName("王美丽");
user1.setEmail("[email protected]");
user1.setMobile("18695988747");
user1.setNote("cindy's note");
user1.setSex((byte) 2);
user1.setPositionId(1);
System.out.println(mapper.updateIfOper(user1));
sqlSession.commit();
System.out.println("----------------");
}
参考
- 1)享学课堂Lison老师笔记