本人从网上找了许多springboot集成mybatis的文章,都没有跑通,只能亲自边写边百度,才写出真正可以跑起来的程序,因为即使springboot与mybatis的版本与博主的不一样,都有可能跑不起来。版本不兼容真是个痛。
整个工程目录结果如下:
pom.xml配置如下:
4.0.0
com.example
springbootmybais
0.0.1-SNAPSHOT
jar
springbootmybais
Demo project for Spring Boot
org.springframework.boot
spring-boot-starter-parent
1.5.2.RELEASE
UTF-8
UTF-8
1.8
org.springframework.boot
spring-boot-starter-web
org.mybatis.spring.boot
mybatis-spring-boot-starter
1.3.2
mysql
mysql-connector-java
runtime
org.springframework.boot
spring-boot-starter-test
test
org.springframework.boot
spring-boot-maven-plugin
application.properties内容如下:该文件配置了数据库、mybatis需要配置的东西。
spring.application.name=sprong-boot-mybatis
server.port=8080
server.servlet.context-path=/
#mybatis mapper文件的位置,Sql语句所在文件
mybatis.mapper-locations=classpath*:mapping/*.xml
#扫描pojo类的位置,在此处指定扫描实体类的包,该文件中定义了操作数据库的接口
mybatis.type-aliases-package=com.example.springbootmybais.model
spring.datasource.url=jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=UTF-8&allowMultiQueries=true
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
UserDao内容如下:该文件定义了操作数据库的接口。
package com.example.springbootmybais.mapper;
import com.example.springbootmybais.model.User;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
@Mapper //加上该注解才能使用@MapperScan扫描到
public interface UserDao {
User getUserById(@Param("id") int id);
int updateUser(@Param("user") User user);
int insertUser(@Param("user") User user);
int deleteUserById(@Param("id") int id);
}
model-user内容如下,即java实体:
package com.example.springbootmybais.model;
public class User {
private String id;
private String username;
private String password;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
@Override
public String toString() {
return "User{" +
"id='" + id + '\'' +
", username='" + username + '\'' +
", password='" + password + '\'' +
'}';
}
}
UserMapper内容如下:该文件比较重要,他是连接UserDao与User的桥梁,即数据库接口与实体对象的桥梁,里面可以写数据库语句。注意namespace字段需要填写dao文件位置。
UPDATE user
SET username = #{user.username},
username = #{user.username},
password = #{user.password}
WHERE id = #{user.id}
INSERT INTO
user(id, username, password)
VALUES (
#{user.id},
#{user.username},
#{user.password}
)
DELETE user WHERE id = #{id}
Application内容如下:主要需要配置@MapperScan扫描对应的mapper,即数据库接口
package com.example.springbootmybais;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
@MapperScan("com.example.springbootmybais.mapper")
public class SpringbootmybaisApplication {
public static void main(String[] args) {
SpringApplication.run(SpringbootmybaisApplication.class, args);
}
}
本人用的mysql数据库,所以也需要在mysql数据库中建立相应的表。如下图为本人数据库:
为了验证代码写的是否有无,并且是否可以正确查询数据库,所以建立了controller,通过访问web来实现验证代码是否无。
controller内容如下:
package com.example.springbootmybais.controller;
import com.example.springbootmybais.mapper.UserDao;
import com.example.springbootmybais.model.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class HelloController {
@Autowired
private UserDao userDao;
@RequestMapping("/hello")
public String hello(){
User user = userDao.getUserById(2);
System.out.println(user.toString());
return user.toString();
}
}
然后启动Application,看看效果如下,当启动成功后,通过访问http://localhost:8080/hello,可以看到查询数据库成功,查询到了对应的user。哈哈,终于成功了!!!
在java的mapper下创建UserAnnotaionDao.java,新加文件如下
内容如下:
package com.example.springbootmybais.mapper;
import com.example.springbootmybais.model.User;
import org.apache.ibatis.annotations.*;
import java.util.List;
@Mapper
public interface UserAnnotationDao {
@Select("SELECT * FROM user WHERE id=#{id}")
@Results({
@Result(property = "id",column = "id"),
@Result(property = "username",column = "username"),
@Result(property = "password",column = "password")
})
User getUserById(int id);
@Select("SELECT * FROM user")
@Results({
@Result(property = "id",column = "id"),
@Result(property = "username",column = "username"),
@Result(property = "password",column = "password")
})
List queryAll();
@Update("UPDATE user SET username=#{user.username},password=#{user.password}")
int updateUser(User user);
}
修改HelloController,查询user的id为3时的id,内容如下:
package com.example.springbootmybais.controller;
import com.example.springbootmybais.mapper.UserAnnotationDao;
import com.example.springbootmybais.mapper.UserDao;
import com.example.springbootmybais.model.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class HelloController {
// @Autowired
// private UserDao userDao;
@Autowired
private UserAnnotationDao userAnnotaionDao;
@RequestMapping("/hello")
public String hello(){
User user = userAnnotaionDao.getUserById(3);
System.out.println(user.toString());
return user.toString();
}
}
重新启动程序,再次访问localhost:8080/hello,显示如下:
哈哈,成功了!!!
在前言中说到,mybatis也发现了我们需要重复的去创建pojo类、mapper文件以及dao类并且需要配置它们之间的依赖关系可能会很麻烦,所以mybtis提供了一个mybatis generator工具来帮我们自动创建pojo类、mapper文件以及dao类并且会帮我们配置好它们的依赖关系,而我们只需要关心我们的业务逻辑直接使用就行了。
要使用mybatis generator工具需要在pom.xml文件中添加一个generator的maven工具。主要需要在
org.springframework.boot
spring-boot-maven-plugin
org.mybatis.generator
mybatis-generator-maven-plugin
1.3.2
Generate MyBatis Artifacts
deploy
generate
src/main/resources/mybatis-generator/generatorConfig.xml
true
true
org.mybatis.generator
mybatis-generator-core
1.3.2
mysql
mysql-connector-java
5.1.44
上面指定了mybatis generator工具配置文件的位置,在这个位置创建一个xml文件,并做如下配置,内容如下:
在同目录下创建mybatisGeneratorinit.properties文件:
#Mybatis Generator configuration
#dao类和实体类的位置
project =src/main/java
#mapper文件的位置
resources=src/main/resources
#根据数据库中的表生成对应的pojo类、dao、mapper
jdbc_driver =com.mysql.jdbc.Driver
jdbc_url=jdbc:mysql://localhost:3306/test
jdbc_user=root
jdbc_password=root
到此,整个配置就完成了,既然该工具的作用是将数据库中的表生成对应的实体、dao类和mapper文件,那么首先需要建立数据库表,当数据库表建立好后在pom.xml文件所在的目录执行如下命令:
mvn mybatis-generator:generate
然后就可以看到在指定目录下已经生成了对应的文件,关于mybatis generator的更多详细的配置可以参考这篇文章:Mybatis Generator最完整配置详解
查看本项目目录,可以看到自动生成的代码,如下:
本文章上诉内容所有代码下载地址:https://download.csdn.net/download/zhizhuodewo6/10611179
pom.xml引入以下库
4.0.0
com.example
springbootmybais
0.0.1-SNAPSHOT
jar
springbootmybais
Demo project for Spring Boot
org.springframework.boot
spring-boot-starter-parent
1.5.2.RELEASE
UTF-8
UTF-8
1.8
org.springframework.boot
spring-boot-starter-web
com.baomidou
mybatis-plus
2.1.8
org.apache.velocity
velocity
1.7
org.springframework.boot
spring-boot-starter-jdbc
mysql
mysql-connector-java
runtime
org.springframework.boot
spring-boot-starter-test
test
org.springframework.boot
spring-boot-maven-plugin
创建生成代码的工具类,内容如下:
package com.example.springbootmybais.generator;
import com.baomidou.mybatisplus.generator.AutoGenerator;
import com.baomidou.mybatisplus.generator.config.DataSourceConfig;
import com.baomidou.mybatisplus.generator.config.GlobalConfig;
import com.baomidou.mybatisplus.generator.config.PackageConfig;
import com.baomidou.mybatisplus.generator.config.StrategyConfig;
import com.baomidou.mybatisplus.generator.config.converts.MySqlTypeConvert;
import com.baomidou.mybatisplus.generator.config.rules.DbColumnType;
import com.baomidou.mybatisplus.generator.config.rules.DbType;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
public class MpGenerator {
/**
* 代码生成器演示
*/
public static void main(String[] args){
AutoGenerator mpg = new AutoGenerator();
// 全局配置
GlobalConfig gc = new GlobalConfig();
gc.setOutputDir("D:\\mybatisplus\\generator");
gc.setFileOverride(true);
gc.setActiveRecord(true);
gc.setEnableCache(false);// XML 二级缓存
gc.setBaseResultMap(true);// XML ResultMap
gc.setBaseColumnList(false);// XML columList
gc.setAuthor("xi");
// 自定义文件命名,注意 %s 会自动填充表实体属性!
// gc.setMapperName("%sDao");
// gc.setXmlName("%sDao");
// gc.setServiceName("MP%sService");
// gc.setServiceImplName("%sServiceDiy");
// gc.setControllerName("%sAction");
mpg.setGlobalConfig(gc);
// 数据源配置
DataSourceConfig dsc = new DataSourceConfig();
dsc.setDbType(DbType.MYSQL);
dsc.setTypeConvert(new MySqlTypeConvert(){
// 自定义数据库表字段类型转换【可选】
@Override
public DbColumnType processTypeConvert(String fieldType) {
System.out.println("转换类型:" + fieldType);
// 注意!!processTypeConvert 存在默认类型转换,如果不是你要的效果请自定义返回、非如下直接返回。
return super.processTypeConvert(fieldType);
}
});
dsc.setDriverName("com.mysql.jdbc.Driver");
dsc.setUsername("root");
dsc.setPassword("root");
// dsc.setPassword("admin123...");
dsc.setUrl("jdbc:mysql://localhost:3306/test?characterEncoding=utf8");
mpg.setDataSource(dsc);
// 策略配置
StrategyConfig strategy = new StrategyConfig();
// strategy.setCapitalMode(true);// 全局大写命名 ORACLE 注意
strategy.setTablePrefix(new String[] { "" });// 此处可以修改为您的表前缀
strategy.setNaming(NamingStrategy.underline_to_camel);// 表名生成策略
strategy.setInclude(
new String[] {
"school"}); // 需要生成的表
// strategy.setExclude(new String[]{"test"}); // 排除生成的表
// 自定义实体父类
strategy.setSuperEntityClass("com.example.springbootmybais.entity.DataEntity");
strategy.setEntityLombokModel(true);
// 自定义实体,公共字段
strategy.setSuperEntityColumns(new String[] { "id", "create_by", "create_by_name", "create_time", "update_by", "update_by_name", "update_time", "del_flag" });
// 自定义 mapper 父类
// strategy.setSuperMapperClass("com.baomidou.demo.TestMapper");
// 自定义 service 父类
// strategy.setSuperServiceClass("com.baomidou.demo.TestService");
// 自定义 service 实现类父类
// strategy.setSuperServiceImplClass("com.baomidou.demo.TestServiceImpl")org.com.hdzy.common.entity.DataEntity;
// 自定义 controller 父类
// strategy.setSuperControllerClass("com.baomidou.demo.TestController");
// 【实体】是否生成字段常量(默认 false)
// public static final String ID = "test_id";ee
// strategy.setEntityColumnConstant(true);
// 【实体】是否为构建者模型(默认 false)
// public User setName(String name) {this.name = name; return this;}
// strategy.setEntityBuliderModel(true);
mpg.setStrategy(strategy);
// 包配置
PackageConfig pc = new PackageConfig();
pc.setParent("com.xi.fzzl.dao");
pc.setModuleName("");
mpg.setPackageInfo(pc);
// // 注入自定义配置,可以在 VM 中使用 cfg.abc 【可无】
// InjectionConfig cfg = new InjectionConfig() {
// @Override
// public void initMap() {
// Map map = new HashMap();
// map.put("abc", this.getConfig().getGlobalConfig().getAuthor() + "-mp");
// this.setMap(map);
// }
// };
//
// // 自定义 xxList.jsp 生成
// List focList = new ArrayList();
// focList.add(new FileOutConfig("/template/list.jsp.vm") {
// @Override
// public String outputFile(TableInfo tableInfo) {
// // 自定义输入文件名称
// return "D://my_" + tableInfo.getEntityName() + ".jsp";
// }
// });
// cfg.setFileOutConfigList(focList);
// mpg.setCfg(cfg);
//
// // 调整 xml 生成目录演示
// focList.add(new FileOutConfig("/templates/mapper.xml.vm") {
// @Override
// public String outputFile(TableInfo tableInfo) {
// return "/develop/code/xml/" + tableInfo.getEntityName() + ".xml";
// }
// });
// cfg.setFileOutConfigList(focList);
// mpg.setCfg(cfg);
//
// // 关闭默认 xml 生成,调整生成 至 根目录
// TemplateConfig tc = new TemplateConfig();
// tc.setXml(null);
// mpg.setTemplate(tc);
// 自定义模板配置,可以 copy 源码 mybatis-plus/src/main/resources/template 下面内容修改,
// 放置自己项目的 src/main/resources/template 目录下, 默认名称一下可以不配置,也可以自定义模板名称
// TemplateConfig tc = new TemplateConfig();
// tc.setController("...");
// tc.setEntity("...");
// tc.setMapper("...");
// tc.setXml("...");
// tc.setService("...");
// tc.setServiceImpl("...");
// 如上任何一个模块如果设置 空 OR Null 将不生成该模块。
// mpg.setTemplate(tc);
// 执行生成
mpg.execute();
// 打印注入设置【可无】
// System.err.println(mpg.getCfg().getMap().get("abc"));
}
}
本地数据库表school如下截图:
最后运行MyGenter的main方法,然后在本地就自动生成所需实体类与mapper,如下截图
然后将所需代码拷贝如工程中即可。
该方法所需工程源码下载地址:https://download.csdn.net/download/zhizhuodewo6/10616121
如有什么疑问可以联系本博主,互相交流学习。