zoukankan      html  css  js  c++  java
  • 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>

     2.配置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文件夹下。

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

    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已完成

  • 相关阅读:
    [leetcode-648-Replace Words]
    [leetcode-647-Palindromic Substrings]
    [leetcode-646-Maximum Length of Pair Chain]
    [leetcode-645-Set Mismatch]
    [leetcode-459-Repeated Substring Pattern]
    [leetcode-636-Exclusive Time of Functions]
    [leetcode-644-Maximum Average Subarray II]
    iOS开发之使用XMPPFramework实现即时通信(三)
    Oracle 内置sql函数大全
    Oracle 中的sql函数以及分页
  • 原文地址:https://www.cnblogs.com/huxiaoguang/p/10847112.html
Copyright © 2011-2022 走看看