【MyBatis基础】(04)- 输入输出映射

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种基本类型的包装类)的输入映射, :(StringDate8),{}中参数名称必须是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>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值