博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
MP实战系列(一)之入门框架搭建和使用
阅读量:6535 次
发布时间:2019-06-24

本文共 29398 字,大约阅读时间需要 97 分钟。

mybatis plus官网:https://github.com/baomidou/mybatis-plus

上面有对应的实际例子,直接导入即可用。

mybatis plus官方的怎么介绍,我就不在这里多说了,大家进入上方网址即可。

不过在此说明,mybatis plus绝对非常好用,比mybatis generator还好用,虽然mybatis逆向工程单表增删改查自动生成,不过我觉得它生成的动态sql和一些QueryVo之类的太不友好了。而mybatis plus只需继承,Dao继承BaseMapper<T>,Service继承IService<T>,Service实现类继承ServiceImpl<DAO,T>并实现Service,然后在src/main/resource下只需保留一个mybatis放置的xml文件即可,里面什么resultMap都不需要写,一片空白即可,除非特殊的需求,需要多个实体管理,一多对,多对多等。对于有mybatis的基础学习mybatis plus是非常简单的。不过初学者导入官网项目试着运行跑起来后,切不可抱着运行没问题或者是效果出的来就不管了,官方文档还是要看的。虽然说这个文档没有面面俱到,不过让你心中有个数或有个大概,这样对于以后学习还是非常有帮助的。

pom的依赖和spring+springmvc+mybatis其实也差不多,这里的mybaits plus依赖其实里面也封装了mybatis

下面的spring和mybatis的xml配置文件,除了mybatis plus加入一部分有点区别于之前的ssm配置,不过大致还是一样的。复制过来,修改即用。

运行环境:maven+jdk8+eclipse+window10(ubun16.04没问题)+tomcat8

项目中使用mybatis plus早就想写总结了,我希望将我遇见的问题或者是使用的感受与大家一起分享

所以才决定写一个这系列的文章,一来总结,二来分享 

 下面演示示例加上个人见解

pom文件:

