MyBatis映射文件深入
在实际开发中执行查询SQL语句,经常需要多个参数。那么parameterType属性值的数据类型是什么呢?可以使用是用Map集合的键值对来传递多个参数; 也可以使用JavaBean对象封装多个参数
使用Map传递多个参数
先写一个在UserMapper接口中添加下面的抽象方法
/*查询姓张的男性用户信息*/
public List<User> selectAllUserByCondition(Map<String,Object> map);
在UserMap.xml映射文件添加下面的代码
<!--查询姓王的所有用户信息-->
<select id="selectAllUserByCondition" resultType="com.itheima.domain.User" parameterType="map">
select * from user where uname like concat('%',#{uname},'%') and usex=#{usex}
</select>
创建UserMapperTest3测试类,在测试类中进行测试
/*演示使用map接口传递多个参数*/
@Test
public void test(){
InputStream in = null;
try {
in = Resources.getResourceAsStream("mybatis-config.xml");
SqlSessionFactory ssf = new SqlSessionFactoryBuilder().build(in);
SqlSession sqlSession = ssf.openSession();
//获取UserMapper接口映射对象
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
//准备查询参数,
HashMap<String,Object> map=new HashMap<String, Object>();
map.put("uname","王");
map.put("usex","男");
//将查询参数传递sql语句
List<User> users = mapper.selectAllUserByCondition(map);
for (User user : users) {
System.out.println(user);
}
} catch (IOException e) {
e.printStackTrace();
}
}
使用JavaBean传递多个参数
先在UserMapper接口中加入下面的方法
/*查询姓王的女性用户的信息*/
public List<User> selectAllUserByJavaBean(User user);
再到UserMapper映射文件中加入下面的代码
<!--查询姓王的所有用户信息-->
<select id="selectAllUserByJavaBean" resultType="com.itheima.domain.User" parameterType="user">
select * from user where uname like concat('%',#{uname},'%') and usex=#{usex}
</select>
在UserMapperTest3测试类中,加入下面的代码进行测试
/*演示使用JavaBean对象传递多个参数*/
@Test
public void test1(){
InputStream in = null;
try {
in = Resources.getResourceAsStream("mybatis-config.xml");
SqlSessionFactory ssf = new SqlSessionFactoryBuilder().build(in);
SqlSession sqlSession = ssf.openSession();
//获取UserMapper接口映射对象
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
//准备查询参数,
User user=new User();
user.setUname("王");
user.setUsex("女");
//将查询参数传递sql语句
List<User> users = mapper.selectAllUserByJavaBean(user);
for (User u : users) {
System.out.println(u);
}
} catch (IOException e) {
e.printStackTrace();
}
}
JavaBean主键自动回填
在MySQL等数据库的表格中可以设置主键自动增长,当添加数据时JavaBean对象并不用给主键赋值,添加完数据之后把自动生成的主键值回填给JavaBean对象
在UserMapper的映射文件中为<insert>
标签加入keyProperty
和useeGeneratedKeys
属性就可以了,代码如下
<!--添加一个用户-->
<insert id="addUser" parameterType="com.itheima.domain.User" keyProperty="id" useGeneratedKeys="true">
insert into User(uname,usex) values(#{uname},#{usex})
</insert>
在UserMapperTest3测试类中进行测试,代码如下
public class UserMapperTest3{
/*演示主键回填*/
@Test
public void test2(){
InputStream in = null;
try {
in = Resources.getResourceAsStream("mybatis-config.xml");
SqlSessionFactory ssf = new SqlSessionFactoryBuilder().build(in);
SqlSession sqlSession = ssf.openSession();
//获取UserMapper接口映射对象
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
//创建User对象,封装要添加的数据(注意没有给主键id)
User user=new User();
user.setUname("王三毛");
user.setUsex("男");
int count = mapper.addUser1(user);
System.out.println("影响的行数:"+count);
System.out.println("回填的主键是:"+user.getId());
} catch (IOException e) {
e.printStackTrace();
}
}
}
使用Map存储结果集
在任意的select语句中都可以使用Map存储结果集,现在UserMapper接口中添加一个抽象方法
/*查询所有的用户信息,存储到Map集合中*/
public List<Map<String,Object>> selectAllUserMap();
在UserMapper映射文件中添加下面的代码
<!--查询所有用户信息,使用map集合存储结果集-->
<select id="selectAllUserMap" resultType="map">
select * from user
</select>
在UserMapperTest3测试类中,添加下面的测试方法
/*演示查询结果,使用Map集合存储*/
@Test
public void test3(){
InputStream in = null;
try {
in = Resources.getResourceAsStream("mybatis-config.xml");
SqlSessionFactory ssf = new SqlSessionFactoryBuilder().build(in);
SqlSession sqlSession = ssf.openSession();
//获取UserMapper接口映射对象
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
//查询所有的用户信息,每一个用户信息使用Map集合存储,再把Map集合存入List集合
List<Map<String, Object>> maps = mapper.selectAllUserMap();
for (Map<String, Object> map : maps) {
System.out.println(map);
}
} catch (IOException e) {
e.printStackTrace();
}
}
使用JavaBean存储结果集
如果JavaBean对象的属性名和select
语句结果集的字段名不一致,就不能正确的把结果集中的数据填充到JavaBean对象中。我们可以采用<resultMap>
元素,自定义结果集与JavaBean对象的映射关系。
定义一个MapUser类,用户存储结果集的数据。
public class MapUser {
private Integer u_id;
private String u_name;
private String u_sex;
//此处省略了get和set方法
@Override
public String toString() {
return "MapUser{" +
"u_id=" + u_id +
", u_name='" + u_name + '\'' +
", u_sex='" + u_sex + '\'' +
'}';
}
}
在UserMapper映射文件中配置<resultMap>
元素,其属性type
引用Javabean类
<!--配置resultMap元素-->
<resultMap type="com.itheima.domain.MapUser" id="myResult">
<!--id表示那一个列是主键列-->
<id property="u_id" column="id"/>
<!--result表示查询结果,property表示User类的属性;column表示查询结果的列名-->
<result property="u_name" column="uname"/>
<result property="u_sex" column="usex"/>
</resultMap>
在UserMapper映射文件中配置select
语句,其属性resultMap引用<resultMap>
元素的id
<!--查询所有用户-->
<select id="selectResultMap" resultMap="myResult">
select * from user
</select>
在UserMapperTest3测试类中进行测,代码如下
/*演示resultMap自定义结果集*/
@Test
public void test4(){
InputStream in = null;
try {
in = Resources.getResourceAsStream("mybatis-config.xml");
SqlSessionFactory ssf = new SqlSessionFactoryBuilder().build(in);
SqlSession sqlSession = ssf.openSession();
//获取UserMapper接口映射对象
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
//查询所有的用户信息
List<MapUser> listResutMap = mapper.selectResultMap();
for (MapUser mapUser : listResutMap) {
System.out.println(mapUser);
}
} catch (IOException e) {
e.printStackTrace();
}
}