Spring Boot 整合Mybatis 框架以及使用

一:MyBatis 简介

  MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生类型、接口和 Java 的 POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录.

MyBatis: 官方中文网址:http://www.mybatis.org/mybatis-3/zh/
MyBatis:项目网址:https://github.com/mybatis/mybatis-3

MyBatis的有点和缺点:

优点:

1.使用SQL语法,入手简单易学,能够优化SQL语句,能了解底层组装过程。
2.SQL语句封装在配置文件中,方便统一维护和管理,程序调试方便,降低了程序使用的耦合度。
3.与传统JDBC方式比较,少了大量的代码,是最简单的持久化框架。
4.SQL代码从程序代码中彻底分离,可重用,增强了项目中的分工。
5.所有SQL语句,全部定义在xml中,也可以通过注解SQL的方式在接口上实现, 官方推荐使用XML方式。

缺点:
1.SQL工作量很大,尤其是字段多、关联表多时,更是如此。
2.SQL语句依赖程度很高,并且属于半自动化,数据库移植比较麻烦,比如mysql数据库编程Oracle数据库,部分的sql语句需要调整。

二:MyBatis的使用

1、引入MyBatis依赖包
打开pom.xml文件加入,如下代码:

<dependency>
    <groupId>org.mybatis.spring.boot</groupId>
    <artifactId>mybatis-spring-boot-starter</artifactId>
    <version>1.3.2</version>
</dependency>

 mysql 驱动包

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <scope>runtime</scope>
</dependency>

2、添加数据配置信息

打开application.yml 文件,添加如下配置(对应自己的数据链接配置):

spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://127.0.0.1:3306/larblog?serverTimezone=UTC&useSSL=false
    username: root
    password: 123456

 

3、配置MyBatis参数

我这里使用yml配置文件,打开application.yml文件加入,如下代码:

mybatis:
  type-aliases-package: main.blog.entity
  mapper-locations: classpath:mapping/*.xml
  #或
  mapper-locations: classpath:mapper/*.xml

 

type-aliases-package:表示entity实体类文件路径
mapper-locations:表示mapper文件路径或者dao接口路径,其中mapper可以有两种读取方法,这两种方法的优缺点暂时不讨论,一种是使用Resources读取配置文件,在resource新建文件下mapping,另外一种放在mapper文件夹下。

4、创建项目文件夹编写程序
在项目下分别创建包controller、entity、mapper、service、dao,在resources下创建mapping文件夹,MyBatis的使用方法有两种,一种使用注解SQL的方式,另一种使用mapper编写SQL语句的方式,我这里使用官方推荐的mapper的方式。

以下代码可通过代码生成器生成,如:EasyCode

1). 在BootApplication增加MapperScan扫描,代码如下:

@SpringBootApplication
@MapperScan("main.blog.mapper")
public class BootApplication {

    public static void main(String[] args) {
        SpringApplication.run(BootApplication.class, args);
    }
}

 2). 使用SQL语句新建表,并建立对应的实体类,代码如下:

#文章表:
CREATE TABLE `fa_article` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID',
  `category_id` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '分类ID',
  `title` varchar(50) NOT NULL DEFAULT '' COMMENT '标题',
  `author` varchar(20) DEFAULT NULL,
  `from` varchar(50) DEFAULT NULL,
  `image` varchar(100) NOT NULL DEFAULT '' COMMENT '图片',
  `keywords` varchar(255) NOT NULL DEFAULT '' COMMENT '关键字',
  `content` text NOT NULL COMMENT '内容',
  `description` varchar(255) NOT NULL DEFAULT '' COMMENT '描述',
  `views` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '点击',
  `comments` varchar(20) NOT NULL DEFAULT '0000-00-00 00:00:00' COMMENT '评论数',
  `createtime` datetime NOT NULL DEFAULT '0000-00-00 00:00:00' COMMENT '创建时间',
  `updatetime` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00' ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  `weigh` int(10) NOT NULL DEFAULT '0' COMMENT '权重',
  `status` enum('normal','hidden') NOT NULL DEFAULT 'normal' COMMENT '状态',
  `istop` enum('hidden','normal') NOT NULL,
  `iscomment` enum('hidden','normal') NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=32 DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT COMMENT='文章表';

#文章分类:
CREATE TABLE `fa_category` (
    `id`  int(10) UNSIGNED NOT NULL AUTO_INCREMENT ,
    `pid`  int(10) UNSIGNED NOT NULL DEFAULT 0 COMMENT '父ID' ,
    `name`  varchar(30) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '' ,
    `isnav`  int(10) NOT NULL DEFAULT 0 COMMENT '是否导航' ,
    `keywords`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '' COMMENT '关键字' ,
    `description`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '' COMMENT '描述' ,
    `diyname`  varchar(30) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '' COMMENT '自定义名称' ,
    `updatetime`  datetime NOT NULL DEFAULT '0000-00-00 00:00:00' COMMENT '更新时间' ,
    `status`  varchar(30) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '' COMMENT '状态' ,
    PRIMARY KEY (`id`),
    INDEX `weigh` (`id`) USING BTREE ,
    INDEX `pid` (`pid`) USING BTREE 
)

在entity文件下新建:Article.java 代码如下:

package main.blog.entity;

import java.util.Date;

import javax.validation.constraints.Min;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Past;

import org.springframework.format.annotation.DateTimeFormat;
import lombok.Data;

@Data
public class Article 
{
    private int  id;
    
    @Min(value = 1, message = "请选择文章分类!")
    private Integer  category_id;
    
    @NotEmpty(message = "文章标题不能为空")
    private String   title;
    
    @NotEmpty(message = "文章作者不能为空")
    private String   author;
    private String   from;
    
    @NotEmpty(message = "文章内容不能为空")
    private String   content;
    private String   image;
    
    @NotEmpty(message = "标签不能为空")
    private String   keywords;
    
    @NotEmpty(message = "文章简介不能为空")
    private String   description;
    private int      views;
    private int      comments;
    
    @NotNull(message = "创建日期不能为空!")
    @Past(message     = "创建日期不能大于现在时间")
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private Date     createtime;
    
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private Date     updatetime;
    
    private String   weigh;
    private String   status;
    private String   cname;
    private String   istop;
    private String   iscomment;
}

我这里使用的是Lombok插件,省去了get、set、toString方法,Lombok插件的使用请参考:https://www.cnblogs.com/huxiaoguang/p/10805612.html

3). 在mapping文件下新建Mapper映射文件AdminMapper.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="main.blog.mapper.ArticleMapper">
    
    <!--最新文章 -->
    <select id="newArticle" parameterType="int" resultType="main.blog.entity.Article">
        select * from fa_article where status = 'normal' order by id desc limit #{limit}
    </select>
    
    <!--文章列表 -->
    <select id="listArticle" parameterType="map" resultType="main.blog.entity.Article">
        select a.*,c.name as cname from fa_article as a left join fa_category as c on a.category_id = c.id
        <where>
                <if test="title != null">
                    and    a.title LIKE concat('%',#{title},'%') or a.keywords LIKE concat('%',#{title},'%') or a.description LIKE concat('%',#{title},'%')
                </if>
                <if test="keywords!=null">
                    and    a.keywords LIKE concat('%',#{keywords},'%')
                </if>
                <if test="cname != null">
                    and c.diyname='${cname}'
                </if>
                <if test="category_id != null">
                    and a.category_id=${category_id}
                </if>
        </where>
        order by a.id desc
    </select>
</mapper>

4). 在mapper文件夹下新建:ArticleMapper.java 代码如下:

package main.blog.mapper;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.springframework.stereotype.Repository;

import main.blog.entity.Article;

@Repository
public interface ArticleMapper {
    
    //最新文章列表
    public List<Article> newArticle(int limit);
    
    //文章列表
    public List<Article> listArticle(Map<String, Object> param);
}

 5). 在server文件夹下新建ArticleService.java服务层

package main.blog.service;

import java.util.List;
import java.util.Map;

import main.blog.entity.Article;

public interface ArticleService {
    
    //最新文章
    public List<Article> newArticle(int limit);
    
    //文章列表
    public List<Article> listArticle(Map<String, Object> param);    
}

6). 在server/impl下ArticleServiceImpl.java服务层实现接口,代码如下:

package main.blog.service.impl;

import java.util.List;
import java.util.Map;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import main.blog.entity.Article;
import main.blog.mapper.ArticleMapper;
import main.blog.service.ArticleService;

@Service("articleService") 
public class ArticleServiceImpl implements ArticleService
{    
    @Autowired  
    private ArticleMapper articleMapper;  
    
    @Override
    public List<Article> newArticle(int limit) 
    {
        List<Article> list = articleMapper.newArticle(limit);
        return list;
    }
    
    @Override
    public List<Article> listArticle(Map<String, Object> param) 
    {    
        List<Article> list = articleMapper.listArticle(param);
        return list;
    }
}

7). 在controller下新建ArticleController.java,调用服务层接口,代码如下:

package main.blog.controller.home;

import java.util.HashMap;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;

import main.blog.entity.Article;
import main.blog.service.ArticleService;

@Controller("home/Article")
public class ArticleController extends HomeController
{
    @Autowired
    private ArticleService articleService;//自动装载Service接口
    
    /**
     * 分类文章列表
     * @return string
     */
    @ResponseBody
    @RequestMapping(value="/category/{cname}")
    public String category(@PathVariable("cname")String cname, HttpServletRequest request) throws Exception
    {
        JSONObject json = new JSONObject();
        
        if(cname!=null)
        {
            Map<String, Object> param = new HashMap<String, Object>();
            param.put("cname", cname);
            
            List<Article> list = articleService.listArticle(param);
            
            if(null==list)
            {
                json.put("status", 204);
                json.put("msg",  "获取数据成功");
                json.put("data", "");
            }else{
                json.put("status", 200);
                json.put("msg",  "获取数据成功");
                json.put("data", list);
            }
        }
        
        return json;
    }
}

到此Springboot整合Mybatis已完成

 

posted @ 2019-05-10 22:37  小武汉  阅读(451)  评论(0编辑  收藏  举报