MyBatis系列第三篇:MyBatis中Mapper詳解與級聯查詢

MyBatis框架的主要配置文件:mybatis-config.xml文件和Mapper.xml文件。

一、Mapper.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="com.wind.repository.UserRepository">

    <resultMap id="userMap" type="com.wind.entity.UserEntity">
        <id column="Id" property="id"/>
        <result column="Name" property="name"/>
        <result column="Age" property="age"/>
        <result column="Salary" property="salary"/>
        <result column="Sex" property="sex"/>
        <result column="Status" property="status"/>
        <result column="AddTime" property="addTime"/>
        <result column="UpdateTime" property="updateTime"/>
    </resultMap>

    <sql id="sql_select">
        select Id, Name, Age, Salary, Sex, Status, AddTime, UpdateTime from RUN_User
    </sql>

</mapper>

1、statement標籤:

select、update、delete、insert標籤,分別對應查詢、更新、刪除、新增操作

2、parameterType標籤:方法入參類型

(1)基本數據類型:

    <select id="queryUser" parameterType="long" resultMap="userMap">
        <include refid="sql_select"/>
        where status = 1 and id = #{userId}
    </select>

(2)String數據類型:

    <select id="queryUserByName" parameterType="string" resultMap="userMap">
        <include refid="sql_select"/>
        where status = 1 and name = #{name}
    </select>

(3)包裝類,通過id查詢:

    <select id="queryUserById" parameterType="java.lang.Long" resultMap="userMap">
        <include refid="sql_select"/>
        where status = 1 and id = #{userId}
    </select>

(4)JavaBean參數:

    <update id="updateUser" parameterType="userEntity">
        update RUN_User set name = #{userEntity.name}, age = #{userEntity.age}, salary = #{userEntity.salary}, sex = #{userEntity.sex}, status = 1
        where id = #{userEntity.id}
    </update>

3、resultType標籤:方法出參類型

(1)基本數據類型:

    <select id="queryCount" resultType="int">
        select count(id) from RUN_User where status = 1
    </select>

(2)包裝類型:

    <select id="queryCount" resultType="java.lang.Integer">
        select count(id) from RUN_User where status = 1
    </select>

(3)String類型:

    <select id="findNameById" parameterType="int" resultType="java.lang.String">
        select name from RUN_User where id = #{id}
    </select>

(4)JavaBean類型:

    <select id="queryUserById" parameterType="java.lang.Long" resultMap="userMap">
        <include refid="sql_select"/>
        where status = 1 and id = #{userId}
    </select>

4、級聯查詢

4.1 建表:班級表與學生表

CREATE TABLE `RUN_Class` (
  `Id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主鍵ID(班級)',
  `ClassName` varchar(256) NOT NULL COMMENT '班級名稱',
  `Status` tinyint(4) NOT NULL DEFAULT '1' COMMENT '有效=1,無效=-1',
  `AddTime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '添加時間',
  `UpdateTime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新時間',
  PRIMARY KEY (`Id`)
) ENGINE=InnoDB COMMENT='班級信息表';


CREATE TABLE `RUN_Student` (
  `Id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主鍵ID(學號)',
  `Name` varchar(256) NOT NULL DEFAULT '' COMMENT '姓名',
  `ClassId` int(11) NOT NULL COMMENT '班級',
  `Status` tinyint(4) NOT NULL DEFAULT '1' COMMENT '有效=1,無效=-1',
  `AddTime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '添加時間',
  `UpdateTime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新時間',
  PRIMARY KEY (`Id`)
) ENGINE=InnoDB COMMENT='學生信息表';

4.2 創建實體類

@Data
@AllArgsConstructor
@NoArgsConstructor
@ToString
public class ClassEntity implements Serializable {

    private static final long serialVersionUID = -3337804323389088625L;

    private int id;                                 //班級ID
    private String className;                       //班級名稱
    private int status;                             //是否有效(1:有效,-1:無效)
    private String addTime;                         //添加時間
    private String updateTime;                      //更新時間
    private List<StudentEntity> studentEntities;    //該班級中有哪些學生

}

@Data
@AllArgsConstructor
@NoArgsConstructor
@ToString
public class StudentEntity implements Serializable {

    private static final long serialVersionUID = -7497520016303190017L;

    private int id;                     //學號
    private String name;                //姓名
    private int classId;                //班級
    private int status;                 //是否有效(1:有效,-1:無效)
    private String addTime;             //添加時間
    private String updateTime;          //更新時間
    private ClassEntity classEntity;    //該學生屬於哪個班級
}

4.3 寫DAO層接口

public interface StudentRepository {
    StudentEntity queryStudent(@Param("id") int id);
    StudentEntity queryStudentWithClass(@Param("id") int id);
}

4.4 寫Mapper.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="com.wind.repository.StudentRepository">

    <resultMap id="studentMap" type="com.wind.entity.StudentEntity">
        <result column="Id" property="id"/>
        <result column="Name" property="name"/>
        <result column="ClassId" property="classId"/>
        <result column="Status" property="status"/>
        <result column="AddTime" property="addTime"/>
        <result column="UpdateTime" property="updateTime"/>
    </resultMap>

    <resultMap id="studentMap2" type="com.wind.entity.StudentEntity">
        <result column="Id" property="id"/>
        <result column="Name" property="name"/>
        <result column="ClassId" property="classId"/>
        <result column="Status" property="status"/>
        <result column="AddTime" property="addTime"/>
        <result column="UpdateTime" property="updateTime"/>
        <association property="classEntity" javaType="classEntity">
            <id column="cId" property="id"/>
            <result column="cClassName" property="className"/>
            <result column="cStatus" property="status"/>
        </association>
    </resultMap>

    <sql id="sql_select">
        select Id, Name, ClassId, Status, AddTime, UpdateTime from RUN_Student
    </sql>

    <select id="queryStudent" parameterType="int" resultMap="studentMap">
        <include refid="sql_select"/>
        where id = #{id} and status = 1
    </select>

    <select id="queryStudentWithClass" parameterType="int" resultMap="studentMap2">
        select r.Id, r.Name, r.ClassId, r.Status, r.AddTime, r.UpdateTime, c.id as cid, c.ClassName as cClassName, c.Status as cStatus
        from RUN_Student r join RUN_Class c on r.classId = c.id
        where r.id = #{id}
    </select>


</mapper>

4.5 把Mapper.xml文件註冊到MyBatis配置文件中

<?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>

    <typeAliases>
        <package name="com.wind.entity"/>
    </typeAliases>

    <!--配置mybatis運行環境-->
    <environments default="development">
        <environment id="development">
            <!--配置JDBC事務管理-->
            <transactionManager type="JDBC"></transactionManager>
            <!--配置POOLED類型的JDBC數據源連接池-->
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
                <property name="url"
                          value="jdbc:mysql://localhost:3306/RUNOOB?useUnicode=true&amp;characterEncoding=UTF-8"/>
                <property name="username" value="root"/>
                <property name="password" value="admin0001112"/>
            </dataSource>
        </environment>
    </environments>

    <!--註冊mapper文件-->
    <mappers>
        <mapper resource="com/entity/mapper/UserMapper.xml"/>
        <mapper resource="com/entity/mapper/UserRepository.xml"/>
        <mapper resource="com/entity/mapper/StudentRepository.xml"/>
    </mappers>

</configuration>

4.6 一對多查詢測試(從一到多):不帶java對象

public class UserTest3 {

    public static void main(String[] args) {
        //加載MyBatis配置文件
        InputStream inputStream = UserTest3.class.getClassLoader().getResourceAsStream("mybatis-config.xml");
        SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
        SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(inputStream);
        SqlSession sqlSession = sqlSessionFactory.openSession();

        //獲取實現接口的代理對象
        StudentRepository studentRepository = sqlSession.getMapper(StudentRepository.class);
        StudentEntity studentEntity = studentRepository.queryStudent(2);
        System.out.println(studentEntity);
        sqlSession.close();
    }
}

4.7 一對多查詢測試(從一到多):帶java對象

4.8 一對多查詢測試(從多到一)

public interface ClassRepository {
    ClassEntity queryClassByClassId(@Param("id") int id);
}
<?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="com.wind.repository.ClassRepository">

    <resultMap id="classStudentMap" type="com.wind.entity.ClassEntity">
        <result column="Id" property="id"/>
        <result column="ClassName" property="className"/>
        <result column="Status" property="status"/>
        <result column="AddTime" property="addTime"/>
        <result column="UpdateTime" property="updateTime"/>
        <collection property="studentEntities" ofType="com.wind.entity.StudentEntity">
            <result column="sId" property="id"/>
            <result column="sName" property="name"/>
            <result column="sClassId" property="classId"/>
            <result column="sStatus" property="status"/>
            <result column="sAddTime" property="addTime"/>
            <result column="sUpdateTime" property="updateTime"/>
        </collection>
    </resultMap>

    <sql id="sql_select_join_student">
        select c.Id, c.ClassName, c.Status, c.AddTime, c.UpdateTime,
        s.Id as sId, s.Name as sName, s.ClassId as sClassId, s.Status as sStatus, s.AddTime as sAddTime, s.UpdateTime as sUpdateTime
        from RUN_Class c join RUN_Student s on c.Id =  s.classId
    </sql>

    <select id="queryClassByClassId" parameterType="int" resultMap="classStudentMap">
        <include refid="sql_select_join_student"/>
        where c.id = #{id} and c.status = 1 and s.status =1
    </select>

</mapper>
public class UserTest3 {

    public static void main(String[] args) {
        //加載MyBatis配置文件
        InputStream inputStream = UserTest3.class.getClassLoader().getResourceAsStream("mybatis-config.xml");
        SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
        SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(inputStream);
        SqlSession sqlSession = sqlSessionFactory.openSession();

        //獲取實現接口的代理對象
        ClassRepository classRepository = sqlSession.getMapper(ClassRepository.class);
        ClassEntity classEntity = classRepository.queryClassByClassId(3);
        System.out.println(classEntity);
        sqlSession.close();
    }
}

4.9 多對多查詢:

(1)實體類 顧客:Customer。實體類 商品:Goods。

 @Data
 public class Customer {
     private long id;
     private String name;
     private List<Goods> goods;
}

@Data
 public class Goods {
     private long id;
     private String name;
     private List<Customer> customers;
}

(2)中間表:用來存儲顧客和商品之間的關係

@Data
 public class Custom_Goods {
     private long id;
     private long cid;
     private long gid;
}

(3)顧客接口:CustomerRepository

public interface CustomerRepository {
     public Customer findById(long id);
}

(4)顧客SQL語句:CustomerRepository.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="com.wind.repository.CustomerRepository">
     <resultMap id="customerMap" type="customer">
         <id column="cid" property="id"></id>
         <result column="cname" property="name"></result>
         <collection property="goods" ofType="goods">
             <id column="gid" property="id"/>
             <result column="gname" property="name"/>
         </collection>
     </resultMap>

     <select id="findById" parameterType="long" resultMap="customerMap">
         select c.id cid,c.name cname,g.id gid,g.name gname from customer c,goods
 g,customer_goods cg where c.id = #{id} and cg.cid = c.id and cg.gid = g.id
     </select>
</mapper>

(5)商品接口:GoodsRepository

public interface GoodsRepository {
     public Goods findById(long id);
}

(6)商品SQL語句:GoodsRepository.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="com.wind.repository.GoodsRepository">
     <resultMap id="goodsMap" type="gGoods">
         <id column="gid" property="id"></id>
         <result column="gname" property="name"></result>
         <collection property="customers" ofType="customer">
             <id column="cid" property="id"/>
             <result column="cname" property="name"/>
         </collection>
     </resultMap>

     <select id="findById" parameterType="long" resultMap="goodsMap">
         select c.id cid,c.name cname,g.id gid,g.name gname from customer c,goods
 g,customer_goods cg where g.id = #{id} and cg.cid = c.id and cg.gid = g.id
     </select>
</mapper>

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章