4.0.0
com.lms.demo
LMS
war
1.0-SNAPSHOT
UTF-8
UTF-8
UTF-8
4.3.13.RELEASE
4.12
1.1.0
1.2.8
2.1.8
5.1.38
1.2.17
1.7.19
1.8.8
1.3.1
1.2
2.5
1.3.1
2.56
20170516
5.5.1
3.14
junit
junit
${junit.version}
test
javax.servlet.jsp
jsp-api
2.1
compile
javax.servlet
javax.servlet-api
3.1.0
compile
org.springframework
spring-core
${spring.version}
jar
compile
org.springframework
spring-context
${spring.version}
jar
compile
org.springframework
spring-context-support
${spring.version}
jar
compile
org.springframework
spring-tx
${spring.version}
jar
compile
org.springframework
spring-test
${spring.version}
compile
org.springframework
spring-aop
${spring.version}
jar
compile
org.springframework
spring-beans
${spring.version}
jar
compile
org.springframework
spring-jdbc
${spring.version}
jar
compile
org.springframework
spring-web
${spring.version}
jar
compile
org.springframework
spring-webmvc
${spring.version}
jar
compile
org.aspectj
aspectjweaver
${aspectjweaver.version}
commons-fileupload
commons-fileupload
${fileupload.version}
javax.servlet
jstl
${jstl.version}
com.baomidou
mybatis-plus
${mybaitsplus.version}
mysql
mysql-connector-java
${mysql.version}
com.alibaba
druid
${druid.version}
com.alibaba
fastjson
${fastjson.version}
log4j
log4j
${log4j.version}
org.slf4j
slf4j-api
${slf4j.version}
org.slf4j
slf4j-log4j12
${slf4j.version}
org.apache.commons
commons-lang3
3.3.2
commons-io
commons-io
${commons-io.version}
de.ruedigermoeller
fst
${ruedigermoeller-fst.version}
commons-codec
commons-codec
1.10
commons-beanutils
commons-beanutils
1.9.3
org.json
json
20170516
org.apache.commons
commons-email
1.4
javax.activation
activation
1.1.1
com.google.zxing
core
3.3.0
com.google.zxing
javase
3.3.0
eu.bitwalker
UserAgentUtils
1.20
org.apache.httpcomponents
httpclient
4.5.3
org.jsoup
jsoup
1.9.1
com.drewnoakes
metadata-extractor
2.9.1
net.coobird
thumbnailator
0.4.8
com.bladejava
blade-patchca
1.0.5
com.fasterxml.jackson.core
jackson-core
2.9.4
com.fasterxml.jackson.core
jackson-databind
2.9.5
com.fasterxml.jackson.dataformat
jackson-dataformat-xml
2.9.5
dom4j
dom4j
1.6.1
jaxen
jaxen
1.1.6
org.yaml
snakeyaml
1.17
net.sf.dozer
dozer
${dozer.version}
org.apache.poi
poi
${poi.version}
commons-codec
commons-codec
org.apache.poi
poi-ooxml
${poi.version}
org.apache.poi
poi-ooxml-schemas
${poi.version}
org.apache.poi
poi-scratchpad
${poi.version}
com.belerweb
pinyin4j
2.5.0
org.apache.ant
ant
1.9.7
net.sf.jmimemagic
jmimemagic
0.1.3
xerces
xercesImpl
org.codehaus.jackson
jackson-xc
org.codehaus.jackson
jackson-jaxrs
log4j
log4j
com.squareup.okhttp3
okhttp
3.9.1
com.squareup.okio
okio
1.13.0
com.mangofactory
swagger-springmvc
1.0.2
org.apache.maven.plugins
maven-compiler-plugin
1.8
1.8
${project.artifactId}
aliyun-repos
Aliyun Repository
http://maven.aliyun.com/nexus/content/groups/public
true
false
aliyun-repos
Aliyun Repository
http://maven.aliyun.com/nexus/content/groups/public
true
false

 

 mybatis-config.xml

 

spring-mvc.xml

text/html;charset=UTF-8
application/json;charset=UTF-8

 

spring-mybatis.xml

com.lms.service.*
com.lms.controller.*

 

spring.xml

 

config.properties

validationQuery=SELECT 1jdbc_url=jdbc:mysql://127.0.0.1:3306/lms?useUnicode=true&characterEncoding=UTF-8jdbc_username=rootjdbc_password=1234

log4j.properties(本地调式环境使用DeBug,DeBug打印日志更为详细,生产环境建议日志级别使用Info)

log4j.rootLogger=DEBUG,CONSOLE,Alog4j.addivity.org.apache=falselog4j.appender.CONSOLE=org.apache.log4j.ConsoleAppenderlog4j.appender.CONSOLE.Threshold=DEBUGlog4j.appender.CONSOLE.layout.ConversionPattern=%d{yyyy-MM-dd HH\:mm\:ss} -%-4r [%t] %-5p  %x - %m%nlog4j.appender.CONSOLE.Target=System.out#log4j.appender.CONSOLE.charset=utf-8log4j.appender.CONSOLE.encoding=utf-8log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayoutlog4j.appender.A=org.apache.log4j.DailyRollingFileAppenderlog4j.appender.A.File=${catalina.home}/logs/yo_log/PurePro_log4j.appender.A.DatePattern=yyyy-MM-dd'.log'log4j.appender.A.layout=org.apache.log4j.PatternLayoutlog4j.appender.A.layout.ConversionPattern=[FH_sys]  %d{yyyy-MM-dd HH\:mm\:ss} %5p %c{1}\:%L \: %m%nlog4j.logger.java.sql.ResultSet=INFOlog4j.logger.org.apache=DEBUGlog4j.logger.java.sql.Connection=DEBUGlog4j.logger.java.sql.Statement=DEBUGlog4j.logger.java.sql.PreparedStatement=DEBUG

