<!--
resultMap 手动建立映射
id="userResultMap"
type="User" 建立映射的Java类型
id 标签 主键
column="uid" 列名
property="id" 实体属性名
result 标签 普通字段
column="name" 列名
property="username" 实体属性名
--><resultMapid="userResultMap"type="User"><idcolumn="uid"property="id"></id><resultcolumn="name"property="username"></result><resultcolumn="bir"property="birthday"></result><resultcolumn="gender"property="sex"></result><resultcolumn="address"property="address"></result></resultMap><!--
模拟表与实体的属性名不一致情况
--><selectid="findAllResultMap"resultMap="userResultMap">
SELECT id AS uid, username AS `name`,birthday AS bir ,sex AS gender ,address FROM `user`
</select>
c. 测试
// resultMap标签@TestpublicvoidtestFindAllResultMap()throws Exception {// 获取代理对象
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);// 执行sql
List<User> list = userMapper.findAllResultMap();for(User user : list){
System.out.println(user);}}
<!--
多条件查询方式一
如果传递多个参数,parameterType属性可以省略不写
--><selectid="findByIdAndUsername1"resultType="User">
select * from user where id = #{id} and username = #{username}
</select><!--
多条件查询方式二
传递一个参数,parameterType也可以省略,但为了格式,不建议省略
--><selectid="findByIdAndUsername2"parameterType="User"resultType="User">
select * from user where id = #{id} and username = #{username}
</select>
c. 测试
// 多条件查询@Testpublicvoidtest01()throws Exception{// 获取代理对象
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);// 方式一/*List<User> list = userMapper.findByIdAndUsername1(41, "老王");
System.out.println(list);*/// 方式二
User user =newUser();
user.setId(41);
user.setUsername("老王");
List<User> list = userMapper.findByIdAndUsername2(user);
System.out.println(list);}
<!--
模糊查询,方式一(不推荐)
Java代码与sql语句有耦合
--><selectid="findByUsername1"parameterType="string"resultType="User">
select * from user where username like #{username}
</select><!--
模糊查询,方式二(不推荐)
mysql5.5版本之前,此拼接不支持多个单引号
oracle数据库,除了别名的位置,其余位置都不能使用双引号
--><selectid="findByUsername2"parameterType="string"resultType="User">
select * from user where username like "%" #{username} "%"
</select><!--
模糊查询,方式三(不推荐)
此方式,会出现sql注入
${} 字符串拼接,如果接收的简单数据类型,表达式名称必须是value
--><selectid="findByUsername3"parameterType="string"resultType="User">
select * from user where username like '%${value}%'
</select><!--
模糊查询,方式四(推荐)
使用concat()函数拼接
select * from user where username like concat('%',#{username},'%')
注意:oracle数据库 concat()函数只能传递二个参数,但是可以使用函数嵌套来解决
select * from user where username like concat(concat('%',#{username}),'%')
--><selectid="findByUsername4"parameterType="string"resultType="User">
select * from user where username like concat(concat('%',#{username}),'%')
</select>
c. 测试
// 模糊查询@Testpublicvoidtest02()throws Exception{// 获取代理对象
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);// 方式一// List<User> list = userMapper.findByUsername1("%王%");// 方式二// List<User> list = userMapper.findByUsername2("王");// 方式三// List<User> list = userMapper.findByUsername3("王");// 方式四
List<User> list = userMapper.findByUsername4("王");
System.out.println(list);}
4. ${} 与 #{} 区别(面试题)
${}:底层 Statement
SQL 与参数拼接在一起,会出现 SQL 注入问题
每次执行 sql 语句都会编译一次
接收简单数据类型,命名:${value}
接收引用数据类型,命名: ${属性名}
字符串类型需要加 '${value}'
#{}:底层 PreparedStatement
SQL 与参数分离,不会出现 SQL 注入问题
SQL 只需要编译一次
接收简单数据类型,命名:#{随便写}
接收引用数据类型,命名:#{属性名}
> ${} 接收简单数据类型时只能传 ${value}
查看源码 org.apache.ibatis.scripting.xmltags.TextSqlNode 可知 value 值已被写死: