Java康复性训练——MyBatis3(2)

2016/7/19 posted in  Java  

接上篇,继续对Mybatis的使用进行介绍。

代码展示:Github地址

Mapper的XML配置

上一篇的文章当中UserMapper接口只定义了一个addUser的方法。这次我们首先先完善这个接口类。添加写、改、删、查这些方法。

package site.zhanjingbo.mapper;

import java.util.List;

import site.zhanjingbo.model.User;

public interface UserMapper {
    public int addUser(User user);
    public int updateUser(User user);
    public int deleteUser(Integer id);
    
    public User getUserById(Integer id);
    public List<User> getAllUser();
    
}

添加XML配置

配置文件如下:

    <insert id="addUser" parameterType="User" useGeneratedKeys="true" >
        insert into user(username,password) values(#{username},#{password}) 
    </insert>

修改XML配置

    <update id="updateUser" parameterType="User">
        update user set username=#{username},password=#{password} where id=#{id}
    </update>

删除XML配置

    <delete id="deleteUser" parameterType="Integer">
        delete from user where id=#{id}
    </delete>

查询XML配置

  1. 返回单个对象。(注意:对象一定要有对应的构造方法或无参构造)

    <select id="getUserById" parameterType="Integer" resultType="User">
        select * from user where id=#{id}
    </select>
    
  2. 返回结构List。

    1. 先声明一个返回类型

      <resultMap type="User" id="UserList">
          <id property="id" column="id"/>
          <result property="username" column="username"/>
          <result property="password" column="password"/>
      </resultMap>
      
    2. 声明SQL语句映射

      <select id="getAllUser" resultMap="UserList">
          select * from user
      </select>
      

关系映射

一对一关系

为了更好的展示,我们给User添加一个Role的属性,也就是角色属性。

  1. 建立Role的POJO对象

    package site.zhanjingbo.model;
    public class Role {
        private Integer id;
        private String roleName;
    
        public Role(){
            super();
        }
        public Role(Integer id, String roleName) {
            super();
            this.id = id;
            this.roleName = roleName;
        }
    
        public Integer getId() {
            return id;
        }
        public void setId(Integer id) {
            this.id = id;
        }
        public String getRoleName() {
            return roleName;
        }
        public void setRoleName(String roleName) {
            this.roleName = roleName;
        }
    
        @Override
        public String toString() {
            return "Role [id=" + id + ", roleName=" + roleName + "]";
        }
    }
    
  2. 建立Role的Mapper接口

    package site.zhanjingbo.mapper;
    
    import site.zhanjingbo.model.Role;
    
    public interface RoleMapper {
        public Role getRoleById(Integer id);
    }
    
  3. 建立Role的Mapper映射文件(注:这里使用的Role 实在config文件中设置了别名)

    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE mapper
      PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
      "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    <mapper namespace="site.zhanjingbo.mapper.RoleMapper">
        <select id="getRoleById" parameterType="Integer"  resultType="Role">
            select * from role where id=#{id}
        </select>
    </mapper>
    
  4. 修改User的Mapper映射文件,主要修改查询语句的相关返回,设置resultMap为UserResult,其声明如下:

    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE mapper
      PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
      "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    <mapper namespace="site.zhanjingbo.mapper.UserMapper">  
        <resultMap type="User" id="UserResult">
            <id property="id" column="id"/>
            <result property="username" column="username"/>
            <result property="password" column="password"/>
            <association property="role" column="roleId" select="site.zhanjingbo.mapper.RoleMapper.getRoleById"></association>
        </resultMap>
    
        <insert id="addUser" parameterType="User" useGeneratedKeys="true" >
            insert into user(username,password) values(#{username},#{password}) 
        </insert>
        <update id="updateUser" parameterType="User">
            update user set username=#{username},password=#{password} where id=#{id}
        </update>
        <delete id="deleteUser" parameterType="Integer">
            delete from user where id=#{id}
        </delete>
        <select id="getUserById" parameterType="Integer" resultMap="UserResult">
            select * from user where id=#{id}
        </select>
        <select id="getAllUser" resultMap="UserResult">
            select * from user
        </select>
    </mapper>
    

一对多关系

一对多关系其实是扩展的一对一关系,我们在这一部分对上面的Role实体进行扩展。在上面我们定义一个用户只能有一个角色,但是一个角色其实可以有多个用户。这就构成了一对多。
为了展示一对多,我们增加一个根据用户角色查询用户的功能。

  1. 需要在UserMapper中添加一个根据Role返回User List的方法。
  2. 在UserMapper.xml中完善这个方法的SQL语句
  3. 在Role中增加UserList属性,并添加getter和setter方法
  4. 在RoleMapper.xml中增加配置。如下代码展示

     <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE mapper
    PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
    "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    <mapper namespace="site.zhanjingbo.mapper.RoleMapper">
    <resultMap type="Role" id="RoleResult">
        <id property="id" column="id"/>
        <result property="roleName" column="roleName"/>
        <collection property="userList" column="id" select="site.zhanjingbo.mapper.UserMapper.getUserByRole"></collection>
    </resultMap>
    <select id="getRoleById" parameterType="Integer"  resultMap="RoleResult">
        select * from role where id=#{id}
    </select>
    </mapper>
    

多对多关系

多对多关系可以理解为双向的一对多关系,参照上方的一对多实现,关联中间表即可。