您的位置:首页 > 移动开发

Mybatis-Mapper.xml输入输出映射

2016-12-04 12:53 387 查看
在Mybatis中,Mapper.xml主要负责对数据库的具体操作,即增、删、改、查等相关操作,

对于mapper.xml,我们需要掌握一些常用的标签,下面做出介绍。

首先,先对此次讲解数据库表做一个说明,数据库表字段为id、username、sex、birthday、address

使用JavaBean对象实现映射类如下:

package com.sw.po;

import java.util.Date;

/*
*@Author swxctx
*@time 2016年11月30日
*@Explain:属性名与表的字段对应
*/
public class User {
private int id;
private String username;// 用户姓名
private String sex;// 性别
private Date birthday;// 生日
private String address;// 地址
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
@Override
public String toString() {
return "User [id=" + id + ", username=" + username + ", sex=" + sex
+ ", birthday=" + birthday + ", address=" + address + "]";
}

}


parameterType-输入映射

parameterType即为输入类型,在Mybatis中,我们对数据库进行相关操作时,则会对sql传入一些值,那么这些值都有其相应的数据类型。

占位符#{}、${}

#{}与${}在开发中比较常用,在sql具有变量时俊辉使用到#{}与${}

#{}实现的是向prepareStatement中的预处理语句中设置参数值,sql语句中#{}表示一个占位符,即类似于Hibnernate的PareStatement中的?。

<!-- 根据id查询用户信息 -->
<select id="findUserById" parameterType="int" resultType="user">
select * from user where id = #{id}
</select>


使用占位符#{}可以防止sql注入,在使用时不需要关心参数值的类型,mybatis会自动进行java类型和jdbc类型的转换。

#{}可以接收简单类型值或pojo属性值,如果parameterType传输单个简单类型值,#{}括号中可以是value或其它名称。

${}和#{}不同,通过${}可以将parameterType传入的内容拼接在sql中且不进行jdbc类型转换, ${}可以接收简单类型值或pojo属性值,如果parameterType传输单个简单类型值,${}括号中只能是value。使用${}不能防止sql注入,但是有时用${}会非常方便,如下的例子:

<!-- 根据名称模糊查询用户信息 -->
<select id="selectUserByName" parameterType="string" resultType="user">
select * from user where username like '%${value}%'
</select>


如果本例子使用#{}则传入的字符串中必须有%号,而%是人为拼接在参数中,显然有点麻烦,如果采用${}在sql中拼接为%的方式则在调用mapper接口传递参数就方便很多。

//如果使用占位符号则必须人为在传参数中加%
List<User> list = userMapper.selectUserByName("%解%");
//如果使用${}原始符号则不用人为在参数中加%
List<User>list = userMapper.selectUserByName("解");

比如order by排序,如果将列名通过参数传入sql,根据传的列名进行排序,应该写为:

ORDER BY${columnName}

如果使用#{}将无法实现此功能。

传递pojo对象

在Mybatis中,可使用ognl表达式解析对象字段的值,如下配置所示:

<!—传递pojo对象综合查询用户信息 -->
<select id="findUserByUser" parameterType="user" resultType="user">
select * from user where id=#{id} and username like '%${username}%'
</select>


#{id}与{username},这里的id与username表示的是user对象中的属性名称。
其中paramwterType=“user”则表示其输入类型为User对象,即使用User对象中的相关属性。

传递pojo包装对象

开发中通过pojo传递查询条件 ,查询条件是综合的查询条件,不仅包括用户查询条件还包括其它的查询条件(比如将用户购买商品信息也作为查询条件),
这时可以使用包装对象传递输入参数。

传递poio包装对象,首先则需要进行包装对象的定义,如下所示:

package com.sw.po;

import java.util.List;

/*
*@Author swxctx
*@time 2016年12月2日
*@Explain:包装所需要的查询条件(亦可包装其他对象的查询信息)-包装类型
*/
public class UserQueryVo {
//传入多个id
private List<Integer> ids;
//用户查询条件
private UserCustom userCustom;

public UserCustom getUserCustom() {
return userCustom;
}

public void setUserCustom(UserCustom userCustom) {
this.userCustom = userCustom;
}

public List<Integer> getIds() {
return ids;
}

public void setIds(List<Integer> ids) {
this.ids = ids;
}
}


映射对象的扩展类如下:

package com.sw.po;
/*
*@Author swxctx
*@time 2016年12月2日
*@Explain:User类的扩展类
*/
public class UserCustom extends User{
//可以扩展用户的信息
}


包装对象定义完成后,我们就可以在mapper.xml文件中进行相关的配置:

<select id="findUserList" parameterType="com.sw.po.UserQueryVo" resultType="com.sw.po.UserCustom">
select *from user where username=#{username}
</select>


传递HashMap

在Mybatis中,亦可通过HashMap输入值,其mapper.xml配置如下:

<!-- 传递hashmap综合查询用户信息 -->
<select id="findUserByHashmap" parameterType="hashmap" resultType="user">
select * from user where id=#{id} and username like '%${username}%'
</select>
如上,#{id}与{username}则表示hashmap中的对应key值,经过配置后,配置文件会自动到代码中寻找key为id的字段,如果没有,则会出现异常。

测试代码如下:

Public void testFindUserByHashmap()throws Exception{
//获取session
SqlSession session = sqlSessionFactory.openSession();
//获限mapper接口实例
UserMapper userMapper = session.getMapper(UserMapper.class);
//构造查询条件Hashmap对象
HashMap<String, Object> map = new HashMap<String, Object>();
map.put("id", 1);
map.put("username", "Swxctx");

//传递Hashmap对象查询用户列表
List<User>list = userMapper.findUserByHashmap(map);
//关闭session
session.close();
}


ResultType-输出映射

输出类型即为Mybatis执行sql之后结果的输出类型。

简单输出类型

简单输出类型即为常见的数据类型,我们从下面的例子进行理解。

Mapper.xml配置文件:

<!-- 获取用户列表总数 -->
<select id="findUserCount" parameterType="user" resultType="int">
select count(1) from user
</select>
如上所示,resultType=“int”,即表示sql执行输出结果为int型的,从sql不难看出,该sql的作用是查询出数据库表的数据总条数,自然其应该为

int型下符合需求。

在这里,不只是int型的数据可用,在实际开发中,我们还会用到例如String、Date、Boolean等数据类型,此类即为常用简单输出类型。

输出poio对象

输出poio对象,显然,在执行sql之后,我们输出的是一个对象;那么如何理解呢,其实结合poio对象来进行理解,也就不难。

例如:现在需要根据用户id查询出一个用户,并且显示该用户所有数据

在前面我们已经介绍过类似JavaBean与数据库表的映射,即为poio对象,poio对象的属性对应了数据库表的字段,要想输出所有数据,那嚒

我们输出poio对象,是否就将数据全部输出了呢?答案是肯定的,输出poio对象,即输出了所有的属性信息。(注:只能输出一条信息,类似于selectOne())

为了加深理解,我们可以通过下面例子进行理解:

mapper.xml文件:

<!-- 根据id查询用户信息 -->
<select id="findUserById" parameterType="int" resultType="user">
select * from user where id = #{id}
</select>


mapper接口:

public User findUserById(int id) throws Exception;


测试类:

Public void testFindUserById() throws Exception {
//获取session
SqlSession session = sqlSessionFactory.openSession();
//获限mapper接口实例
UserMapper userMapper = session.getMapper(UserMapper.class);
//通过mapper接口调用statement
User user = userMapper.findUserById(1);
System.out.println(user);
//关闭session
session.close();
}


输出pojo列表

输出pojo列表与上面的输出pojo差别并不大,唯一的差别就是:输出对象输出的是一个对象,而输出对象列表则可以输出多条数据。

例如:查询所有用户名有‘解’的用户,显然可能会有很多用户。因此,我们需要使用输出poio列表的方式进行输出。

实例:mapper.xml

<!-- 根据名称模糊查询用户信息 -->
<select id="findUserByUsername" parameterType="string" resultType="user">
select * from user where username like '%${value}%'
</select>


mapper接口

public List<User> findUserByUsername(String username) throws Exception;


测试类:

Public void testFindUserByUsername()throws Exception{
//获取session
SqlSession session = sqlSessionFactory.openSession();
//获限mapper接口实例
UserMapper userMapper = session.getMapper(UserMapper.class);
//如果使用占位符号则必须人为在传参数中加%
//List<User> list = userMapper.selectUserByName("%管理员%");
//如果使用${}原始符号则不用人为在参数中加%
List<User> list = userMapper.findUserByUsername("管理员");
//关闭session
session.close();
}


输出HashMap

输出pojo对象可以改用hashmap输出类型,将输出的字段名称作为map的key,value为字段值。

resultMap-高级输出映射

resultType可以指定pojo将查询结果映射为pojo,但需要pojo的属性名和sql查询的列名一致方可映射成功。

如果sql查询字段名和pojo的属性名不一致,可以通过resultMap将字段名和属性名作一个对应关系 ,resultMap实质上还需要将查询结果映射到pojo对象中。

resultMap可以实现将查询结果映射为复杂类型的pojo,比如在查询结果映射对象中包括pojo和list实现一对一查询和一对多查询。

resultMap的定义:

<!-- 定义ResultMap
将select id id_,username username_ from user where id=#{id}查询出来的列与
pojo(User)类中的属性做映射(对应关系)
type:ResultMap最终所映射的Java对象类型(可使用别名)
id:对ResultType于ResultMap的唯一标识
-->
<resultMap type="user" id="userResultMap">
<!-- 查询结果集中的唯一标识(对应于数据库表中字段的唯一标识)
colum:查询出的列名
property:pojo的属性名字(Type指定的pojo对象
最终resultMap对column和property进行映射(做映射关系)
-->
<id column="id_" property="id"/>
<!-- 对普通列的映射定义 -->
<result column="username_" property="username"/>
</resultMap>


定义好之后,我们就可以在mapper.xml文件中进行使用了,如下:

<!-- 使用ResultMap进行输出的映射
ResultMap:指定已定义的ResultMap的id(该ResultMap在其他的Mapper文件中,需要在前面加上namespace进行指定)
-->
<select id="findUserByIdResultMap" parameterType="int" resultMap="userResultMap">
select id id_,username username_ from user where id=#{id}
</select>


到这里呢,mapper.xml的常用的标签就完成了,但是还有一个重要的东西,即动态sql,动态sql在Mybatis的开发中十分重要,

那么打算分开进行介绍,在编写完成后会在此处打上链接。

动态Sql文章链接如下(2017-3)

点击打开链接
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: