1. build.gradle 中声明依赖
版本可以到 https://mvnrepository.com 中查询
project(":repo") {
dependencies {
compile "org.mybatis.generator:mybatis-generator-core:1.3.7"
compile "mysql:mysql-connector-java:8.0.16"
compile "org.mybatis:mybatis:3.4.6"
compile "com.alibaba:druid-spring-boot-starter:1.1.10"
compile "org.springframework:spring-jdbc:5.1.5.RELEASE"
compile "org.mybatis:mybatis-spring:1.3.2"
}
}
2. mybatis-generator
a. xml文件 指定生成的model,mapper,xml存放目录以及名称
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE generatorConfiguration
PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
"http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
<generatorConfiguration>
<context id="DB2Tables" targetRuntime="MyBatis3">
<!-- 指定连接 数据库账号与密码-->
<jdbcConnection driverClass="com.mysql.jdbc.Driver"
connectionURL="jdbc:mysql://127.0.0.1:3306/springboot?useUnicode=true&characterEncoding=utf-8&serverTimezone=UTC"
userId="root"
password="password">
</jdbcConnection>
<javaTypeResolver >
<property name="forceBigDecimals" value="false" />
</javaTypeResolver>
<!--指定 model生成的目录 -->
<javaModelGenerator targetPackage="com.pdz.repo.model" targetProject="repo/src/main/java">
<property name="enableSubPackages" value="true" />
<property name="trimStrings" value="true" />
</javaModelGenerator>
<!--指定 mapper文件生成的目录 -->
<sqlMapGenerator targetPackage="mapper" targetProject="repo/src/main/resources">
<property name="enableSubPackages" value="true" />
</sqlMapGenerator>
<!--指定 xml生成的目录 -->
<javaClientGenerator type="XMLMAPPER" targetPackage="com.pdz.repo.mapper" targetProject="repo/src/main/java">
<property name="enableSubPackages" value="true" />
</javaClientGenerator>
<!--指定 要生成对应文件的表 -->
<table schema="springboot" tableName="collect_url" domainObjectName="UrlCollector" >
<generatedKey column="id" sqlStatement="JDBC" ></generatedKey>
</table>
</context>
</generatorConfiguration>
b. java文件
直接运行即可
public class Generator {
// 复制自官网
public static void main(String[] args) throws Exception{
List<String> warnings = new ArrayList<String>();
boolean overwrite = true;
ConfigurationParser cp = new ConfigurationParser(warnings);
// 在 指定xml配置文件时 有所不同 在目录指向resource下
Configuration config = cp.parseConfiguration(Thread.currentThread()
.getContextClassLoader().getResourceAsStream("generatorConfig.xml"));
DefaultShellCallback callback = new DefaultShellCallback(overwrite);
MyBatisGenerator myBatisGenerator = new MyBatisGenerator(config, callback, warnings);
myBatisGenerator.generate(null);
}
}
文件结构如下
3. druid
druid配置
password 可以用 **** 后面在代码中重写这里的配置
druid.driverClassName=com.mysql.jdbc.Driver
druid.url=jdbc:mysql://127.0.0.1:3306/springboot?useUnicode=true&characterEncoding=utf-8&serverTimezone=UTC
druid.username=root
druid.password=****
druid.initialSize=10
druid.minIdle=6
druid.maxActive=50
druid.maxWait=60000
druid.timeBetweenEvictionRunsMillis=60000
druid.minEvictableIdleTimeMillis=300000
druid.validationQuery=SELECT 'x'
druid.testWhileIdle=true
druid.testOnBorrow=false
druid.testOnReturn=false
druid.poolPreparedStatements=false
druid.maxPoolPreparedStatementPerConnectionSize=20
druid.filters=wall,stat
构建数据源bean 对于mybatis需要一个 SqlSessionFactory 也在这里构建
// 代码改动自 https://mrbird.cc/Spring-Boot-MyBatis%20Druid.html
@Configuration
@MapperScan(value = "com.pdz.repo.mapper", sqlSessionFactoryRef = "mysqlSqlSessionFactory") // 指定mapper扫描的目录 以及mybatis使用到的sqlSession
public class MysqlDataSourceConfig {
@Primary
@Bean(name = "mysqldatasource")
@ConfigurationProperties("druid")
public DataSource mysqlDataSource() {
return DruidDataSourceBuilder.create().build();
}
@Bean(name = "mysqlTransactionManager")
@Primary
public DataSourceTransactionManager mysqlTransactionManager() {
return new DataSourceTransactionManager(mysqlDataSource());
}
@Bean(name = "mysqlSqlSessionFactory")
@Primary
public SqlSessionFactory mysqlSqlSessionFactory(@Qualifier("mysqldatasource") DataSource dataSource)
throws Exception {
final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
sessionFactory.setDataSource(dataSource);
// 指定实现mapper的xml的扫描目录
sessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver()
.getResources("classpath:/mapper/*.xml"));
return sessionFactory.getObject();
}
}
对于ConfigurationProperties它是在bean创建后把配置文件中的属性写入到bean中 大概查了一下用到的是BeanPostProcessor 我们也可以用相同的方法 修改初始化后的bean 重新对password赋值 我这里把密码写到了环境变量中 然后从环境变量中读取密码 (如果是用druid加密了密码 也可以把解密的公钥写到环境变量中)
@Component
public class PasswordSetter implements BeanPostProcessor {
// 在bean初始化后调用
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
//判断是否是datasource bean
if (DataSource.class.isAssignableFrom(bean.getClass())) {
DruidDataSource dataSource = (DruidDataSource) bean;
dataSource.setPassword(System.getenv("SQL_PASSWORD"));
}
return bean;
}
}
4. mybatis
经过之前的步骤 到了这里已经可以直接使用mybatis
也可以写一个repo把mapper再包装一层
@Controller
@RequestMapping("/url")
public class UrlCollectController {
@Autowired
UrlCollectorMapper urlCollectorMapper;
@GetMapping("/add")
@ResponseBody
public Object urlAdd() {
UrlCollector urlCollector = new UrlCollector();
urlCollector.setUrl("https://www.baidu.com");
urlCollectorMapper.insertSelective(urlCollector);
return "ok";
}
}