实体类:

package com.lms.entity;import com.baomidou.mybatisplus.annotations.TableField;import com.baomidou.mybatisplus.annotations.TableId;import com.baomidou.mybatisplus.annotations.TableName;import java.io.Serializable;import java.util.Date;/** * lms系统用户基本信息表 *  * @author youcong * @date 2018-04-20 19:30:29 */@TableName("user")public class UserEntity implements Serializable {    private static final long serialVersionUID = 1L;    /**     *      */    @TableId    private Integer id;    /**     * 用户id     */    @TableField("user_id")    private String userId;    /**     * 系统分配昵称     */    @TableField("nick_name")    private String nickName;    /**     * 真实姓名     */    @TableField("real_name")    private String realName;    /**     * 手机号     */    private String mobile;    /**     * 邮箱     */    private String email;    /**     *      */    @TableField("sms_signature")    private String smsSignature;    /**     * 头像     */    private String icon;    /**     * 性别     */    private Integer gender;    /**     * 证件号     */    @TableField("idcard_no")    private String idcardNo;    /**     * 设置:     */    public void setId(Integer id) {        this.id = id;    }    /**     * 获取:     */    public Integer getId() {        return id;    }    /**     * 设置:用户id     */    public void setUserId(String userId) {        this.userId = userId;    }    /**     * 获取:用户id     */    public String getUserId() {        return userId;    }    /**     * 设置:系统分配昵称     */    public void setNickName(String nickName) {        this.nickName = nickName;    }    /**     * 获取:系统分配昵称     */    public String getNickName() {        return nickName;    }    /**     * 设置:真实姓名     */    public void setRealName(String realName) {        this.realName = realName;    }    /**     * 获取:真实姓名     */    public String getRealName() {        return realName;    }    /**     * 设置:手机号     */    public void setMobile(String mobile) {        this.mobile = mobile;    }    /**     * 获取:手机号     */    public String getMobile() {        return mobile;    }    /**     * 设置:邮箱     */    public void setEmail(String email) {        this.email = email;    }    /**     * 获取:邮箱     */    public String getEmail() {        return email;    }    /**     * 设置:     */    public void setSmsSignature(String smsSignature) {        this.smsSignature = smsSignature;    }    /**     * 获取:     */    public String getSmsSignature() {        return smsSignature;    }    /**     * 设置:头像     */    public void setIcon(String icon) {        this.icon = icon;    }    /**     * 获取:头像     */    public String getIcon() {        return icon;    }    /**     * 设置:性别     */    public void setGender(Integer gender) {        this.gender = gender;    }    /**     * 获取:性别     */    public Integer getGender() {        return gender;    }    /**     * 设置:证件号     */    public void setIdcardNo(String idcardNo) {        this.idcardNo = idcardNo;    }    /**     * 获取:证件号     */    public String getIdcardNo() {        return idcardNo;    }}

解说:(1)@TableName是mybatis plus对表的注解,每个实体必须要加,不然会导致表不存在异常。

        (2)@TableId对主键的注解 @TableId中有一个属性叫type是枚举类型,该属性主要作用是主键以什么形式存在,例如IdType.AUTO自增或UUID。

        (3)@TableField像及了mybatis中的resultMap,在mybatis中为什么要使用resultMap,因为当实体中的属性名与数据库中的表不一致时需要手动映射,resultMap的作用在于手动映射,既然说了resultMap就不能不说resultType,resultType当实体属性与表字段一致时自动映射。 在mybatis plus使用@TableField的场景与mybatis中使用resultMap的是一致的。@TableField中还有一个属性不能不提,就是exist,这个属性属于boolean类型,默认为true,意思是是否在数据表中存在,true存在,false不存在,这个的应用场景是当某个实体中需要包含其他实体时,可使用该属性,否则自动生成的查会报错,使用自动生成的查有关方法,默认是查所有数据表所有字段,当然可使用setSqlSelect()方法指定需要查的字段,可以在一定程度上避免该错误的出现,不然导致的错误最有可能就是找不到该字段异常(column not exist),使用exist属性可直接避免,当然也可以在该属性中加入static或transient修饰,与exist的作用本质上是一样的。

      

        

 

 

