• MyBatis学习笔记3--使用XML配置SQL映射器


    <resultMap type="Student" id="StudentResult">

    <id property="id" column="id"/>

    <result property="name" column="name"/>

    <result property="age" column="age"/>

    </resultMap>

    注:resultMap中的property对应的是model中的属性,column对应的是数据库表中的列属性,整个代表一个结果的映射集合

    一.基本的SQL语句

    1.insert语句

    <insert id="add" parameterType="Student"  >

    insert into t_student values(null,#{name},#{age})

    </insert>

     

    2.update语句

    <update id="update" parameterType="Student">

    update t_student set name=#{name},age=#{age} where id=#{id}

    </update>

     

    3.delete语句

    <delete id="delete" parameterType="Integer">

    delete from t_student where id=#{id}

    </delete>

     

    4.select语句

    <select id="findById" parameterType="Integer" resultType="Student">

    select * from t_student where id=#{id}

    </select>

     

    <select id="find" resultMap="StudentResult">

    select * from t_student

    </select>

     

    接口中的方法如下所示:

    public interface StudentMapper {

     

    public int add(Student student);

     

    public int update(Student student);

     

    public int delete(Integer id);

     

    public Student findById(Integer id);

     

    public List<Student> find();

    }

     

    注:以上语句中的id表示表示mapper接口中的方法,须与接口中的方法名一致。

    select语句中的resultType表示结果的返回类型,也可以用resultMap来表示,下面说一说这两者的区别:

     

    MyBatis中在查询进行select映射的时候,返回类型可以用resultType,也可以用resultMap,resultType是直接表示返回类型的,而resultMap则是对外部ResultMap的引用,但是resultType跟resultMap不能同时存在。

    在MyBatis进行查询映射时,其实查询出来的每一个属性都是放在一个对应的Map里面的,其中键是属性名,值则是其对应的值。

    ①当提供的返回类型属性是resultType时,MyBatis会将Map里面的键值对取出赋给resultType所指定的对象对应的属性。所以其实MyBatis的每一个查询映射的返回类型都是ResultMap,只是当提供的返回类型属性是resultType的时候,MyBatis对自动的给把对应的值赋给resultType所指定对象的属性。

    ②当提供的返回类型是resultMap时,因为Map不能很好表示领域模型,就需要自己再进一步的把它转化为对应的对象,这常常在复杂查询中很有作用。

     

    二.Mybatis关系映射

    1.一对一关系实现

    为了方便讲述,在t_student表的基础上增加了t_address表,来作一对一的关系映射。

    表结构如下:

    CREATE TABLE `t_address` (

      `id` int(11) NOT NULL AUTO_INCREMENT,

      `sheng` varchar(20) DEFAULT NULL,

      `shi` varchar(20) DEFAULT NULL,

      `qu` varchar(20) DEFAULT NULL,

      PRIMARY KEY (`id`)

    ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;

    通常用association属性来表示一对一的关系实现

    在resultMap中起嵌入asociation属性,表示将student表与address表关联起来

    一般写作如下形式:

    <resultMap type="Student" id="StudentResult">

    <id property="id" column="id"/>

    <result property="name" column="name"/>

    <result property="age" column="age"/>

    <association property="address" javaType="Address">

    <result property="id" column="id"/>

    <result property="sheng" column="sheng"/>

    <result property="shi" column="shi"/>

    <result property="qu" column="qu"/>

    </association>

    </resultMap>

    这种方式就不需要addressMapper.xml文件了

    但是当关联的表较多时就显得复杂了,因此一般写作如下形式

    <resultMap type="Student" id="StudentResult">

    <id property="id" column="id"/>

    <result property="name" column="name"/>

    <result property="age" column="age"/>

    <association property="address" column="id" select="com.java1234.mappers.AddressMapper.findById">                         </association>

    </resultMap>

    通过这样的方式需要定义addressMapper接口如下:

    public interface AddressMapper {

     

    public Address findById(Integer id);

     

    }

    XML文件如下

    <resultMap type="Address" id="AddressResult">

    <result property="id" column="id"/>

    <result property="sheng" column="sheng"/>

    <result property="shi" column="shi"/>

    <result property="qu" column="qu"/>

    </resultMap>

     

    <select id="findById" parameterType="Integer" resultType="Address">

    select * from t_address where id=#{id}

    </select>

    这样就可以<association property="address" column="id" select="com.java1234.mappers.AddressMapper.findById">                         </association>将address的属性表示出来了。

    一个简单的查询例子如下:

    <select id="findStudentWithAddress" resultMap="StudentResult" parameterType="Integer">

    select * from t_student t1,t_address t2 where t1.addressId=t2.id and t1.id=#{id}

    </select>

     

    2.一对多关系实现

    为了方便讲述,在t_student表的基础上增加了t_grade表,来作一对多的关系映射,即一个grade里有多个student。

    表结构如下:

    CREATE TABLE `t_grade` (

      `id` int(11) NOT NULL AUTO_INCREMENT,

      `gradeName` varchar(20) DEFAULT NULL,

      PRIMARY KEY (`id`)

    ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;

     

    insert  into `t_grade`(`id`,`gradeName`) values (1,'大学一年级'),(2,'大学二年级');

    通常用collection属性来表示一对多的关系实现

    gradeMapper.xml文件的resultMap中起嵌入collection属性,表示将student表与grade表关联起来

    如下所示:

    <mapper namespace="com.java1234.mappers.GradeMapper">

     

    <resultMap type="Grade" id="GradeResult">

    <result property="id" column="id"/>

    <result property="gradeName" column="gradeName"/>

    <collection property="students" column="id" select="com.java1234.mappers.StudentMapper.findByGradeId"></collection>

    </resultMap>

     

    <select id="findById" parameterType="Integer" resultMap="GradeResult">

    select * from t_grade where id=#{id}

    </select>

     

    </mapper>

     

    StudentMppaer.xml文件如下:

    <resultMap type="Student" id="StudentResult">

    <id property="id" column="id"/>

    <result property="name" column="name"/>

    <result property="age" column="age"/>

    <association property="address" column="id" select="com.java1234.mappers.AddressMapper.findById">   </association>

    <association property="grade" column="gradeId" select="com.java1234.mappers.GradeMapper.findById"></association>

    </resultMap>

     

    一个简单的查询例子如下:

    <select id="findByGradeId" resultMap="StudentResult" parameterType="Integer">

    select * from t_student where gradeId=#{gradeId}

    </select>

     

  • 相关阅读:
    Spring Cloud Bus 消息总线介绍
    工商银行分布式服务 C10K 场景解决方案
    关于写好文章的3个心法和5点技巧
    混合云K8s容器化应用弹性伸缩实战
    云原生下的灰度体系建设
    被解救的代码
    【2020-10-22】我是否一个真正靠谱的人
    【2020-10-21】以谦虚与忍耐去期待豁然与贯通
    【2020-10-20】压力也是一种感受,用心体会
    【2020-10-19】不断试错的过程
  • 原文地址:https://www.cnblogs.com/zhuchuanliang/p/7859920.html
Copyright © 2020-2023  润新知