MyBatis使用全注解实现1V1、1VN、NVN关系和SQL语句构建器类的创建?

一、MyBatis全注解实现1V1关系:

1、配置xml配置文件(mybatis-Config.xml):

<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <!--配置log4j-->
    <settings>
        <setting name="logImpl" value="LOG4J"/>
    </settings>
    <!--批量别名定义-->
    <typeAliases>
        <package name="com.zking"></package>
    </typeAliases>
    <!--jdbc数据连接池-->
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="${driver}"/>
                <property name="url" value="${url}"/>
                <property name="username" value="${username}"/>
                <property name="password" value="${password}"/>
            </dataSource>
        </environment>
    </environments>
    <!--配置映射文件-->
    <mappers>
        <!--1V1关系-->
        <mapper class="com.zking.mapper.IPersonMapper"></mapper>
        <mapper class="com.zking.mapper.ICordMapper"></mapper>
        <!--1VN关系-->
        <mapper class="com.zking.mapper.INationMapper"></mapper>
        <mapper class="com.zking.mapper.IProvinceMapper"></mapper>
        <!--NVN关系-->
        <mapper class="com.zking.mapper.IUserMapper"></mapper>
        <mapper class="com.zking.mapper.IRoleMapper"></mapper>
        <!--SQL语句构造器的类-->
        <mapper class="com.zking.mapper.DynamicQuery"></mapper>
    </mappers>
</configuration>

2、Log4J的配置文件(log4j.properties):

# Global logging configuration
log4j.rootLogger=ERROR, stdout
# MyBatis logging configuration...
log4j.logger.com.zking.mapper=TRACE
# Console output...
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n

3、创建主表(person )和从表(cord)的实体:

注意点:实体类名、属性名必须和数据库定义的表名、列名一致。

/**
 * 1V1关系的主表
 */
public class person implements Serializable {

    /**
     * 人的编号
     */
    private String pid;

    /**
     * 姓名
     */
    private String pname;

    /**
     * 性别
     */
    private String psex;

    /**
     * 年龄
     */
    private int page;

    /**
     * 卡的对象
     */
    private cord cords;

    /**
     * 无参构造方法
     */
    public person() {
    }

    /**
     * 有参构造方法
     *
     * @param pid
     * @param pname
     * @param psex
     * @param page
     * @param cords
     */
    public person(String pid, String pname, String psex, int page, cord cords) {
        this.pid = pid;
        this.pname = pname;
        this.psex = psex;
        this.page = page;
        this.cords = cords;
    }


    public String getPid() {
        return pid;
    }

    public void setPid(String pid) {
        this.pid = pid;
    }

    public String getPname() {
        return pname;
    }

    public void setPname(String pname) {
        this.pname = pname;
    }

    public String getPsex() {
        return psex;
    }

    public void setPsex(String psex) {
        this.psex = psex;
    }

    public int getPage() {
        return page;
    }

    public void setPage(int page) {
        this.page = page;
    }

    public com.zking.pojo.cord getCords() {
        return cords;
    }

    public void setCords(cord cords) {
        this.cords = cords;
    }

    @Override
    public String toString() {
        return "person{" +
                "pid='" + pid + '\'' +
                ", pname='" + pname + '\'' +
                ", psex='" + psex + '\'' +
                ", page=" + page +
                ", cords=" + cords +
                '}';
    }
}
**
 * 1V1关系的从表
 */
public class cord implements Serializable {

    /**
     * 卡的编号
     */
    private String cid;

    /**
     * 卡号
     */
    private int cnumber;


    /**
     * 无参构造方法
     */
    public cord() {
    }

    /**
     * 有参构造方法
     *
     * @param cid
     * @param cnumber
     */
    public cord(String cid, int cnumber) {
        this.cid = cid;
        this.cnumber = cnumber;
    }

    public String getCid() {
        return cid;
    }

    public void setCid(String cid) {
        this.cid = cid;
    }

    public int getCnumber() {
        return cnumber;
    }

    public void setCnumber(int cnumber) {
        this.cnumber = cnumber;
    }

    @Override
    public String toString() {
        return "cord{" +
                "cid='" + cid + '\'' +
                ", cnumber=" + cnumber +
                '}';
    }
}

4、创建主表接口类(IPersonMapper):

实现注解的地方(省略了xml文件)

/**
 * 1V1关系的接口
 */
public interface IPersonMapper {