DAO:

package com.lms.dao;import java.util.Map;import com.baomidou.mybatisplus.mapper.BaseMapper;import com.lms.entity.UserEntity;/** * lms系统用户基本信息表 *  * @author youcong * @date 2018-04-20 22:22:29 */public interface UserDao extends BaseMapper
{ }

 解说:BaseMapper<T>中包含的就是一系列增删改查,maven项目中可Ctrl+鼠标点击进去查看源码,源码所有注释都有,非常浅显易懂,如果你需要加入自定义sql直接写就行,跟mybatis一样,在该类中新增方法,只需在对应的xml中配置即可

Service:

package com.lms.service;import java.util.Map;import com.baomidou.mybatisplus.service.IService;import com.lms.entity.UserEntity;/** * lms系统用户基本信息表 * * @author youcong * @date 2018-04-20 22:22:29 */public interface UserService extends IService
{ }

 解说:IService<T>同DAO也是一样的,查看源码一目了然

Service实现类:

package com.lms.service.impl;import java.util.Map;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Service;import com.baomidou.mybatisplus.service.impl.ServiceImpl;import com.lms.dao.UserDao;import com.lms.entity.UserEntity;import com.lms.service.UserService;/**] *  * @author youcong * */@Service("userService")public class UserServiceImpl extends ServiceImpl
implements UserService {}

 解说:@Service注解的作用也是同mybatis之前那样也是一样,这个注解的作用扫描Service层,自动注解spring容器

web.xml

