Mybatis介绍(一)

这里介绍的mybatis比较简单, 我做为一个初学者, 记录下个人在学习中方法, 如果那里出错, 希望读者朋友们见谅.

首先这里介绍一下我们下面用的表结构:

author表是保存了作者的个人信息, 因为我们在这里做测试, 所以就简单的定义几个字段.

blog表是保存谁写了博客的内容, 这里也是几个简单的字段.

comment表是保存对哪篇博客评论, 也是几个简单的字段.

注意: 这三张表的id都是自增型, 你也可以做其他的改变, 这里是为了方便.

下面给出了几张表格创建的sql语句:

CREATE TABLE `author` (
   `id` int(11) NOT NULL AUTO_INCREMENT,
   `name` varchar(25) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
   `age` int(5) NULL DEFAULT NULL,
   `email` varchar(30) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
   `country` varchar(10) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
   PRIMARY KEY (`id`) 
);

CREATE TABLE `blog` (
   `id` int(11) NOT NULL AUTO_INCREMENT,
   `authorid` int(11) NULL DEFAULT NULL,
   `title` varchar(35) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
   `mainbody` text CHARACTER SET utf8 COLLATE utf8_general_ci NULL,
   `creattime` varchar(70) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
   PRIMARY KEY (`id`) 
);

CREATE TABLE `comment` (
   `id` int(11) NOT NULL AUTO_INCREMENT,
   `blogid` int(11) NULL DEFAULT NULL,
   `content` text CHARACTER SET utf8 COLLATE utf8_general_ci NULL,
   `creattime` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
   PRIMARY KEY (`id`) 
);

 使用maven+springmvc+mabatis+spring搭建web环境, 可以参考博客: https://www.cnblogs.com/jay36/p/7762448.html, 这里就不详细的介绍了.

 这里主要介绍mybatis的用法, 首先使用Mybatis Generator生成pojo/dao/mapping三个文件, 即实体类、DAO接口和Mapping映射文件.

 可以参考博客:  https://blog.csdn.net/zhshulin/article/details/23912615, 下面就开始简单介绍Mybatis的使用.

 1.  看一下三个表pojo(Plain Ordinary Java Object), 即实体类

package com.springdemo.pojo;
public class Author {
    private Integer id;
    private String name;
    private Integer age;
    private String email;
    private String country; 
    /* getting and setting function */
}
package com.springdemo.pojo;
public class Blog {
    private Integer id;
    private Integer authorid;
    private String title;
    private String creattime;
    private String mainbody;
    /* getting and setting function */
}
package com.springdemo.pojo;
public class Comment {
    private Integer id;
    private Integer blogid;
    private String creattime;
    private String content;
    /* getting and setting function */
}
View Code

2.  再看一下三个表的dao(Data Access Object), 即dao接口

package com.springdemo.dao
public interface AuthorMapper {
    int deleteByPrimaryKey(Integer id);
    int insert(Author record);
    int insertSelective(Author record);
    Author selectByPrimaryKey(Integer id);
    int updateByPrimaryKeySelective(Author record);
    int updateByPrimaryKey(Author record);
}
package com.springdemo.dao
public interface BlogMapper {
    int deleteByPrimaryKey(Integer id);
    int insert(Blog record);
    int insertSelective(Blog record);
    Blog selectByPrimaryKey(Integer id);
    int updateByPrimaryKeySelective(Blog record);
    int updateByPrimaryKeyWithBLOBs(Blog record);
    int updateByPrimaryKey(Blog record);
}
package com.springdemo.dao
public interface CommentMapper {
    int deleteByPrimaryKey(Integer id);
    int insert(Comment record);
    int insertSelective(Comment record);
    Comment selectByPrimaryKey(Integer id);
    int updateByPrimaryKeySelective(Comment record);
    int updateByPrimaryKeyWithBLOBs(Comment record);
    int updateByPrimaryKey(Comment record);
}
View Code

3.  再看一下三个表的mapping, 即Mapping映射

<?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.springdemo.dao.AuthorMapper" >
  <resultMap id="BaseResultMap" type="com.springdemo.pojo.Author" >
    <id column="id" property="id" jdbcType="INTEGER" />
    <result column="name" property="name" jdbcType="VARCHAR" />
    <result column="age" property="age" jdbcType="INTEGER" />
    <result column="email" property="email" jdbcType="VARCHAR" />
    <result column="country" property="country" jdbcType="VARCHAR" />
  </resultMap>
  <sql id="Base_Column_List" >
    id, name, age, email, country
  </sql>
  <select id="selectByPrimaryKey" resultMap="BaseResultMap" parameterType="java.lang.Integer" >
    select 
    <include refid="Base_Column_List" />
    from author
    where id = #{id,jdbcType=INTEGER}
  </select>
  <delete id="deleteByPrimaryKey" parameterType="java.lang.Integer" >
    delete from author
    where id = #{id,jdbcType=INTEGER}
  </delete>
  <insert id="insert" parameterType="com.springdemo.pojo.Author" >
    insert into author (id, name, age, 
      email, country)
    values (#{id,jdbcType=INTEGER}, #{name,jdbcType=VARCHAR}, #{age,jdbcType=INTEGER}, 
      #{email,jdbcType=VARCHAR}, #{country,jdbcType=VARCHAR})
  </insert>
  <insert id="insertSelective" parameterType="com.springdemo.pojo.Author" >
    insert into author
    <trim prefix="(" suffix=")" suffixOverrides="," >
      <if test="id != null" >
        id,
      </if>
      <if test="name != null" >
        name,
      </if>
      <if test="age != null" >
        age,
      </if>
      <if test="email != null" >
        email,
      </if>
      <if test="country != null" >
        country,
      </if>
    </trim>
    <trim prefix="values (" suffix=")" suffixOverrides="," >
      <if test="id != null" >
        #{id,jdbcType=INTEGER},
      </if>
      <if test="name != null" >
        #{name,jdbcType=VARCHAR},
      </if>
      <if test="age != null" >
        #{age,jdbcType=INTEGER},
      </if>
      <if test="email != null" >
        #{email,jdbcType=VARCHAR},
      </if>
      <if test="country != null" >
        #{country,jdbcType=VARCHAR},
      </if>
    </trim>
  </insert>
  <update id="updateByPrimaryKeySelective" parameterType="com.springdemo.pojo.Author" >
    update author
    <set >
      <if test="name != null" >
        name = #{name,jdbcType=VARCHAR},
      </if>
      <if test="age != null" >
        age = #{age,jdbcType=INTEGER},
      </if>
      <if test="email != null" >
        email = #{email,jdbcType=VARCHAR},
      </if>
      <if test="country != null" >
        country = #{country,jdbcType=VARCHAR},
      </if>
    </set>
    where id = #{id,jdbcType=INTEGER}
  </update>
  <update id="updateByPrimaryKey" parameterType="com.springdemo.pojo.Author" >
    update author
    set name = #{name,jdbcType=VARCHAR},
      age = #{age,jdbcType=INTEGER},
      email = #{email,jdbcType=VARCHAR},
      country = #{country,jdbcType=VARCHAR}
    where id = #{id,jdbcType=INTEGER}
  </update>
</mapper>

<?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.springdemo.dao.BlogMapper" >
  <resultMap id="BaseResultMap" type="com.springdemo.pojo.Blog" >
    <id column="id" property="id" jdbcType="INTEGER" />
    <result column="authorid" property="authorid" jdbcType="INTEGER" />
    <result column="title" property="title" jdbcType="VARCHAR" />
    <result column="creattime" property="creattime" jdbcType="VARCHAR" />
  </resultMap>
  <resultMap id="ResultMapWithBLOBs" type="com.springdemo.pojo.Blog" extends="BaseResultMap" >
    <result column="mainbody" property="mainbody" jdbcType="LONGVARCHAR" />
  </resultMap>
  <sql id="Base_Column_List" >
    id, authorid, title, creattime
  </sql>
  <sql id="Blob_Column_List" >
    mainbody
  </sql>
  <select id="selectByPrimaryKey" resultMap="ResultMapWithBLOBs" parameterType="java.lang.Integer" >
    select 
    <include refid="Base_Column_List" />
    ,
    <include refid="Blob_Column_List" />
    from blog
    where id = #{id,jdbcType=INTEGER}
  </select>
  <delete id="deleteByPrimaryKey" parameterType="java.lang.Integer" >
    delete from blog
    where id = #{id,jdbcType=INTEGER}
  </delete>
  <insert id="insert" parameterType="com.springdemo.pojo.Blog" >
    insert into blog (id, authorid, title, 
      creattime, mainbody)
    values (#{id,jdbcType=INTEGER}, #{authorid,jdbcType=INTEGER}, #{title,jdbcType=VARCHAR}, 
      #{creattime,jdbcType=VARCHAR}, #{mainbody,jdbcType=LONGVARCHAR})
  </insert>
  <insert id="insertSelective" parameterType="com.springdemo.pojo.Blog" >
    insert into blog
    <trim prefix="(" suffix=")" suffixOverrides="," >
      <if test="id != null" >
        id,
      </if>
      <if test="authorid != null" >
        authorid,
      </if>
      <if test="title != null" >
        title,
      </if>
      <if test="creattime != null" >
        creattime,
      </if>
      <if test="mainbody != null" >
        mainbody,
      </if>
    </trim>
    <trim prefix="values (" suffix=")" suffixOverrides="," >
      <if test="id != null" >
        #{id,jdbcType=INTEGER},
      </if>
      <if test="authorid != null" >
        #{authorid,jdbcType=INTEGER},
      </if>
      <if test="title != null" >
        #{title,jdbcType=VARCHAR},
      </if>
      <if test="creattime != null" >
        #{creattime,jdbcType=VARCHAR},
      </if>
      <if test="mainbody != null" >
        #{mainbody,jdbcType=LONGVARCHAR},
      </if>
    </trim>
  </insert>
  <update id="updateByPrimaryKeySelective" parameterType="com.springdemo.pojo.Blog" >
    update blog
    <set >
      <if test="authorid != null" >
        authorid = #{authorid,jdbcType=INTEGER},
      </if>
      <if test="title != null" >
        title = #{title,jdbcType=VARCHAR},
      </if>
      <if test="creattime != null" >
        creattime = #{creattime,jdbcType=VARCHAR},
      </if>
      <if test="mainbody != null" >
        mainbody = #{mainbody,jdbcType=LONGVARCHAR},
      </if>
    </set>
    where id = #{id,jdbcType=INTEGER}
  </update>
  <update id="updateByPrimaryKeyWithBLOBs" parameterType="com.springdemo.pojo.Blog" >
    update blog
    set authorid = #{authorid,jdbcType=INTEGER},
      title = #{title,jdbcType=VARCHAR},
      creattime = #{creattime,jdbcType=VARCHAR},
      mainbody = #{mainbody,jdbcType=LONGVARCHAR}
    where id = #{id,jdbcType=INTEGER}
  </update>
  <update id="updateByPrimaryKey" parameterType="com.springdemo.pojo.Blog" >
    update blog
    set authorid = #{authorid,jdbcType=INTEGER},
      title = #{title,jdbcType=VARCHAR},
      creattime = #{creattime,jdbcType=VARCHAR}
    where id = #{id,jdbcType=INTEGER}
  </update>
</mapper>

<?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.springdemo.dao.CommentMapper" >
  <resultMap id="BaseResultMap" type="com.springdemo.pojo.Comment" >
    <id column="id" property="id" jdbcType="INTEGER" />
    <result column="blogid" property="blogid" jdbcType="INTEGER" />
    <result column="creattime" property="creattime" jdbcType="VARCHAR" />
  </resultMap>
  <resultMap id="ResultMapWithBLOBs" type="com.springdemo.pojo.Comment" extends="BaseResultMap" >
    <result column="content" property="content" jdbcType="LONGVARCHAR" />
  </resultMap>
  <sql id="Base_Column_List" >
    id, blogid, creattime
  </sql>
  <sql id="Blob_Column_List" >
    content
  </sql>
  <select id="selectByPrimaryKey" resultMap="ResultMapWithBLOBs" parameterType="java.lang.Integer" >
    select 
    <include refid="Base_Column_List" />
    ,
    <include refid="Blob_Column_List" />
    from comment
    where id = #{id,jdbcType=INTEGER}
  </select>
  <delete id="deleteByPrimaryKey" parameterType="java.lang.Integer" >
    delete from comment
    where id = #{id,jdbcType=INTEGER}
  </delete>
  <insert id="insert" parameterType="com.springdemo.pojo.Comment" >
    insert into comment (id, blogid, creattime, 
      content)
    values (#{id,jdbcType=INTEGER}, #{blogid,jdbcType=INTEGER}, #{creattime,jdbcType=VARCHAR}, 
      #{content,jdbcType=LONGVARCHAR})
  </insert>
  <insert id="insertSelective" parameterType="com.springdemo.pojo.Comment" >
    insert into comment
    <trim prefix="(" suffix=")" suffixOverrides="," >
      <if test="id != null" >
        id,
      </if>
      <if test="blogid != null" >
        blogid,
      </if>
      <if test="creattime != null" >
        creattime,
      </if>
      <if test="content != null" >
        content,
      </if>
    </trim>
    <trim prefix="values (" suffix=")" suffixOverrides="," >
      <if test="id != null" >
        #{id,jdbcType=INTEGER},
      </if>
      <if test="blogid != null" >
        #{blogid,jdbcType=INTEGER},
      </if>
      <if test="creattime != null" >
        #{creattime,jdbcType=VARCHAR},
      </if>
      <if test="content != null" >
        #{content,jdbcType=LONGVARCHAR},
      </if>
    </trim>
  </insert>
  <update id="updateByPrimaryKeySelective" parameterType="com.springdemo.pojo.Comment" >
    update comment
    <set >
      <if test="blogid != null" >
        blogid = #{blogid,jdbcType=INTEGER},
      </if>
      <if test="creattime != null" >
        creattime = #{creattime,jdbcType=VARCHAR},
      </if>
      <if test="content != null" >
        content = #{content,jdbcType=LONGVARCHAR},
      </if>
    </set>
    where id = #{id,jdbcType=INTEGER}
  </update>
  <update id="updateByPrimaryKeyWithBLOBs" parameterType="com.springdemo.pojo.Comment" >
    update comment
    set blogid = #{blogid,jdbcType=INTEGER},
      creattime = #{creattime,jdbcType=VARCHAR},
      content = #{content,jdbcType=LONGVARCHAR}
    where id = #{id,jdbcType=INTEGER}
  </update>
  <update id="updateByPrimaryKey" parameterType="com.springdemo.pojo.Comment" >
    update comment
    set blogid = #{blogid,jdbcType=INTEGER},
      creattime = #{creattime,jdbcType=VARCHAR}
    where id = #{id,jdbcType=INTEGER}
  </update>
</mapper>
View Code

mybatis的使用, 关键在于要要写好mapping映射, 使用工具生成的是最简单的curd的方法, 现在我们来增加一个我们自定义的方法.

首先在mapping的文件中写一个映射, 我们就在BlogMapper.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.springdemo.dao.BlogMapper" >
  ......
  <insert id="insertBlogByList" useGeneratedKeys="true"
    keyProperty="id" parameterType="java.util.List">
      insert into blog (authorid, title, creattime, mainbody) values
      <foreach item="item" collection="list" separator=",">
        (#{item.authorid,jdbcType=INTEGER}, #{item.title,jdbcType=VARCHAR}, 
        #{item.creattime,jdbcType=VARCHAR}, #{item.mainbody,jdbcType=LONGVARCHAR})
      </foreach>
  </insert>
  ...... 
</mapper>

这段xml的代码主要就是批量插入数据, 而且id是自增长的,  数据以list的形式传入进来, 然后循环插入到blog表中.

然后我们要在BlogMapper.java的dao中加一个接口, 代码如下:

package com.springdemo.dao;
public interface BlogMapper {
    ...... 
    int insertBlogByList(List<Blog> listBlog);
    ......
}
注意这里的接口名字要和我们之前在xml中加入的id值相同才行, 因为这样mybatis才会映射.
即在BlogMapper.xml中写的insert语句id是insertBlogByList,
那么这里的定义的接口必须也是这个, 而且参数的类型也必须一样, 这一点切记。

最后我们要在controller中去调用(因为这里我是用springmvc写的,所有用mvc思想去写调用,你也可以随便写一个方法去调用, 这里给出我的调用方法):

//下面是BlogController.java的代码
package com.springdemo.controller;

@Controller
@RequestMapping(value = "/blog")
public class BlogController {
    
    private static final Logger LOG = LogManager.getLogger();
    
    @Autowired
    private BlogService blogService;
        
   //这里是把前端的值获取到,然后再存入到数据库中, 最后返回状态
    @RequestMapping(value="/insert", method = RequestMethod.POST)
    public void insertBlog(HttpServletRequest request, HttpServletResponse response) {
        String status = "{"status":"failure"}";
        int authorid = Integer.parseInt(request.getParameter("authorid"));
        String title = String.valueOf(request.getParameter("title"));
        String mainbody = String.valueOf(request.getParameter("mainbody"));
            
        SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        Date now = new Date();
        String creattime = df.format(now);
        
        List<Blog> listBlog = new ArrayList<Blog>();
        Blog blog = new Blog();
        blog.setAuthorid(authorid);
        blog.setTitle(title);
        blog.setMainbody(mainbody);
        blog.setCreattime(creattime);
        listBlog.add(blog);
        
        int affectRow = blogService.insertBlogByList(listBlog);
        if (affectRow != 0) {
            status = "{"status":"success"}";
        }
        
        response.setContentType("text/html;UTF-8");
        try (PrintWriter writer = response.getWriter();) {
            writer.write(status);
            writer.flush();
        } catch (IOException e) {
            LOG.error(e.getMessage(), e);
        }
    }    
}

----------------------------------------------------------
// 下面是BlogService.java的代码
package com.springdemo.service;
import java.util.List;

// 这里不需要继承BlogMapper接口, 通过spring注解直接使用 @Service(value
="blogService") public class BlogService { @Resource private BlogMapper blogMapper; public int insertBlogByList(List<Blog> listBlog) { int affectRow = 0; affectRow = this.blogMapper.insertBlogByList(listBlog); return affectRow; } }

 这样就简单的完成了在xml中建立sql语句, 然后通过映射转换到java中, 最后去执行.

 待续......

原文地址:https://www.cnblogs.com/xumBlog/p/8861698.html