最近学习了springboot+mybatis写一个小demo来整合一下学习的内容
第一步当然是创建项目了。我们此次使用的编辑器Intellij idea,使用spring+mybatis框架,使用maven管理我们的项目
基本的配置文件
server.port=8080
server.servlet.context-path=/yiban
#访问端口
#数据库配置
jdbc.driver=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/yiban?serverTimezone=UTC&zeroDateTimeBehavior=convertToNull
jdbc.username=root
jdbc.password=
mybatis_config_file=mybatis-config.xml
mapper_path=/mapper/**.xml
type_alias_package=com.you.yiban.entity
因为我们是使用的是mybaits对mysql数据库进行操作,所以需要配置相应的beans和创建会话工厂代码如下
@MapperScan("com.you.yiban.dao")
public class DataSourceConfiguration {
@Value("${jdbc.driver}")
private String jdbcDriver;
@Value("${jdbc.url}")
private String jdbcUrl;
@Value("${jdbc.username}")
private String jdbcUsername;
@Value("${jdbc.password}")
private String jdbcPassword;
/**
* 生成与spring-dao.xml对应的bean dataSource
*
* @return
* @throws PropertyVetoException
*/
@Bean(name = "dataSource")
public ComboPooledDataSource createDataSource() throws PropertyVetoException {
// 生成datasource实例
ComboPooledDataSource dataSource = new ComboPooledDataSource();
// 跟配置文件一样设置以下信息
// 驱动
dataSource.setDriverClass(jdbcDriver);
// 数据库连接URL
dataSource.setJdbcUrl(jdbcUrl);
// 设置用户名
dataSource.setUser(jdbcUsername);
// 设置用户密码
dataSource.setPassword(jdbcPassword);
// 配置c3p0连接池的私有属性
// 连接池最大线程数
dataSource.setMaxPoolSize(30);
// 连接池最小线程数
dataSource.setMinPoolSize(10);
// 关闭连接后不自动commit
dataSource.setAutoCommitOnClose(false);
// 连接超时时间
dataSource.setCheckoutTimeout(10000);
// 连接失败重试次数
dataSource.setAcquireRetryAttempts(2);
return dataSource;
}
}
会话工厂
@Configuration
public class SessionFactoryConfiguration {
// mybatis-config.xml配置文件的路径
private static String mybatisConfigFile;
@Value("${mybatis_config_file}")
public void setMybatisConfigFile(String mybatisConfigFile) {
SessionFactoryConfiguration.mybatisConfigFile = mybatisConfigFile;
}
// mybatis mapper文件所在路径
private static String mapperPath;
@Value("${mapper_path}")
public void setMapperPath(String mapperPath) {
SessionFactoryConfiguration.mapperPath = mapperPath;
}
// 实体类所在的package
@Value("${type_alias_package}")
private String typeAliasPackage;
@Autowired
private DataSource dataSource;
/**
* 创建sqlSessionFactoryBean 实例 并且设置configtion 设置mapper 映射路径 设置datasource数据源
*
* @return
* @throws IOException
*/
@Bean(name = "sqlSessionFactory")
public SqlSessionFactoryBean createSqlSessionFactoryBean() throws IOException {
SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
// 设置mybatis configuration 扫描路径
sqlSessionFactoryBean.setConfigLocation(new ClassPathResource(mybatisConfigFile));
// 添加mapper 扫描路径
PathMatchingResourcePatternResolver pathMatchingResourcePatternResolver = new PathMatchingResourcePatternResolver();
String packageSearchPath = ResourcePatternResolver.CLASSPATH_ALL_URL_PREFIX + mapperPath;
sqlSessionFactoryBean.setMapperLocations(pathMatchingResourcePatternResolver.getResources(packageSearchPath));
// 设置dataSource
sqlSessionFactoryBean.setDataSource(dataSource);
// 设置typeAlias 包扫描路径
sqlSessionFactoryBean.setTypeAliasesPackage(typeAliasPackage);
return sqlSessionFactoryBean;
}
}
当然springboot框架可以不用写beans和会话工厂,只需要在yml文件中把相应的配置文件写好就是了,框架已经给你封装好了,具体写法会在下一篇博客中详写。
配置好这些之后我们就可以开始内容的填写了。我们可以写一个简单的用户登录的小demo。springboot+mybatis框架其实就是ssm框架的升级版本,一个完整的项目也是由controller层,service层和dao层组成的。要完成用户登录demo首先在dao层写我们需要的接口,由于这只是一个小demo我们写一个简单的接口就够了
public interface UserDao {
/**
* 按id查找用户信息
* @param username
* @return
*/
User queryByUsername(String username);
}
当然在这之前我已经创建好了一个user的实体类包含用户名和密码,注意要生成对应的getter和setter和tostring方法,这个idea有快捷键,可以自行选择生成。
之后我们需要写mapper文件
需要注意的是id需要和dao层的接口名相对应,这里因为我们需要的查出一个用户,所以返回类型我们返回自己创建的user类,如果以后有更复杂的返回类型,就需要写resultMap了。
在service层我们一般也是写一个接口然后再Impl类中写具体方法
我们再Impl类中使用@Autowired注解注入了我们之前写的userDao,我们就可以调用其中的方法了,我们把收到的用户名和密码和数据库中查到的密码相比较,判断是否合法登录。
最后便是controller层
@CrossOrigin
@Controller
@RequestMapping("/user")
public class UserController {
@Autowired
private UserService userService;
@RequestMapping(value = "/login", method = RequestMethod.GET)
@ResponseBody
public ResultVo checkLogin(String username, String password) {
// 用户登录
User user = userService.checkLogin(username, password);
if (user != null) {
user.setPassword(null);
return ResultUtil.success(user);
} else {
return ResultUtil.error("用户名或密码错误");
}
}
其中的@CrossOrigin注解是用来解决前后端联调的跨域问题, @RequestMapping注解vaule后面的值是前端或者用postman访问时的地址,method = RequestMethod.GET是访问的方法,当然我们一般直接用@GetMapping也是一样的。在返回的时候我们一般不直接返回string或是其他的基本类型,我们自定义了一个ResultVo类来接受返回类型,可以返回状态码,提示信息和具体数据。这样我们一个简单的登录小demo就完成了。