    //一个person对应一个cord
    @Select("SELECT * FROM person")
    @Results({
            @Result(id = true, property = "pid", column = "pid"),
            @Result(property = "pname", column = "pname"),
            @Result(property = "psex", column = "psex"),
            @Result(property = "page", column = "page"),
            //调用角色表查询的方法 property="对象名" column="主键"
            @Result(property = "cords", column = "pid", one = @One(select = "com.zking.mapper.ICordMapper.findCordByCid"))
    })
   /**
     * 查询person表的所有数据
     */
    public List<person> findPersonAndCordAll();

}

创建从表接口类(ICordMapper):

/**
 * 1V1关系从表的接口
 */
public interface ICordMapper {

    @Select("SELECT * FROM cord WHERE cid=#{pid}")
    /**
     * 根据pid查询对应的cord数据
     */
    public cord findCordByCid(String cid);

}

5、1V1关系的测试类(PersonTest):

public class PersonTest {

    SqlSession session = null;

    @Before
    public void before() {
        //加载 mybatis 配置文件
        InputStream inputStream = PersonTest.class.
                getClassLoader().getResourceAsStream("mybatis-Config.xml");
        //构建sqlSession的工厂
        SqlSessionFactory sqlSessionFactory =
                new SqlSessionFactoryBuilder().build(inputStream);
        //根据 sqlSessionFactory 产生 session
        session = sqlSessionFactory.openSession();
    }


    @Test
    public void findPersonAndCordAll() {
        IPersonMapper ipm = session.getMapper(IPersonMapper.class);
        System.out.println(ipm.findPersonAndCordAll());
    }

    @After
    public void after() {
        //关闭session
        session.close();
    }

}

6、1V1关系的测试输出结果:

DEBUG [main] - ==>  Preparing: SELECT * FROM person 
DEBUG [main] - ==> Parameters: 
TRACE [main] - <==    Columns: pid, pname, psex, page
TRACE [main] - <==        Row: 15b62d15-b8c5-11e8-a42a-80fa5b5015f0, 陈超, 男, 17
DEBUG [main] - ====>  Preparing: SELECT * FROM cord WHERE cid=? 
DEBUG [main] - ====> Parameters: 15b62d15-b8c5-11e8-a42a-80fa5b5015f0(String)
TRACE [main] - <====    Columns: cid, cnumber
TRACE [main] - <====        Row: 15b62d15-b8c5-11e8-a42a-80fa5b5015f0, 111
DEBUG [main] - <====      Total: 1
TRACE [main] - <==        Row: b0450efa-de57-11e8-aba8-80fa5b5015f0, 成成, 男, 19
DEBUG [main] - ====>  Preparing: SELECT * FROM cord WHERE cid=? 
DEBUG [main] - ====> Parameters: b0450efa-de57-11e8-aba8-80fa5b5015f0(String)
TRACE [main] - <====    Columns: cid, cnumber
TRACE [main] - <====        Row: b0450efa-de57-11e8-aba8-80fa5b5015f0, 222
DEBUG [main] - <====      Total: 1
DEBUG [main] - <==      Total: 2
[person{pid='15b62d15-b8c5-11e8-a42a-80fa5b5015f0', pname='陈超', psex='男', page=17, cords=cord{cid='15b62d15-b8c5-11e8-a42a-80fa5b5015f0', cnumber=111}}, person{pid='b0450efa-de57-11e8-aba8-80fa5b5015f0', pname='成成', psex='男', page=19, cords=cord{cid='b0450efa-de57-11e8-aba8-80fa5b5015f0', cnumber=222}}]

二、MyBatis全注解实现1VN关系:

1、2步跟1V1关系一致。

3、创建主表(nation)和从表(province)的实体:

/**
 * 1VN关系的主表
 */
public class nation implements Serializable {

    /**
     * 国家编号
     */
    private String nid;

    /**
     * 国家名称
     */
    private String nname;

    /**
     * 省份集合
     */
    private List<province> provinceList;

    public nation() {
    }

    public nation(String nid, String nname, List<province> provinceList) {
        this.nid = nid;
        this.nname = nname;
        this.provinceList = provinceList;
    }

    public String getNid() {
        return nid;
    }

    public void setNid(String nid) {
        this.nid = nid;
    }

    public String getNname() {
        return nname;
    }

    public void setNname(String nname) {
        this.nname = nname;
    }

