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