文章目录
失败,是正因你在距成功一步之遥的时候停住了脚步。
7、特殊SQL的执行
7.1、模糊查询
- 模糊查询格式:‘%值%’,不能直接使用#{},这里将介绍三种方式
- ‘%${username}%’
- concat(‘%’,#{username},‘%’)
- “%”#{username}“%”
1 SpecialSQLMapper.java
// 模糊查询
List<User> getUserByLike(@Param("username") String username);
2 SpecialSQLMapper.xml
<!--List<User> getUserByLike(@Param("username") String username);-->
<select id="getUserByLike" resultType="User">
<!--select * from t_user where username like '%${username}%'-->
<!--select * from t_user where username like concat('%',#{username},'%')-->
select id, username, `password`, age, gender, email
from t_user
where username like "%"#{username}"%"
</select>
3 测试
@Test
public void testGetUserByLike() {
SqlSession sqlSession = MybatisUtils.getSqlSession();
SpecialSQLMapper mapper = sqlSession.getMapper(SpecialSQLMapper.class);
List<User> list = mapper.getUserByLike("z");
sqlSession.close();
list.forEach(System.out::println);
}
7.2、批量删除
- 这里只能使用in(${ids})方式实现。
- 后面学习动态SQL可以使用forEach标签,可以使用id=5 OR id=6的方式。
1 SpecialSQLMapper.java
// 批量删除
int deleteMoreUser(@Param("ids") String ids);
2 SpecialSQLMapper.xml
<!--int deleteMoreUser(@Param("ids") String ids);-->
<delete id="deleteMoreUser">
delete
from t_user
where id in (${ids});
</delete>
3 测试
@Test
public void testDeleteMoreUser() {
SqlSession sqlSession = MybatisUtils.getSqlSession();
SpecialSQLMapper mapper = sqlSession.getMapper(SpecialSQLMapper.class);
int result = mapper.deleteMoreUser("8,9,10,11,12");
sqlSession.commit();
sqlSession.close();
System.out.println("影响行数:" + result);
}
7.3、动态设置表名
- 动态设置表名不能用
#{}
,只能用${}
。 - 原因是
#{}
是占位符,sql语句中 ----> ‘表名’ ,这样写sql语句一定报错。
1 SpecialSQLMapper.java
// 动态设置表名,查询所有的用户信息
List<User> getUserByTableName(@Param("tableName") String tableName);
2 SpecialSQLMapper.xml
<!--List<User> getUserByTableName(@Param("tableName") String tableName);-->
<select id="getUserByTableName" resultType="User">
select id, username, `password`, age, gender, email
from ${tableName};
</select>
3 测试
@Test
public void testGetAllUser() {
SqlSession sqlSession = MybatisUtils.getSqlSession();
SpecialSQLMapper mapper = sqlSession.getMapper(SpecialSQLMapper.class);
List<User> list = mapper.getUserByTableName("t_user");
sqlSession.close();
list.forEach(System.out::println);
}
7.4、添加功能获取自增的主键
1 使用场景
- t_clazz(clazz_id,clazz_name)
- t_student(student_id,student_name,clazz_id)
- 业务:将一些学生添加到新创建的班级中。
- 步骤:
1、添加班级信息
2、获取新添加的班级的id
3、为班级分配学生,将某学生的班级id修改为新添加的班级的id
2 mybatis实现
- useGeneratedKeys:表示当前添加功能使用自增的主键(将自增的主键返回,这个功能需要手动开启)。
- keyProperty:将添加数据的自增主键赋值给传输的参数user对象的某个属性中(因为增删改返回值是受影响的行数,是固定的)。
- 这个功能是JDBC的带的。
3 SpecialSQLMapper.java
// 添加用户
int insertUser(User user);
4 SpecialSQLMapper.xml
<!--int insertUser(User user);-->
<insert id="insertUser" useGeneratedKeys="true" keyProperty="id">
insert into t_user (username, password, age, gender, email)
values (#{username}, #{password}, #{age}, #{gender}, #{email});
</insert>
5 测试
@Test
public void testInsertUser() {
SqlSession sqlSession = MybatisUtils.getSqlSession();
SpecialSQLMapper mapper = sqlSession.getMapper(SpecialSQLMapper.class);
User user = new User(null, "tianyu", "123", 28, "男", "123@qq.com");
int result = mapper.insertUser(user);
sqlSession.commit();
System.out.println("影响行数:" + result + "主键:" + user.getId());
}
6 JDBC实现
这里只是简写一下
@Test
public void testJDBC(){
try {
Class.forName("");
Connection connection = DriverManager.getConnection("", "", "");
String sql = "insert into t_user (username, password, age, gender, email) values (?,?,?,?,?)";
// 默认不允许获取自增主键,设置参数允许获取自增主键
PreparedStatement ps = connection.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);
// 为占位符传参
ps.setObject(1,"");
// 执行sql
ps.executeUpdate();
// 接受返回的结果集
ResultSet resultSet = ps.getGeneratedKeys();
// 拨动指针
resultSet.next();
// 获取id
int id = resultSet.getInt(1);
} catch (Exception e) {
throw new RuntimeException(e);
}
}