parameterType (输入类型)
parameterType属性可以映射的输入参数Java类型有:简单类型、POJO类型、Map类型、List类型(数组)。
传递简单类型
需求
根据用户名称模糊查询用户列表
映射文件
<select id="findUserByUsername" parameterType="java.lang.String"
resultType="com.osmond.mybatis.phase03.po.User">
select * from user where username like '%${value}%'
</select>
Mapper接口
List<User> findUserByUsername(String name) throws Exception;
#{}和${}的区别
- 区别1
#{}:相当于JDBC SQL语句中的占位符(PreparedStatement)
${}:相当于JDBC SQL语句中的连接符号 + (Statement)
- 区别2
#{}:进行输入映射的时候,会对参数进行类型解析(如果是String类型,那么SQL语句会自动加上’’)
${}:进行输入映射的时候,将参数原样输出到SQL语句中
- 区别3
#{}: 如果进行简单类型(String、Date、8种基本类型的包装类)的输入映射,#{}中参数名称可以任意
: 如 果 进 行 简 单 类 型 ( S t r i n g 、 D a t e 、 8 种 基 本 类 型 的 包 装 类 ) 的 输 入 映 射 , {}: 如果进行简单类型(String、Date、8种基本类型的包装类)的输入映射, :如果进行简单类型(String、Date、8种基本类型的包装类)的输入映射,{}中参数名称必须是value
- 区别4
${} 存在SQL注入问题,使用OR 1=1 关键字将查询条件忽略
- 原理
#{} 是通过反射获取数据的 StaticSqlSource
${} 是通过OGNL表达式获取数据的,会随着对象的嵌套而相应的发生层级变化 DynamicSqlSource
OGNL 对象导航图语言
例如 : OGNL表达式去获取User对象中的Department对象的name属性:dept.name
传递pojo对象
需求
添加用户并返回主键
核心
添加selectKey标签实现主键返回。
- keyProperty:指定返回的主键,存储在pojo中的哪个属性
- order:selectKey标签中的sql的执行顺序,是相对与insert语句来说。由于mysql的自增原理,执行完insert语句之后才将主键生成,所以这里selectKey
的执行顺序为after。 - resultType:返回的主键对应的JAVA类型
- LAST_INSERTID():是mysql的函数,返回autoincrement自增列新记录id值。
映射文件
<insert id="insertUser" parameterType="com.osmond.mybatis.phase03.po.User">
<selectKey keyProperty="id" order="AFTER" resultType="java.lang.Integer">
select LAST_INSERT_ID()
</selectKey>
insert into user(username,birthday,sex,address)
values(#{username},#{birthday},#{sex},#{address})
</insert>
Mapper接口
void insertUser(User user) throws Exception;
测试类
public class UserMapperTest {
private SqlSessionFactory sqlSessionFactory;
@Before
public void init() throws Exception {
// 加载全局配置文件(同时把映射文件也加载了)
String resource = "phase03/SqlMapConfig.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
// sqlSessionFactory需要通过sqlSessionFactoryBuilder读取全局配置文件信息之后
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
}
@Test
public void testInsertUser() {
// 创建UserMapper对象
SqlSession sqlSession = sqlSessionFactory.openSession();
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
// 调用UserMapper对象的API
User user = new User();
user.setUsername("Nora");
user.setSex("女");
user.setBirthday(Date.valueOf("2020-01-01"));
user.setAddress("四川成都");
try {
userMapper.insertUser(user);
// 如果不进行事务提交,即使返回了主键ID,但是不会写入数据库
sqlSession.commit();
} catch (Exception e) {
e.printStackTrace();
}
System.out.println(user);
}
}
resultType (输出类型)
resultType属性可以映射的java类型有:简单类型、POJO类型、Map类型。
使用要求
使用resultType进行输出映射时,要求sql语句中查询的列名和要映射的pojo的属性名一致。
映射简单类型
案例需求
查询用户记录数
Mapper映射文件
<select id="findUserCount" resultType="int">
select count(1) from user
</select>
Mapper接口
int findUserCount();
resultMap (输出类型)
使用要求
如果sql查询列名和pojo的属性名可以不一致,通过resultMap将列名和属性名作一个对应关系,最终将查询结果映射到指定的pojo对象中。
注意:resultType底层也是通过resultMap完成映射的
映射pojo类型
案例需求
将以下sql的查询结果进行映射:
SELECT id id_,username username_,birthday birthday_ FROM user
Mapper接口
List<User> findUserListResultMap() throws Exception;
Mapper映射文件
<!-- 定义resultMap :将查询的列名和映射的pojo的属性名做一个对应关系 -->
<!--
type : 指定查询结果要映射的pojo类型
id :指定resultMap的唯一标识
-->
<resultMap id="userListResultMap" type="com.osmond.mybatis.phase03.po.User">
<!--
id 标签 : 映射查询结果的唯一列(主键列)
column : 查询sql的列名
property : 映射结果的属性名
-->
<id column="id_" property="id"/>
<!--
result 标签 :映射查询结果的普通列
-->
<result column="username_" property="username"/>
<result column="birthday_" property="birthday"/>
</resultMap>
<select id="findUserListResultMap" resultMap="userListResultMap">
SELECT id id_,username username_,birthday birthday_ FROM user
</select>