    public List<province> getProvinceList() {
        return provinceList;
    }

    public void setProvinceList(List<province> provinceList) {
        this.provinceList = provinceList;
    }


    @Override
    public String toString() {
        return "nation{" +
                "nid='" + nid + '\'' +
                ", nname='" + nname + '\'' +
                ", provinceList=" + provinceList +
                '}';
    }
}
/**
 * 1VN关系的从表
 */
public class province implements Serializable {

    /**
     * 省份编号
     */
    private String pid;

    /**
     * 省份名称
     */
    private String pname;

    /**
     * 国家编号
     */
    private String nid;

    public province() {
    }

    public province(String pid, String pname, String nid) {
        this.pid = pid;
        this.pname = pname;
        this.nid = nid;
    }

    public String getPid() {
        return pid;
    }

    public void setPid(String pid) {
        this.pid = pid;
    }

    public String getPname() {
        return pname;
    }

    public void setPname(String pname) {
        this.pname = pname;
    }

    public String getNid() {
        return nid;
    }

    public void setNid(String nid) {
        this.nid = nid;
    }


    @Override
    public String toString() {
        return "province{" +
                "pid='" + pid + '\'' +
                ", pname='" + pname + '\'' +
                ", nid='" + nid + '\'' +
                '}';
    }
}

4、创建主表接口类(INationMapper):

实现注解的地方(省略了xml文件)

/**
 * 1VN关系主表的接口
 */
public interface INationMapper {

    //一个nation对应多个province
    @Select("SELECT * FROM nation")
    @Results({
            @Result(id = true, property = "nid", column = "nid"),
            @Result(property = "nname", column = "nname"),
            //调用从表查询的方法 property="集合名" column="主键"
            @Result(property = "provinceList", column = "nid", many = @Many(select = "com.zking.mapper.IProvinceMapper.findProvinceAllByNid"))
    })
    public List<nation> findNationAndProvince();

}

创建从表接口类(IProvinceMapper):

/**
 * 1VN关系从表的接口
 */
public interface IProvinceMapper {

    @Select("SELECT * FROM province where nid=#{nid}")
    /**
     * 根据主键查询的方法
     */
    public List<province> findProvinceAllByNid(String nid);

}

5、1VN关系的测试类(ProvinceTest):

/**
 * 1VN关系主表的测试类
 */
public class ProvinceTest {

    SqlSession session = null;

    @Before
    public void before() {
        //加载 mybatis 配置文件
        InputStream inputStream = ProvinceTest.class.
                getClassLoader().getResourceAsStream("mybatis-Config.xml");
        //构建sqlSession的工厂
        SqlSessionFactory sqlSessionFactory =
                new SqlSessionFactoryBuilder().build(inputStream);
        //根据 sqlSessionFactory 产生 session
        session = sqlSessionFactory.openSession();
    }


    @Test
    public void findNationAndProvince() {
        INationMapper inm = session.getMapper(INationMapper.class);
        System.out.println(inm.findNationAndProvince());
    }


    @After
    public void after() {
        //关闭session
        session.close();
    }

}

 6、1VN关系的测试输出结果:

