一、输入映射
输入映射,是在映射文件中通过parameterType指定输入参数的类型,类型可以是简单类型、pojo、pojo的包装类型。
1.1、简单类型
使用#{}占位符或${}进行sql拼接。
1.1.1、根据id查找User
<select id="getUserById" parameterType="int" resultType="cn.xpu.hcp.bean.User">
select * from user where id = #{id}
</select>
Mapper接口:
public interface UserMapper {
public User getUserById(int id);
}
测试:
public void MapperTest(){
SqlSession session = sqlSessionFactory.openSession();
UserMapper mapper = session.getMapper(UserMapper.class);
User user = mapper.getUserById(1);
System.out.println(user);
session.close();
}
1.1.2、根据字符串模糊查找User列表
<!-- 模糊查询 -->
<select id="getLikeByName" parameterType="string" resultType="cn.xpu.hcp.bean.User">
select * from user where username like "%"#{value}"%"
</select>
Mapper接口:
public interface UserMapper {
public List<User> getLikeByName(String str);
}
测试:
public void MapperTest(){
SqlSession session = sqlSessionFactory.openSession();
UserMapper mapper = session.getMapper(UserMapper.class);
List<User> list = mapper.getLikeByName("张");
for (User user : list) {
System.out.println(user);
}
session.close();
}
1.2、输入POJO
MyBatis使用OGNL表达式解析对象字段的值,#{}或者${}中的值为POJO属性名称。
更新User
<!-- 更新 -->
<update id="updateUser" parameterType="cn.xpu.hcp.bean.User">
update user set username=#{username},birthday = #{birthday},sex = #{sex},address = #{address} WHERE id=#{id}
</update>
Mapper接口:
public interface UserMapper {
public void updateUser(User user);
}
测试:
public void MapperTest(){
SqlSession session = sqlSessionFactory.openSession();
UserMapper mapper = session.getMapper(UserMapper.class);
User user = mapper.getUserById(1);
user.setUsername("Jake");
mapper.updateUser(user);//先查找,再更新
session.commit();
session.close();
}
1.3、输入POJO的包装类
根据UserWrapper类中的POJO(user)进行模糊查询。
包装类:
public class UserWrapper {
private User user;
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
}
xml文件:
<select id="queryByWrapper" parameterType="cn.xpu.hcp.bean.UserWrapper" resultType="cn.xpu.hcp.bean.User">
select * from user where username like '%${user.username}%'
</select>
Mapper接口:
public interface UserMapper {
public List<User> queryByWrapper(UserWrapper wrapper);
}
测试:
public void MapperTest(){
SqlSession session = sqlSessionFactory.openSession();
UserMapper mapper = session.getMapper(UserMapper.class);
UserWrapper wrapper = new UserWrapper();
User user = new User();
user.setUsername("张");
wrapper.setUser(user);
List<User> list = mapper.queryByWrapper(wrapper);
for (User u : list) {
System.out.println(u);
}
session.commit();
session.close();
}
二、输出映射
MyBatis中输出映射有resultType和resultMap两种。
2.1、输出POJO对象
2.2、输出POJO列表
以上两种前面已经使用了。
2.3、resultType和resultMap
resultType可以指定将查询结果映射为POJO对象,但是,这需要表的列名和POJO的属性名相同才可以映射成功。
现在,我修改POJO的属性名:
我们继续使用resultType作为输出映射:
<select id="getUserById" parameterType="int" resultType="cn.xpu.hcp.bean.User">
select * from user where id = #{id}
</select>
由于表名和属性名的不一致输出无法映射上,导致了空值。
这时我们就应该使用resultMap了,他可以将字段和属性名作一个对应关系。
<resultMap type="cn.xpu.hcp.bean.User" id="userMap">
<!--
id标签:定义主键
column:表中的列名
property:POJO中的属性名
-->
<id column="id" property="userId"/>
<!-- 普通属性 -->
<result column="username" property="name"/>
</resultMap>
<select id="getUserById" parameterType="int" resultMap="userMap" >
select * from user where id = #{id}
</select>
成功建立了输出映射。
我认为在建立表和POJO时应该保证一致,避免麻烦。