之前一篇讲了vue2.0的框架搭建,本篇主要讲后台使用springboot+mybatisplus.
在springboot项目中引入mybatisplus,需要在pom.xml加入
com.baomidou mybatis-plus-boot-starter 3.4.1
我们需要写一个类启动springboot
@SpringBootApplication
public class Application{
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
这个类放在classpath的根目录下
之后建立Dao接口类需要继承自com.baomidou.mybatisplus.core.mapper.baseMapper
这个是Dao层的基类,我们每次操作Dao层都需要继承这个类,这个类里的增删改查操作都已经封装好了,我们只需要拿来用,以下是这个接口类的源码
package com.baomidou.mybatisplus.core.mapper; import com.baomidou.mybatisplus.core.conditions.Wrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.toolkit.Constants; import org.apache.ibatis.annotations.Param; import java.io.Serializable; import java.util.Collection; import java.util.List; import java.util.Map; public interface baseMapperextends Mapper { int insert(T entity); int deleteById(Serializable id); int deleteByMap(@Param(Constants.COLUMN_MAP) Map columnMap); int delete(@Param(Constants.WRAPPER) Wrapper queryWrapper); int deleteBatchIds(@Param(Constants.COLLECTION) Collection extends Serializable> idList); int updateById(@Param(Constants.ENTITY) T entity); int update(@Param(Constants.ENTITY) T entity, @Param(Constants.WRAPPER) Wrapper updateWrapper); T selectById(Serializable id); List selectBatchIds(@Param(Constants.COLLECTION) Collection extends Serializable> idList); List selectByMap(@Param(Constants.COLUMN_MAP) Map columnMap); T selectOne(@Param(Constants.WRAPPER) Wrapper queryWrapper); Integer selectCount(@Param(Constants.WRAPPER) Wrapper queryWrapper); List selectList(@Param(Constants.WRAPPER) Wrapper queryWrapper); List
既然全部封装好了,这些方法直接拿来用吧,对于分页selectPage这个方法需要一个分页拦截才能使用
@Configuration
@MapperScan("com.mapper")
public class MybatisPlusConfig {
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
return interceptor;
}
}
这个是官方提供的分页拦截器,我们只需要修改MapperScan需要拦截的dao所在的包就可以自动进行分页显示,需要注意一个参数就是数据库类型需要修改,DbType.MYSQL
controller层springboot使用@RestController注解作为控制层写在类名上
@RestController
@RequestMapping("/user")
public class UserController{}
方法名上加@PostMapping表示该方法是post方式提交
@PostMapping("/save")
public Result save(@RequestBody User user)
@RequetBody参数类型为Json格式的类,一个参数使用@RequestParam
@PostMapping("/checkname")
public Result checkname(@RequestParam String username)
关于mybatis-plus的数据库操作层的每个方法都有一个参数类QueryWrapper,它是继承自AbstractWrapper
public abstract class AbstractWrapper> extends Wrapper implements Compare , Nested , Join , Func { @Override public Children allEq(boolean condition, Map params, boolean null2IsNull) { if (condition && CollectionUtils.isNotEmpty(params)) { params.forEach((k, v) -> { if (StringUtils.checkValNotNull(v)) { eq(k, v); } else { if (null2IsNull) { isNull(k); } } }); } return typedThis; } @Override public Children allEq(boolean condition, BiPredicate filter, Map params, boolean null2IsNull) { if (condition && CollectionUtils.isNotEmpty(params)) { params.forEach((k, v) -> { if (filter.test(k, v)) { if (StringUtils.checkValNotNull(v)) { eq(k, v); } else { if (null2IsNull) { isNull(k); } } } }); } return typedThis; } @Override public Children eq(boolean condition, R column, Object val) { return addCondition(condition, column, EQ, val); } @Override public Children ne(boolean condition, R column, Object val) { return addCondition(condition, column, NE, val); } @Override public Children gt(boolean condition, R column, Object val) { return addCondition(condition, column, GT, val); } @Override public Children ge(boolean condition, R column, Object val) { return addCondition(condition, column, GE, val); } @Override public Children lt(boolean condition, R column, Object val) { return addCondition(condition, column, LT, val); } @Override public Children le(boolean condition, R column, Object val) { return addCondition(condition, column, LE, val); } @Override public Children like(boolean condition, R column, Object val) { return likevalue(condition, LIKE, column, val, SqlLike.DEFAULT); } @Override public Children notLike(boolean condition, R column, Object val) { return likevalue(condition, NOT_LIKE, column, val, SqlLike.DEFAULT); } @Override public Children likeLeft(boolean condition, R column, Object val) { return likevalue(condition, LIKE, column, val, SqlLike.LEFT); } @Override public Children likeRight(boolean condition, R column, Object val) { return likevalue(condition, LIKE, column, val, SqlLike.RIGHT); } @Override public Children between(boolean condition, R column, Object val1, Object val2) { return doIt(condition, () -> columnToString(column), BETWEEN, () -> formatSql("{0}", val1), AND, () -> formatSql("{0}", val2)); } @Override public Children notBetween(boolean condition, R column, Object val1, Object val2) { return doIt(condition, () -> columnToString(column), NOT_BETWEEN, () -> formatSql("{0}", val1), AND, () -> formatSql("{0}", val2)); } @Override public Children and(boolean condition, Consumer consumer) { return and(condition).addNestedCondition(condition, consumer); } @Override public Children or(boolean condition, Consumer consumer) { return or(condition).addNestedCondition(condition, consumer); } @Override public Children nested(boolean condition, Consumer consumer) { return addNestedCondition(condition, consumer); } @Override public Children not(boolean condition, Consumer consumer) { return not(condition).addNestedCondition(condition, consumer); } @Override public Children or(boolean condition) { return doIt(condition, OR); } @Override public Children apply(boolean condition, String applySql, Object... value) { return doIt(condition, APPLY, () -> formatSql(applySql, value)); } @Override public Children last(boolean condition, String lastSql) { if (condition) { this.lastSql.setStringValue(StringPool.SPACE + lastSql); } return typedThis; } @Override public Children comment(boolean condition, String comment) { if (condition) { this.sqlComment.setStringValue(comment); } return typedThis; } @Override public Children first(boolean condition, String firstSql) { if (condition) { this.sqlFirst.setStringValue(firstSql); } return typedThis; } @Override public Children exists(boolean condition, String existsSql) { return doIt(condition, EXISTS, () -> String.format("(%s)", existsSql)); } @Override public Children notExists(boolean condition, String existsSql) { return not(condition).exists(condition, existsSql); } @Override public Children isNull(boolean condition, R column) { return doIt(condition, () -> columnToString(column), IS_NULL); } @Override public Children isNotNull(boolean condition, R column) { return doIt(condition, () -> columnToString(column), IS_NOT_NULL); } @Override public Children in(boolean condition, R column, Collection> coll) { return doIt(condition, () -> columnToString(column), IN, inexpression(coll)); } @Override public Children notIn(boolean condition, R column, Collection> coll) { return doIt(condition, () -> columnToString(column), NOT_IN, inexpression(coll)); } @Override public Children inSql(boolean condition, R column, String inValue) { return doIt(condition, () -> columnToString(column), IN, () -> String.format("(%s)", inValue)); } @Override public Children notInSql(boolean condition, R column, String inValue) { return doIt(condition, () -> columnToString(column), NOT_IN, () -> String.format("(%s)", inValue)); } @Override public Children groupBy(boolean condition, R... columns) { if (ArrayUtils.isEmpty(columns)) { return typedThis; } return doIt(condition, GROUP_BY, () -> columns.length == 1 ? columnToString(columns[0]) : columnsToString(columns)); } @Override public Children orderBy(boolean condition, boolean isAsc, R... columns) { if (ArrayUtils.isEmpty(columns)) { return typedThis; } SqlKeyword mode = isAsc ? ASC : DESC; for (R column : columns) { doIt(condition, ORDER_BY, () -> columnToString(column), mode); } return typedThis; } @Override public Children having(boolean condition, String sqlHaving, Object... params) { return doIt(condition, HAVINg, () -> formatSqlIfNeed(condition, sqlHaving, params)); } @Override public Children func(boolean condition, Consumer consumer) { if (condition) { consumer.accept(typedThis); } return typedThis; } protected Children not(boolean condition) { return doIt(condition, NOT); } protected Children and(boolean condition) { return doIt(condition, AND); } protected Children likevalue(boolean condition, SqlKeyword keyword, R column, Object val, SqlLike sqlLike) { return doIt(condition, () -> columnToString(column), keyword, () -> formatSql("{0}", SqlUtils.concatLike(val, sqlLike))); } protected Children addCondition(boolean condition, R column, SqlKeyword sqlKeyword, Object val) { return doIt(condition, () -> columnToString(column), sqlKeyword, () -> formatSql("{0}", val)); }
懂数据库操作的程序员大概都知道这些方法的作用,SQL编写就是这么简单,我们不需要再写很长一段SQL语句了。
接下来讲多数据源配置
com.baomidou dynamic-datasource-spring-boot-starter 3.4.1
配置文件加入两个数据源
这个注解写在Dao层类名或方法名上都可以
这就是多数据源配置到哪个Dao层或哪个方法上都可以
好了,以上就是Spring后台整合Mybatis的全部内容,搭建框架真的很简单,代码量也很少,是不是很爽!!赶紧加入Java进行开发Web程序!!