DEBUG [main] - ==>  Preparing: SELECT * FROM nation 
DEBUG [main] - ==> Parameters: 
TRACE [main] - <==    Columns: nid, nname
TRACE [main] - <==        Row: befa7666-b8c2-11e8-a42a-80fa5b5015f0, China
DEBUG [main] - ====>  Preparing: SELECT * FROM province where nid=? 
DEBUG [main] - ====> Parameters: befa7666-b8c2-11e8-a42a-80fa5b5015f0(String)
TRACE [main] - <====    Columns: pid, pname, nid
TRACE [main] - <====        Row: befe676c-b8c2-11e8-a42a-80fa5b5015f0, 湖北, befa7666-b8c2-11e8-a42a-80fa5b5015f0
TRACE [main] - <====        Row: befea6fd-b8c2-11e8-a42a-80fa5b5015f0, 湖南, befa7666-b8c2-11e8-a42a-80fa5b5015f0
DEBUG [main] - <====      Total: 2
TRACE [main] - <==        Row: d45a4506-de61-11e8-aba8-80fa5b5015f0, America
DEBUG [main] - ====>  Preparing: SELECT * FROM province where nid=? 
DEBUG [main] - ====> Parameters: d45a4506-de61-11e8-aba8-80fa5b5015f0(String)
TRACE [main] - <====    Columns: pid, pname, nid
TRACE [main] - <====        Row: 0ac574fa-de62-11e8-aba8-80fa5b5015f0, 哥伦布, d45a4506-de61-11e8-aba8-80fa5b5015f0
TRACE [main] - <====        Row: f256472a-de61-11e8-aba8-80fa5b5015f0, 洛杉矶, d45a4506-de61-11e8-aba8-80fa5b5015f0
DEBUG [main] - <====      Total: 2
DEBUG [main] - <==      Total: 2
[nation{nid='befa7666-b8c2-11e8-a42a-80fa5b5015f0', nname='China', provinceList=[province{pid='befe676c-b8c2-11e8-a42a-80fa5b5015f0', pname='湖北', nid='befa7666-b8c2-11e8-a42a-80fa5b5015f0'}, province{pid='befea6fd-b8c2-11e8-a42a-80fa5b5015f0', pname='湖南', nid='befa7666-b8c2-11e8-a42a-80fa5b5015f0'}]}, nation{nid='d45a4506-de61-11e8-aba8-80fa5b5015f0', nname='America', provinceList=[province{pid='0ac574fa-de62-11e8-aba8-80fa5b5015f0', pname='哥伦布', nid='d45a4506-de61-11e8-aba8-80fa5b5015f0'}, province{pid='f256472a-de61-11e8-aba8-80fa5b5015f0', pname='洛杉矶', nid='d45a4506-de61-11e8-aba8-80fa5b5015f0'}]}]

三、MyBatis全注解实现NVN关系:

1、2步跟1V1关系一致。

3、创建用户表(t_user)、用户角色表(t_userrole)、角色表(t_role)的实体:

/**
 * NVN关系的用户表
 */
public class t_user implements Serializable {
    /**
     * 用户编号
     */
    private String user_id;

    /**
     * 用户名称
     */
    private String user_name;

    /**
     * 用户密码
     */
    private String user_pwd;

    /**
     * 用户类型
     */
    private int user_type;

    /**
     * 角色集合
     */
    private List<t_role> roleList;

    public t_user() {
    }

    public t_user(String user_id, String user_name, String user_pwd, int user_type, List<t_role> roleList) {
        this.user_id = user_id;
        this.user_name = user_name;
        this.user_pwd = user_pwd;
        this.user_type = user_type;
        this.roleList = roleList;
    }

    public String getUser_id() {
        return user_id;
    }

    public void setUser_id(String user_id) {
        this.user_id = user_id;
    }

    public String getUser_name() {
        return user_name;
    }

    public void setUser_name(String user_name) {
        this.user_name = user_name;
    }

    public String getUser_pwd() {
        return user_pwd;
    }

    public void setUser_pwd(String user_pwd) {
        this.user_pwd = user_pwd;
    }

    public int getUser_type() {
        return user_type;
    }

    public void setUser_type(int user_type) {
        this.user_type = user_type;
    }

    public List<t_role> getRoleList() {
        return roleList;
    }

    public void setRoleList(List<t_role> roleList) {
        this.roleList = roleList;
    }

    @Override
    public String toString() {
        return "t_user{" +
                "user_id='" + user_id + '\'' +
                ", user_name='" + user_name + '\'' +
                ", user_pwd='" + user_pwd + '\'' +
                ", user_type=" + user_type +
                ", roleList=" + roleList +
                '}';
    }
}
/**
 * NVN关系的用户角色表
 */
public class t_userrole implements Serializable {

    /**
     * 中间表编号
     */
    private String urid;

    /**
     * 用户对象
     */
    private t_user t_user;

    /**
     * 角色对象
     */
    private t_role t_role;

    public t_userrole() {
    }

    public t_userrole(String urid, com.zking.pojo.t_user t_user, com.zking.pojo.t_role t_role) {
        this.urid = urid;
        this.t_user = t_user;
        this.t_role = t_role;
    }

    public String getUrid() {
        return urid;
    }

    public void setUrid(String urid) {
        this.urid = urid;
    }

    public com.zking.pojo.t_user getT_user() {
        return t_user;
    }

    public void setT_user(com.zking.pojo.t_user t_user) {
        this.t_user = t_user;
    }

    public com.zking.pojo.t_role getT_role() {
        return t_role;
    }

    public void setT_role(com.zking.pojo.t_role t_role) {
        this.t_role = t_role;
    }

