基本思路是在项目启动后运行一个update语句,里面是建表语句。
在数据源设置allowMultiQueries=true允许多行sql语句执行。
这种方法有SQL注入的风险,建议实际项目中不要采用。
首先创建一个初始化数据库的类,实现CommandLineRunner
接口
@Component
@Slf4j
@Order(value = 1) //order值越低,优先级越高
public class InitMySql implements CommandLineRunner {
@Resource
MySqlMapper mySqlMapper;
@Resource
UserMapper userMapper;
/**
* Callback used to run the bean.
*
* @param args incoming main method arguments
* @throws Exception on error
*/
@Override
public void run(String... args) throws Exception {
log.info("开始初始化数据库...");
createTable();
insertData();
log.info("数据库初始化完毕!");
}
/**
* 初始化表
*/
private void createTable() {
log.info("开始创建表...");
mySqlMapper.createTable();
log.info("建表完毕!");
}
/**
* 初始化数据
*/
private void insertData() {
log.info("开始插入数据...");
int userNum = 10000;
List<User> users = new ArrayList<>(userNum);
for(int i=0; i<userNum; i++) {
User user = new User();
users.add(user);
}
ListUtils.partition(users, 100).forEach(userMapper::insertList);
log.info("数据插入完成!");
}
}
在Mapper对应的xml文件中写入建表语句
<update id="createTable">
drop table if exists user;
create table user (
id int auto_increment,
primary key(id)
);
</update>
最后,在application.yml中的数据库配置allowMultiQueries
url: jdbc:mysql://localhost:3306/user?serverTimezone=UTC&allowMultiQueries=true
网友评论