五、特殊SQL的执行
1、模糊查询
1)和第三章一样创建一个模块,名为MyBatis-查询功能(可以直接复制第三章的模块然后导入)。
2)在mapper包下新建mapper接口SQLMapper.java
3)在mapper目录下新建mapper映射文件SQLMapper.xml
4)编写mapper接口文件SQLMapper:
//根据用户名模糊查询用户信息 //因为模糊查询返回值可能是多条,所有使用List来接收 List<User> getUserByLike(@Param("username") String username);
编写mapper映射文件SQLMapper:
<?xml version="1.0" encoding="UTF-8" ?> <!--mybatis配置文件中的约束--> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <!--将该mapper映射文件与UserMapper接口关联--> <mapper namespace="com.atguigu.mybatis.mapper.SQLMapper"> <!--根据用户名模糊查询用户信息,关联SQLMapper接口中的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 * from t_user where username like "%"#{username}"%" <!--以上三种拼接方式都可以用,但是不能用'%#{username}%'来拼接,否则报错--> </select> </mapper>
在test包下新建TestSQLMapper.java测试类并编写:
//测试根据用户名模糊查询用户信息的功能 @Test public void testGetUserByLike(){ SqlSession sqlSession = SqlSessionUtils.getSqlSession(); SQLMapper mapper = sqlSession.getMapper(SQLMapper.class); List<User> list = mapper.getUserByLike("a"); System.out.println(list); }
2、批量删除
编写mapper接口文件SQLMapper:
//批量删除 //传入该方法的参数为多个id值的拼接 int deleteMore(@Param("ids") String ids);
编写mapper映射文件SQLMapper:
<!--批量删除,关联SQLMapper接口中的deleteMore(@Param("ids") String ids)方法--> <delete id="deleteMore"> <!--此处只能使用${}来拼接,而不能使用#{},因为#{}会自动加单引号。--> delete from t_user where id in (${ids}) </delete>
在test包下新建TestSQLMapper.java测试类并编写:
//测试批量删除的功能 @Test public void testDeleteMore(){ SqlSession sqlSession = SqlSessionUtils.getSqlSession(); SQLMapper mapper = sqlSession.getMapper(SQLMapper.class); int result = mapper.deleteMore("1,2,3"); System.out.println(result); }
3、动态设置表名
设置动态表名时,只能使用${xxx},不能使用#{xxx}。因为表名不能加单引号。
编写mapper接口文件SQLMapper:
//查询指定表中的数据 List<User> getUserByTableName(@Param("tableName") String tableName);
编写mapper映射文件SQLMapper:
<!--查询指定表中的数据,关联SQLMapper接口中的getUserByTableName(@Param("tableName") String tableName)方法--> <!--设置动态表名时,只能使用${xxx},不能使用#{xxx}。因为表名不能加单引号--> <select id="getUserByTableName" resultType="User"> select * from ${tableName} </select>
在test包下新建TestSQLMapper.java测试类并编写:
//测试查询指定表中的数据的功能 @Test public void testGetUserByTableName(){ SqlSession sqlSession = SqlSessionUtils.getSqlSession(); SQLMapper mapper = sqlSession.getMapper(SQLMapper.class); List<User> list = mapper.getUserByTableName("t_user"); System.out.println(list); }
4、添加功能获取自增的主键
编写mapper接口文件SQLMapper:
//添加用户信息 void insertUser(User user);
编写mapper映射文件SQLMapper:
<!--添加用户信息,关联SQLMapper接口中的insertUser(User user)方法--> <!-- useGeneratedKeys:设置当前标签中的sql是否使用自增的主键。为true时,表示使用自动递增的主键。 keyProperty:将自增主键的值,赋值给某个传输到映射文件中的属性。 --> <insert id="insertUser" useGeneratedKeys="true" keyProperty="id"> insert into t_user values (null, #{username}, #{password}, #{age}, #{sex}, #{email}) </insert>
在test包下新建TestSQLMapper.java测试类并编写:
//测试添加用户信息的功能 @Test public void testInsertUser(){ SqlSession sqlSession = SqlSessionUtils.getSqlSession(); SQLMapper mapper = sqlSession.getMapper(SQLMapper.class); User user = new User(null, "王五", "123", 23, "男", "123@163.com"); mapper.insertUser(user); System.out.println(user); }