    @Override
    public String toString() {
        return "t_userrole{" +
                "urid='" + urid + '\'' +
                ", t_user=" + t_user +
                ", t_role=" + t_role +
                '}';
    }
}
/**
 * NVN关系的角色表
 */
public class t_role implements Serializable {

    /**
     * 角色编号
     */
    private String rid;

    /**
     * 角色名称
     */
    private String rname;

    /**
     * 角色等级
     */
    private String rclass;

    /**
     * 用户集合
     */
    private List<t_user> userList;

    public t_role() {
    }

    public t_role(String rid, String rname, String rclass, List<t_user> userList) {
        this.rid = rid;
        this.rname = rname;
        this.rclass = rclass;
        this.userList = userList;
    }

    public String getRid() {
        return rid;
    }

    public void setRid(String rid) {
        this.rid = rid;
    }

    public String getRname() {
        return rname;
    }

    public void setRname(String rname) {
        this.rname = rname;
    }

    public String getRclass() {
        return rclass;
    }

    public void setRclass(String rclass) {
        this.rclass = rclass;
    }

    public List<t_user> getUserList() {
        return userList;
    }

    public void setUserList(List<t_user> userList) {
        this.userList = userList;
    }

    @Override
    public String toString() {
        return "t_role{" +
                "rid='" + rid + '\'' +
                ", rname='" + rname + '\'' +
                ", rclass='" + rclass + '\'' +
                ", userList=" + userList +
                '}';
    }
}

4、创建用户表接口类(IUserMapper):

实现注解的地方(省略了xml文件)

/**
 * NVN关系用户表的接口
 */
public interface IUserMapper {

    @Select("SELECT * FROM t_user")
    @Results({
            @Result(id = true, property = "user_id", column = "user_id"),
            @Result(property = "user_name", column = "user_name"),
            @Result(property = "user_pwd", column = "user_pwd"),
            @Result(property = "user_type", column = "user_type"),
            //调用查询角色的方法
            @Result(column = "user_id", property = "roleList", many = @Many(select = "com.zking.mapper.IRoleMapper.findRoleAllListBy"))
    })
    /**
     * 查询所有用户
     */
    public List<t_user> findUserAndRoleAllList();

}

创建角色表接口类(IRoleMapper):

/**
 * NVN关系角色表的接口
 */
public interface IRoleMapper {


    @Select(" SELECT r.*,ur.user_id FROM  t_role r INNER JOIN t_userrole ur ON r.rid=ur.rid WHERE ur.user_id=#{user_id} ")
    @Results({
            @Result(id = true, property = "rid", column = "rid"),
            @Result(property = "rname", column = "rname"),
            @Result(property = "rclass", column = "rclass")
    })
    /**
     * 根据用户编号查询角色
     */
    public List<t_role> findRoleAllListBy(String user_id);

}

5、NVN关系的测试类(UserTest):

/**
 * NVN关系用户表的测试类
 */
public class UserTest {

    SqlSession session = null;

    @Before
    public void before() {
        //加载 mybatis 配置文件
        InputStream inputStream = UserTest.class.
                getClassLoader().getResourceAsStream("mybatis-Config.xml");
        //构建sqlSession的工厂
        SqlSessionFactory sqlSessionFactory =
                new SqlSessionFactoryBuilder().build(inputStream);
        //根据 sqlSessionFactory 产生 session
        session = sqlSessionFactory.openSession();
    }


    @Test
    public void findPersonAndCordAll() {
        IUserMapper ium = session.getMapper(IUserMapper.class);
        System.out.println(ium.findUserAndRoleAllList());
    }

    @After
    public void after() {
        //关闭session
        session.close();
    }

}

 6、NVN关系的测试输出结果:

DEBUG [main] - ==>  Preparing: SELECT * FROM t_user 
DEBUG [main] - ==> Parameters: 
TRACE [main] - <==    Columns: user_id, user_name, user_pwd, user_type
TRACE [main] - <==        Row: b65b57f7-7528-11e8-af2e-80fa5b5015f0, admin, admin, 1
DEBUG [main] - ====>  Preparing: SELECT r.*,ur.user_id FROM t_role r INNER JOIN t_userrole ur ON r.rid=ur.rid WHERE ur.user_id=? 
DEBUG [main] - ====> Parameters: b65b57f7-7528-11e8-af2e-80fa5b5015f0(String)
TRACE [main] - <====    Columns: rid, rname, rclass, user_id
TRACE [main] - <====        Row: 6f945d11-7e71-11e8-b4a1-80fa5b5015f0, 系统管理员, 第二等级, b65b57f7-7528-11e8-af2e-80fa5b5015f0
DEBUG [main] - <====      Total: 1
TRACE [main] - <==        Row: 126af322-752a-11e8-af2e-80fa5b5015f0, CCCCCC, CCCCCC, 2
DEBUG [main] - ====>  Preparing: SELECT r.*,ur.user_id FROM t_role r INNER JOIN t_userrole ur ON r.rid=ur.rid WHERE ur.user_id=? 
DEBUG [main] - ====> Parameters: 126af322-752a-11e8-af2e-80fa5b5015f0(String)
TRACE [main] - <====    Columns: rid, rname, rclass, user_id
TRACE [main] - <====        Row: cc107538-8002-11e8-8235-80fa5b5015f0, 用户, 第三等级, 126af322-752a-11e8-af2e-80fa5b5015f0
DEBUG [main] - <====      Total: 1
TRACE [main] - <==        Row: 59c73a0e-8000-11e8-8235-80fa5b5015f0, super, super, 3
DEBUG [main] - ====>  Preparing: SELECT r.*,ur.user_id FROM t_role r INNER JOIN t_userrole ur ON r.rid=ur.rid WHERE ur.user_id=? 
DEBUG [main] - ====> Parameters: 59c73a0e-8000-11e8-8235-80fa5b5015f0(String)
TRACE [main] - <====    Columns: rid, rname, rclass, user_id
TRACE [main] - <====        Row: 27e504e1-8000-11e8-8235-80fa5b5015f0, 超级管理员, 等一等级, 59c73a0e-8000-11e8-8235-80fa5b5015f0
DEBUG [main] - <====      Total: 1
TRACE [main] - <==        Row: 98c60331-a5e8-11e8-b64e-80fa5b5015f0, aaaa, aaaa, 2
DEBUG [main] - ====>  Preparing: SELECT r.*,ur.user_id FROM t_role r INNER JOIN t_userrole ur ON r.rid=ur.rid WHERE ur.user_id=? 
DEBUG [main] - ====> Parameters: 98c60331-a5e8-11e8-b64e-80fa5b5015f0(String)
DEBUG [main] - <====      Total: 0
TRACE [main] - <==        Row: ae6b19ed-a67b-11e8-b64e-80fa5b5015f0, sss, ssss, 2
DEBUG [main] - ====>  Preparing: SELECT r.*,ur.user_id FROM t_role r INNER JOIN t_userrole ur ON r.rid=ur.rid WHERE ur.user_id=? 
DEBUG [main] - ====> Parameters: ae6b19ed-a67b-11e8-b64e-80fa5b5015f0(String)
DEBUG [main] - <====      Total: 0
TRACE [main] - <==        Row: d97ea572-b82c-11e8-a42a-80fa5b5015f0, zs, 123, 1
DEBUG [main] - ====>  Preparing: SELECT r.*,ur.user_id FROM t_role r INNER JOIN t_userrole ur ON r.rid=ur.rid WHERE ur.user_id=? 
DEBUG [main] - ====> Parameters: d97ea572-b82c-11e8-a42a-80fa5b5015f0(String)
DEBUG [main] - <====      Total: 0
DEBUG [main] - <==      Total: 6
[t_user{user_id='b65b57f7-7528-11e8-af2e-80fa5b5015f0', user_name='admin', user_pwd='admin', user_type=1, roleList=[t_role{rid='6f945d11-7e71-11e8-b4a1-80fa5b5015f0', rname='系统管理员', rclass='第二等级', userList=null}]}, t_user{user_id='126af322-752a-11e8-af2e-80fa5b5015f0', user_name='CCCCCC', user_pwd='CCCCCC', user_type=2, roleList=[t_role{rid='cc107538-8002-11e8-8235-80fa5b5015f0', rname='用户', rclass='第三等级', userList=null}]}, t_user{user_id='59c73a0e-8000-11e8-8235-80fa5b5015f0', user_name='super', user_pwd='super', user_type=3, roleList=[t_role{rid='27e504e1-8000-11e8-8235-80fa5b5015f0', rname='超级管理员', rclass='等一等级', userList=null}]}, t_user{user_id='98c60331-a5e8-11e8-b64e-80fa5b5015f0', user_name='aaaa', user_pwd='aaaa', user_type=2, roleList=[]}, t_user{user_id='ae6b19ed-a67b-11e8-b64e-80fa5b5015f0', user_name='sss', user_pwd='ssss', user_type=2, roleList=[]}, t_user{user_id='d97ea572-b82c-11e8-a42a-80fa5b5015f0', user_name='zs', user_pwd='123', user_type=1, roleList=[]}]

四、MyBatis实现SQL语句构建器类

1、2、3步跟1VN一致。

4、创建构建器类(DynamicQuery)——》所有的方法都是返回一个String

 /**
     * 根据对象参数查询
     *
     * @param nation
     * @return
     */
    public String selectNationByColumn(final nation nation) {
        return new SQL() {{
            SELECT("*");
            FROM("nation");
            if (nation.getNid() != null) {
                WHERE("nid =#{nid}");
            }
            if (nation.getNname() != null) {
                WHERE("nname like #{nname}");
            }
        }}.toString();
    }

5、创建接口(INationMapper):

    //method=构建器类里的方法名 type=构建器类名.class
    @SelectProvider(method = "selectNationByColumn", type = DynamicQuery.class)
    @Results({
            @Result(id = true, property = "nid", column = "nid"),
            @Result(property = "nname", column = "nname"),
            //调用从表的方法
            @Result(property = "provinceList", column = "nid", many = @Many(select = "com.zking.mapper.IProvinceMapper.findProvinceAllByNid"))
    })
    /**
     * 根据nation对象查询数据
     */
    public List<nation> findNationAndProvinceByColumn(nation nation);

6、创建测试类(ProvinceTest):

注意点:like查询语句的条件值%%,必须写在测试类这里,写在构建器类那里会报错。

 SqlSession session = null;

    @Before
    public void before() {
        //加载 mybatis 配置文件
        InputStream inputStream = ProvinceTest.class.
                getClassLoader().getResourceAsStream("mybatis-Config.xml");
        //构建sqlSession的工厂
        SqlSessionFactory sqlSessionFactory =
                new SqlSessionFactoryBuilder().build(inputStream);
        //根据 sqlSessionFactory 产生 session
        session = sqlSessionFactory.openSession();
    }


    @Test
    public void findNationAndProvince() {
        INationMapper inm = session.getMapper(INationMapper.class);
        System.out.println(inm.findNationAndProvince("befa7666-b8c2-11e8-a42a-80fa5b5015f0", "%C%"));
    }


    @After
    public void after() {
        //关闭session
        session.close();
    }

7、测试结果:

DEBUG [main] - ==>  Preparing: SELECT * FROM nation WHERE (nid=? AND nname like ?) 
DEBUG [main] - ==> Parameters: befa7666-b8c2-11e8-a42a-80fa5b5015f0(String), %C%(String)
TRACE [main] - <==    Columns: nid, nname
TRACE [main] - <==        Row: befa7666-b8c2-11e8-a42a-80fa5b5015f0, China
DEBUG [main] - ====>  Preparing: SELECT * FROM province where nid=? 
DEBUG [main] - ====> Parameters: befa7666-b8c2-11e8-a42a-80fa5b5015f0(String)
TRACE [main] - <====    Columns: pid, pname, nid
TRACE [main] - <====        Row: befe676c-b8c2-11e8-a42a-80fa5b5015f0, 湖北, befa7666-b8c2-11e8-a42a-80fa5b5015f0
TRACE [main] - <====        Row: befea6fd-b8c2-11e8-a42a-80fa5b5015f0, 湖南, befa7666-b8c2-11e8-a42a-80fa5b5015f0
DEBUG [main] - <====      Total: 2
DEBUG [main] - <==      Total: 1
[nation{nid='befa7666-b8c2-11e8-a42a-80fa5b5015f0', nname='China', provinceList=[province{pid='befe676c-b8c2-11e8-a42a-80fa5b5015f0', pname='湖北', nid='befa7666-b8c2-11e8-a42a-80fa5b5015f0'}, province{pid='befea6fd-b8c2-11e8-a42a-80fa5b5015f0', pname='湖南', nid='befa7666-b8c2-11e8-a42a-80fa5b5015f0'}]}]

猜你喜欢

转载自blog.csdn.net/qq_42246139/article/details/83662275