本文表述两种方式在main中进行操作数据库。
在使用springboot中,不做web,仅启动项目在main入口去执行一些数据操作任务,完成就结束进程。因springbooot+mybatis通常都是使用容器注入的形式,所以在main中是无法调用service层。本文将以两种形式来实现上述方案。
第一种方式(注入):
DemoApplication
package com.example.demo;
import com.yanghao.config.SpringUtil;
import com.yanghao.service.UserService;
import com.yanghao.service.impl.UserServiceImpl;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.ComponentScan;
@SpringBootApplication
@MapperScan("com.yanghao.mapper")
@ComponentScan("com.yanghao")
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
//调用Sercice层
ApplicationContext context = SpringUtil.getApplicationContext();
UserService userService = context.getBean(UserService.class);// 注意是Service,不是ServiceImpl
System.out.println(userService.getList());
//结束进程
System.exit(0);
}
}
SpringUtil(重点,通过ApplicationContextAware接口来获取service的bean)
package com.yanghao.config;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;
@Component
public class SpringUtil implements ApplicationContextAware {
private static ApplicationContext applicationContext = null;
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
if(SpringUtil.applicationContext == null){
SpringUtil.applicationContext = applicationContext;
}
}
//获取applicationContext
public static ApplicationContext getApplicationContext() {
return applicationContext;
}
//通过name获取 Bean.
public static Object getBean(String name){
return getApplicationContext().getBean(name);
}
//通过class获取Bean.
public static <T> T getBean(Class<T> clazz){
return getApplicationContext().getBean(clazz);
}
//通过name,以及Clazz返回指定的Bean
public static <T> T getBean(String name,Class<T> clazz){
return getApplicationContext().getBean(name, clazz);
}
}
User
package com.yanghao.doman;
import lombok.Data;
@Data
public class User {
private Integer id;
private String name;
private Integer age;
}
UserMapper
package com.yanghao.mapper;
import com.yanghao.doman.User;
import org.apache.ibatis.annotations.Mapper;
import java.util.List;
@Mapper
public interface UserMapper {
public List<User> selectUser();
}
UserServiceImpl
package com.yanghao.service.impl;
import com.yanghao.doman.User;
import com.yanghao.mapper.UserMapper;
import com.yanghao.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class UserServiceImpl implements UserService {
@Autowired
private UserMapper userMapper;
@Override
public List<User> getList() {
List<User> users = userMapper.selectUser();
return users;
}
}
UserService
package com.yanghao.service;
import com.yanghao.doman.User;
import java.util.List;
public interface UserService {
public List<User> getList();
}
UserMapper.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.yanghao.mapper.UserMapper">
<select id="selectUser" resultType="com.yanghao.doman.User">
select *
from user;
</select>
</mapper>
mybatis-config.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!-- 全局参数 -->
<settings>
<!-- 使全局的映射器启用或禁用缓存 -->
<setting name="cacheEnabled" value="true" />
<!-- 允许JDBC 支持自动生成主键 -->
<setting name="useGeneratedKeys" value="true" />
<!-- 配置默认的执行器.SIMPLE就是普通执行器;REUSE执行器会重用预处理语句(prepared statements);BATCH执行器将重用语句并执行批量更新 -->
<setting name="defaultExecutorType" value="SIMPLE" />
<!-- 指定 MyBatis 所用日志的具体实现 -->
<setting name="logImpl" value="SLF4J" />
<!-- 使用驼峰命名法转换字段 -->
<!-- <setting name="mapUnderscoreToCamelCase" value="true"/> -->
</settings>
</configuration>
application.yml
# MyBatis
mybatis:
# 搜索指定包别名
typeAliasesPackage: com.yanghao.domain
# 配置mapper的扫描,找到所有的mapper.xml映射文件
mapperLocations: classpath:mapper/*Mapper.xml
# 加载全局的配置文件
configLocation: classpath:mybatis/mybatis-config.xml
#数据库日志
logging:
level:
com.yanghao.mapper: debug
file:
path: logs/spring-boot.log
# Spring配置
spring:
profiles:
active: druid
application-druid.yml
# 数据源配置
spring:
datasource:
username: root
password: root
url: jdbc:mysql://localhost:3306/ceshi?useUnicode=true&characterEncoding=utf-8&useSSL=true&serverTimezone=UTC
driver-class-name: com.mysql.cj.jdbc.Driver
第二种方式(非注入):
YanghaoApplication
package com.example.yanghao;
import com.example.yanghao.config.MybatisConfig;
import com.example.yanghao.mapper.UserMapper;
import org.apache.ibatis.session.SqlSession;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class YanghaoApplication {
public static void main(String[] args) {
//SpringApplication.run(YanghaoApplication.class, args);
SqlSession session = MybatisConfig.getSession();
UserMapper mapper = session.getMapper(UserMapper.class);
System.out.println(mapper.selectUser());
System.out.println(mapper.selectUser());
System.out.println(mapper.selectUser());
}
}
MybatisConfig
package com.example.yanghao.config;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import java.io.IOException;
import java.io.InputStream;
public class MybatisConfig {
public static SqlSession getSession(){
String resource = "mybatis/mybatis-config.xml";
InputStream inputStream = null;
try {
inputStream = Resources.getResourceAsStream(resource);
} catch (IOException e) {
e.printStackTrace();
}
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession session = sqlSessionFactory.openSession();
return session;
}
}
User
package com.example.yanghao.domain;
import lombok.Data;
@Data
public class User {
private Integer id;
private String name;
}
UserMapper
package com.example.yanghao.mapper;
import com.example.yanghao.domain.User;
import java.util.List;
public interface UserMapper {
public List<User> selectUser();
}
UserMapper.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.yanghao.mapper.UserMapper">
<select id="selectUser" resultType="com.example.yanghao.domain.User">
select *
from user;
</select>
</mapper>
mybatis-config.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!--添加properties配置文件路径(外部配置、动态替换)-->
<properties resource="application.properties" />
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${mybatis.driver}"/>
<property name="url" value="${mybatis.url}"/>
<property name="username" value="${mybatis.username}"/>
<property name="password" value="${mybatis.password}"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="mapper/UserMapper.xml"></mapper>
</mappers>
</configuration>
application.properties
#mybatis
mybatis.driver = com.mysql.cj.jdbc.Driver
mybatis.url = jdbc:mysql://localhost:3306/ceshi?useUnicode=true;characterEncoding=utf8;zeroDateTimeBehavior=convertToNull;useSSL=true;serverTimezone=GMT%2B8
mybatis.username = root
mybatis.password = root
以上就是两种方式均可,请自行整合使用。
第二种可直接参考mybatis官方文档。
记得三连~
感谢支持~!
海蜘蛛:只要自己足够的废物,就没有天敌!