Spring Boot(三)--- Mybatis

来源:互联网 发布:国家安全网络领导小组 编辑:程序博客网 时间:2024/05/15 18:37

MyBatis 表操作

1 、定义操作接口

package com.xykj.weibo.mapper;import org.apache.ibatis.annotations.Mapper;import org.apache.ibatis.annotations.Param;import com.xykj.weibo.model.Article;@Mapperpublic interface ArticleMapper {    /**    *  根据 id 获取文章    * @param id    * @return    */    public Article getArticle(@Param("id") Integer id);    /**    *  删除文章    * @param id    * @return    */    public Integer deleteArticle(@Param("id") Integer id);}

2 、定义该操作接口的具体实现,直接在 src/main/resource 创建跟接口包名一样的包结构,定义 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.xykj.weibo.mapper.ArticleMapper" >    <select id="getArticle" parameterType="int" resultMap="ResultArticle">        select * from article where _id=#{id}    </select>    <resultMap type="com.xykj.weibo.model.Article" id="ResultArticle">        <id property="id" column="_id"/>        <result property="title" column="title"/>        <result property="content" column="content"/>        <result property="pubTime" column="pub_time"/>        <result property="userId" column="user_id"/>    </resultMap></mapper>

其中 mapper 标签中的 namespace 必须指向具体的接口位置, select 表示针对一个方法的查询操作 id 跟接口的方法名一样, parameterType 跟接口方法的参数
类型一致 ,resultMap 查询结果的对应关系需要关联一个 resultMap 标签

3 、使用

@RestControllerpublic class ArticleController {    @Autowired    ArticleMapper articleMapper;    @RequestMapping("/getArticle")    public String getArticleById(Integer id) {        Article a = articleMapper.getArticle(id);        if (a != null) {            String str = JSON.toJSONString(a);            return str;        }        return "null";    }}

@Autowired 表示自动注入,可以获取到接口对象

xml 配置中的删除、修改、增加

<delete id="deleteArticle" parameterType="int">    delete from article    where _id=#{id}</delete><insert id="addArticle" parameterType="com.xykj.weibo.model.Article"    useGeneratedKeys="true" keyProperty="id">    insert into    article(title,content,pub_time,user_id) values    (#{title},#{content},#{pubTime},#{userId})</insert>useGeneratedKeys 表示使用自动递增的 key 作为对象的某个属性keyProperty 表中自增键对应的属性名<update id="updateArticle" parameterType="com.xykj.weibo.model.Article">update article set    title=#{title},content=#{content},pub_time=#{pubTime},user_id=#{userId}    where _id=#{id}</update>

配置多表查询,可以在解析结果中针对单个其他表的内容使用 association 标签来配置

java 中模型类

public class Article {    private int id;    private String title;    private String content;    private String pubTime;    private int userId;    // 自定义对象    private User user;    ...}

xml 配置

<select id="getArticle" parameterType="int" resultMap="ResultArticle">select    a._id,a.title,a.content,a.pub_time,a.user_id,u._id as    uId,u.name,u.sex,u.sign,u.photo,u.age    from article a left join users u    on a.user_id=u._id where    a._id=#{id}</select><resultMap type="com.xykj.weibo.model.Article" id="ResultArticle">    <id property="id" column="_id" />    <result property="title" column="title" />    <result property="content" column="content" />    <result property="pubTime" column="pub_time" />    <result property="userId" column="user_id" />    <association property="user" column="user_id"        javaType="com.xykj.weibo.model.User">        <id property="id" column="uId"/>        <result property="name" column="name"/>        <result property="sex" column="sex"/>        <result property="sign" column="sign"/>        <result property="photo" column="photo"/>        <result property="age" column="age"/>    </association></resultMap>

多表查询中获取集合,如:一篇文章可以有多个标签,数据库新增了一个标签表 tags 以及标签和文章的关系表 articletags ,如果已经查询到文章信息,那么需要通过文章的 id 到 article_tags 表中查询出标签 id 然后再使用标签的 id 到 tags 表中获取所有标签

Tag 标签类:

public class Tag {    private int id;    private String name;    private int creatorId;    ...}

文章类中新增标签的声明

public class Article {    private int id;    private String title;    private String content;    private String pubTime;    private int userId;    // 自定义对象    private User user;    // 文章中的标签    private List<Tag> tags;    ...}

针对标签操作定义了操作接口 TagMapper 和实现的 xml 配置

@Mapperpublic interface TagMapper {    /**    *  根据文章 id 获取所有的标签信息    *    * @param id    * @return    */    public List<Tag> getTagByArticleId(@Param("article_id") Integer 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.xykj.weibo.mapper.TagMapper">    <select id="getTagByArticleId" parameterType="int" resultMap="tagResult">        select * from tags where _id in (select tag_id from article_tags where        article_id=#{article_id})    </select>    <resultMap type="com.xykj.weibo.model.Tag" id="tagResult">        <id property="id" column="_id" />        <result property="name" column="name" />        <result property="creatorId" column="creator" />    </resultMap></mapper>

文章查询中添加标签的查询

在 resultMap 中新增 collection 标签关联<resultMap type="com.xykj.weibo.model.Article" id="ResultArticle">    ...    <association property="user" column="user_id"        javaType="com.xykj.weibo.model.User">        ...    </association>    <collection property="tags" ofType="com.xykj.weibo.model.Tag"        column="_id" select="com.xykj.weibo.mapper.TagMapper.getTagByArticleId">    </collection></resultMap>
原创粉丝点击