在Mybatis中,Mapper.xml主要负责对数据库的具体操作,即增、删、改、查等相关操作,
对于mapper.xml,我们需要掌握一些常用的标签,下面做出介绍。
首先,先对此次讲解数据库表做一个说明,数据库表字段为id、username、sex、birthday、address
使用JavaBean对象实现映射类如下:
- package com.sw.po;
-
- import java.util.Date;
-
-
-
-
-
-
- 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中的?。
-
- <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;
-
-
-
-
-
-
- public class UserQueryVo {
-
- 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;
-
-
-
-
-
- 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配置如下:
-
- <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{
-
- SqlSession session = sqlSessionFactory.openSession();
-
- UserMapper userMapper = session.getMapper(UserMapper.class);
-
- HashMap<String, Object> map = new HashMap<String, Object>();
- map.put("id", 1);
- map.put("username", "Swxctx");
-
-
- List<User>list = userMapper.findUserByHashmap(map);
-
- 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文件:
-
- <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 {
-
- SqlSession session = sqlSessionFactory.openSession();
-
- UserMapper userMapper = session.getMapper(UserMapper.class);
-
- User user = userMapper.findUserById(1);
- System.out.println(user);
-
- 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{
-
- SqlSession session = sqlSessionFactory.openSession();
-
- UserMapper userMapper = session.getMapper(UserMapper.class);
-
-
-
- List<User> list = userMapper.findUserByUsername("管理员");
-
- 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的开发中十分重要,
那么打算分开进行介绍,在编写完成后会在此处打上链接。