LMS
contextConfigLocation
classpath:spring/spring.xml
encodingFilter
org.springframework.web.filter.CharacterEncodingFilter
encoding
UTF-8
encodingFilter
/*
DruidWebStatFilter
com.alibaba.druid.support.http.WebStatFilter
exclusions
*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*
DruidWebStatFilter
/*
Spring监听器
org.springframework.web.context.ContextLoaderListener
org.springframework.web.util.IntrospectorCleanupListener
default
/view/
/css/
/js/*"
/images/*
/fonticon/*
/layui/*
*.html
*.js
*.css
*.jpg
*.png
/lib/*
/font/*
/lang/*
SpringMVC
org.springframework.web.servlet.DispatcherServlet
SpringMVC
contextConfigLocation
classpath:spring/spring-mvc.xml
1
SpringMVC
/
DruidStatView
com.alibaba.druid.support.http.StatViewServlet
loginUsername
druid
loginPassword
druid
DruidStatView
/druid/*
30
test.html

 

 

MyMetaObjectHandler

package com.lms.common;import java.util.Date;import org.apache.ibatis.reflection.MetaObject;import com.baomidou.mybatisplus.mapper.MetaObjectHandler;/** * 自定义填充处理器 */public class MyMetaObjectHandler extends MetaObjectHandler {    @Override    public void insertFill(MetaObject metaObject) {        this.setFieldValByName("ctime", new Date(), metaObject);    }    @Override    public boolean openUpdateFill() {        return false;    }    @Override    public void updateFill(MetaObject metaObject) {        // 关闭更新填充、这里不执行    }}

UserDao.xml

 

解说:这个xml里面什么也没有,一具空壳,但是没有这空壳也是万万不行的,这就好像mybatis除了xm方式,还有注解的方式,尽管注解的方式现在很少用,用过mybatis注解的人都知道一点,随着业务的开展,sql会越来越多,写在dao中的sql也越来越多,这就不解耦了,而且mybatis使用注解的前提,必须还是要有一个空壳xml的。之所以jdbc没人用了,最大的缺点就是java代码与sql紧密度高,也就是耦合度高,所以mybatis注解几乎现在没人用,很大程度也是这个原因。使用xml方便管理。而mybatis plus也能用xml,当然同时也是可以用mybatis注解的方式,mybatis plus开发团队也同时一再声明过,mybatis plus在mybatis的基础上只做增强不做改变。所以mybatis的各方面特性也是可以用的,丝毫不影响对于mybatis习惯的开发者们。

Junit单元测试:

package test;import java.util.List;import org.junit.Test;import org.junit.runner.RunWith;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.test.context.ContextConfiguration;import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;import com.lms.entity.UserEntity;import com.lms.dao.UserDao;@RunWith(SpringJUnit4ClassRunner.class)@ContextConfiguration("classpath:spring/spring.xml")public class JunitTest {        @Autowired    private UserDao ud;        @Test    public void testName2() throws Exception {                List
list =ud.selectList(null); for (UserEntity u : list) { System.out.println(u); } } }

 解说:单元测试和之前的spring+mybatis也是一样的,没有任何变化

 

mybatis plus如果要问我最喜欢它的地方是什么?

答:可以从这么几个方面说。

第一,封装的增删改查(多条件查询,分页查询等等应有尽有),使我开发效率得到很大的提升,虽然说增删改查可以cv大法解决,但是也是不小的工作量,使用mybaits plus开发效率得到非常大的提升,使我更能专注于业务逻辑;

第二,xml是无比的简洁,而mybatis逆向工程看起来不太友好(这里声明不针对mybatis);

第三,注解是如此的亲易近人,如何的让人痛快,之前使用时,还挺疑惑,自动生成的我如何sql优化呢,开发者们都知道一点,一个系统的瓶颈与sql方面有很大的紧密度的,没想到mybatis plus只需一个方法,sql优化也做到了;

之前也时常造访github和码云,发现里面也有不少用mybatis plus,其中比较有名的就是人人开源,该代码生成器完全可以挪用过来,之前一个库四五十张表,一个敲太累了,逆向工程的话,也不太符合需求,直接果断的用人人开源的代码生成器(该代码生成器原理也是基于mybatis plus),不过它生成只需改一部分即可用了。运行完全没问题。不过,这个小部分问题,我还要再研究研究这个人人开源的代码生成器。使其更能符合我的需求。

人人开源的代码生成器帮助我提升了不少效率,与mybatis plus完全无缝结合,本人在此推荐。

该官网为:http://www.renren.io/

转载地址:http://pgzdo.baihongyu.com/

你可能感兴趣的文章
Security Identifiers | Win SRV2016 SID Change 修改
查看>>
看看来自日本的扫描,做网站需要注意的
查看>>
JDK 1.7+Android SDK+IntelliJ IDEA 13+Genymotion 安卓开发环境部署
查看>>
钓鱼邮件***防范指南
查看>>
session_start()放置位置的不正确引发的ROOT常量 未定义的错误
查看>>
如何设定VDP同时备份的任务数?
查看>>
ipsec的***在企业网中的经典应用
查看>>
过来人谈《去360还是留在百度?》
查看>>
mysql备份工具innobackupex,xtrabackup-2.1安装,参数详解
查看>>
【复制】slave筛选复制之二(create/drop table语句)
查看>>
Movie Store OpenCart 自适应主题模板 ABC-0249
查看>>
RedHat linux YUM本地制作源
查看>>
apache端口占用问题
查看>>
本地Office Project计划表同步到SharePoint2013任务列表的权限问题
查看>>
Windows2008 R2 GAC权限问题
查看>>
洛谷——P1469 找筷子
查看>>
几句话就能让你明白:网络地址转换(NAT)
查看>>
springboot项目自定义注解实现的多数据源切换
查看>>
特此说明
查看>>
使用flume替代原有的scribe服务
查看>>