MyBatis-Plus(简称 MP)是一个 MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提 高效率而生。关于mybatis-plus的更多介绍及特性,可以参考mybatis-plus官网。
这里我们用到了lombok工具包,这个在最后会讲到。
<!--简化代码的工具包-->
>
>org.projectlombok >
>lombok >
>true >
>
<!--mybatis-plus的springboot支持-->
>
>com.baomidou >
>mybatis-plus-boot-starter >
>3.0.5 >
>
<!--mysql驱动-->
>
>mysql >
>mysql-connector-java >
>5.1.47 >
>
spring:
application:
name: mybatis-plus-test
datasource:
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://172.16.55.185:3306/test?useUnicode=true&characterEncoding=utf8&autoReconnect=true&allowMultiQueries=true&useS SL=false
username: root
password: root
CREATE TABLE `user` (
`id` bigint(20) NOT NULL COMMENT '主键ID',
`name` varchar(30) DEFAULT NULL COMMENT '姓名',
`age` int(11) DEFAULT NULL COMMENT '年龄',
`email` varchar(50) DEFAULT NULL COMMENT '邮箱',
`first_name` varchar(50) DEFAULT NULL COMMENT '姓氏',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- 插入数据
INSERT INTO `user` (`id`, `name`, `age`, `email`,`first_name`) VALUES ('1', 'Lisi', '19', '[email protected]','李');
INSERT INTO `user` (`id`, `name`, `age`, `email`,`first_name`) VALUES ('2', 'Jack', '25', '[email protected]','Jack');
INSERT INTO `user` (`id`, `name`, `age`, `email`,`first_name`) VALUES ('3', 'Tom', '28', '[email protected]','Tom');
INSERT INTO `user` (`id`, `name`, `age`, `email`,`first_name`) VALUES ('4', 'Zhnagsan', '21', '[email protected]','张');
INSERT INTO `user` (`id`, `name`, `age`, `email`,`first_name`) VALUES ('5', 'Wangwu', '29', '[email protected]','王');
@Data
@TableName(value = "user")//指定表名,如果表名和实体名称一致,可以省略不写
public class User {
//若实体类属性名与表主键列名一致可省略value
@TableId(value = "id",type = IdType.AUTO)//指定自增策略
private Long id;
private String name;
private Integer age;
private String email;
//若没有开启驼峰命名,或者表中列名不符合驼峰规则,可通过该注解指定数据库表中的列名,exist标明数据表中有没有对应列
@TableField(value = "first_name",exist = true)
private String firstName;
}
public interface UserMapper extends BaseMapper<User> {
}
想了解BaseMapper提供了哪些基础的CRUD操作,有兴趣的可以进入BaseMapper类中查看,下面会有增、删、改、查等测试演示,这里就不截图列出来了。
@MapperScan("cn.dws.mybatisplus.mapper") //设置mapper接口的扫描包 @SpringBootApplication
public class MyApplication {
public static void main(String[] args) {
SpringApplication.run(MyApplication.class, args);
}
}
@RunWith(SpringRunner.class)
@SpringBootTest
public class UserMapperTest {
@Autowired
private UserMapper userMapper;
@Test
public void testSelect() {
System.out.println(("----- selectAll method test ------"));
List<User> userList = userMapper.selectList(null);
for (User user : userList) {
System.out.println(user);
}
}
}
本文涉及代码较多,为了不影响篇幅,故非必要处不再截图。接下来的所有操作都是基于此整合好的项目。
在MybatisPlus中,BaseMapper中定义了一些常用的CRUD方法,当我们自定义的Mapper接口继承BaseMapper 后即可拥有了这些方法。
@Test
public void testSave(){
User user = new User();
user.setAge(25);
user.setEmail("[email protected]");
user.setName("Xiaohong");
user.setFirstName("小");
int count = this.userMapper.insert(user);
System.out.println("新增数据成功! count => " + count);
}
@Test
public void testUpdate(){
User user = new User();
user.setId(6L);
user.setName("Liyan");
//根据主键id修改数据
this.userMapper.updateById(user);
System.out.println("修改成功!"); }
@Test
public void testDelete(){
//根据主键id删除数据
this.userMapper.deleteById(7L);
System.out.println("删除成功!"); }
@Test
public void testSelectByLe(){
QueryWrapper queryWrapper = new QueryWrapper(new User());
// 查询年龄小于等于20的用户
queryWrapper.le("age", 20);
List<User> users = this.userMapper.selectList(queryWrapper);
for (User user : users) {
System.out.println(user);
}
}
@Test
public void testSelectByLike(){
QueryWrapper queryWrapper = new QueryWrapper(new User());
//查询名字中包含“o”的用户
queryWrapper.like("name", "o");
List<User> users = this.userMapper.selectList(queryWrapper);
for (User user : users) {
System.out.println(user);
}
}
@configration //标注该类为配置类,启动器启动时会自动加载该类
public class MyConfig {
/**
* 分页插件
**/
@Bean
public PaginationInterceptor paginationInterceptor() {
return new PaginationInterceptor();
}
}
@Test
public void testSelectPage() {
Page<User> page = new Page<>(1, 2);
IPage<User> userIPage = this.userMapper.selectPage(page, null);
System.out.println("总条数 ------> " + userIPage.getTotal());
System.out.println("当前页数 ------> " + userIPage.getCurrent());
System.out.println("当前每页显示数 ------> " + userIPage.getSize());
List<User> records = userIPage.getRecords();
for (User user : records) {
System.out.println(user);
}
}
更多配置:http://mp.baomidou.com/guide/config.html#%E5%9F%BA%E6%9C%AC%E9%85%8D%E7%BD%AE
<!--freemarker模板引擎-->
>
>org.freemarker >
>freemarker >
>2.3.28 >
>
public class CodeGenerator {
/**
*
* 读取控制台内容
*
*/
public static String scanner(String tip) {
Scanner scanner = new Scanner(System.in);
StringBuilder help = new StringBuilder();
help.append("请输入" + tip + ":");
System.out.println(help.toString());
if (scanner.hasNext()) {
String ipt = scanner.next();
if (StringUtils.isNotEmpty(ipt)) {
return ipt;
}
}
throw new MybatisPlusException("请输入正确的" + tip + "!");
}
public static void main(String[] args) {
// 代码生成器
AutoGenerator mpg = new AutoGenerator();
// 全局配置
GlobalConfig gc = new GlobalConfig();
String projectPath = System.getProperty("user.dir");
gc.setOutputDir(projectPath + "/src/main/java");
gc.setAuthor("dws");
gc.setOpen(false);
mpg.setGlobalConfig(gc);
// 数据源配置
DataSourceConfig dsc = new DataSourceConfig();
dsc.setUrl("jdbc:mysql://192.168.163.132:3306/haoke? useUnicode=true&characterEncoding=utf8&autoReconnect=true&allowMultiQueries=true");
// dsc.setSchemaName("public");
dsc.setDriverName("com.mysql.jdbc.Driver");
dsc.setUsername("root");
dsc.setPassword("root");
mpg.setDataSource(dsc);
// 包配置
PackageConfig pc = new PackageConfig();
pc.setModuleName(scanner("模块名"));
pc.setParent("cn.dws.haoke.server");
mpg.setPackageInfo(pc);
// 自定义配置
InjectionConfig cfg = new InjectionConfig() {
@Override
public void initMap() {
// to do nothing
}
};
List<FileOutConfig> focList = new ArrayList<>();
focList.add(new FileOutConfig("/templates/mapper.xml.ftl") {
@Override
public String outputFile(TableInfo tableInfo) {
// 自定义输入文件名称
return projectPath + "/src/main/resources/mapper/" +
pc.getModuleName()
+ "/" + tableInfo.getEntityName() + "Mapper" +
StringPool.DOT_XML;
}
});
cfg.setFileOutConfigList(focList);
mpg.setCfg(cfg);
mpg.setTemplate(new TemplateConfig().setXml(null));
// 策略配置
StrategyConfig strategy = new StrategyConfig();
strategy.setNaming(NamingStrategy.underline_to_camel);
strategy.setColumnNaming(NamingStrategy.underline_to_camel);
strategy.setSuperEntityClass("cn.dws.haoke.domain.BasePojo");
strategy.setEntityLombokModel(true);
strategy.setRestControllerStyle(true);
strategy.setSuperControllerClass("com.baomidou.ant.common.BaseController");
strategy.setInclude(scanner("表名"));
strategy.setSuperEntityColumns("id");
strategy.setControllerMappingHyphenStyle(true);
strategy.setTablePrefix(pc.getModuleName() + "_");
mpg.setStrategy(strategy);
mpg.setTemplateEngine(new FreemarkerTemplateEngine());
mpg.execute();
}
}
lombok提供了简单的注解的形式来帮助我们简化消除一些必须有但显得很臃肿的 java 代码,尤其是针对pojo,在 MybatisPlus中使用lombok。
<!--简化代码的工具包-->
>
>org.projectlombok >
>lombok >
>true >
>1.18.4 >
>
注意:如果不安装插件,程序可以正常执行,但是看不到生成的一些代码,如:get、set方法。