本文主要在上一篇[Spring Boot学习笔记(四)构建RESTful API标准工程实例]的基础上,整合MyBatis,实现简单的MySql数据库访问
引入依赖
这里主要依赖两个,一个是连接MySql的mysql-connector-java
,还一个是SpringBoot整合MyBatis的核心依赖mybatis-spring-boot-starter
可以从maven仓库里生成对应的配置代码:
对应pom.xml
如下:
org.mybatis.spring.boot
mybatis-spring-boot-starter
1.3.1
mysql
mysql-connector-java
6.0.6
配置数据库
自己安装下MySql,创建库和表,我这边demo的表如下:
CREATE TABLE `temp` (
`id` INT(11) NOT NULL AUTO_INCREMENT COMMENT '自增长id',
`name` VARCHAR(50) NOT NULL DEFAULT '' COMMENT '姓名',
`content` VARCHAR(100) NOT NULL DEFAULT '' COMMENT '描述',
PRIMARY KEY (`id`)
)
COMMENT='测试表';
在application.properties
下配置对应的数据库地址:
spring.datasource.url=jdbc:mysql://localhost:3306/mytest
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
实际代码编写
首先创建数据库映射对象Temp
:
public class Temp {
private Integer id;
private String name;
private String content;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setId(String name) {
this.name = name;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
}
然后创建Temp
映射的操作TempMapper
:
@Mapper
public interface TempMapper {
@Select("SELECT * FROM TEMP WHERE ID = #{id}")
Temp findById(@Param("id") Integer id);
@Insert("INSERT INTO TEMP(NAME, CONTENT) VALUES(#{name}, #{content})")
int insert(Temp temp);
@Update("UPDATE TEMP SET CONTENT=#{content} WHERE ID=#{id}")
int update(@Param("content") String content, @Param("id") Integer id);
}
编写对应的service层TempServiceImpl
,TempService
:
public interface TempService {
public Temp getTemp(Integer id);
public Boolean insertTemp(Temp entity);
public Boolean updateTemp(Temp entity);
}
@Service
public class TempServiceImpl implements TempService{
@Autowired
private TempMapper tempMapper;
@Override
public Temp getTemp(Integer id)
{
return tempMapper.findById(id);
}
@Override
public Boolean insertTemp(Temp entity)
{
return tempMapper.insert(entity)>0;
}
@Override
public Boolean updateTemp(Temp entity)
{
return tempMapper.update(entity.getContent(),entity.getId())>0;
}
}
最后编写Controller:
@RestController
public class TempController {
@Autowired
private TempService tempService;
@ApiOperation(value="MyBatis_Demo", notes="MyBatis实现数据库访问demo")
@RequestMapping(value = "/temp",method = RequestMethod.GET)
public Temp getTemp()
{
Temp t=tempService.getTemp(1);
return t;
}
}
好啦,大功告成,如果没有意外的话,应该能顺利看到结果啦。
问题汇总
编写过程中不是一帆风顺的,我遇到的问题如下,供大家参考。
问题1
启动时提示Failed to start connecter[HTTP/1.1-8080]
看到这个提示后还是比较好定位问题的,基本锁定端口被占用了,很好奇被谁占用了,于是排查了下:
打开命令窗口输入:
netstat -aon|findstr "8080"
找到对应的PID
后到任务管理器去查看被什么进程给占用了
结果发现是个奇怪的进程,后来百度了下和docker
有关,这才恍然大悟,之前在docker下调试 .net core项目的。关闭进程问题顺利解决。
问题2
Consider defining a bean of type 'com.example.api_demo.domain.repository.TempMapper' in your configuration.
这个自己犯了错误,忘记在启动类配置扫描包了,立马添加上。
问题3
The server time zone value '?泄???????' is unrecognized or represents more t...
也是一个奇葩的问题,百度一下,原来碰到的人挺多,原因就是高版本的MySql驱动会有数据库和系统时区差异
,我用的版本是6.0.6
,所以碰到了,修改下配置,执行时区就可以了
jdbc:mysql://localhost:3306/mytest?serverTimezone=UTC
或者用回5.1.4
版本,该版本不会存在时区问题。
问题4
Could not autowired,No beans of '****' type found
这个问题困扰了我一阵,很尴尬,应该早点百度的或者先尝试一下编译的,后来发现编译能通过,运行也没问题,后来才知道,可参考这篇博客
如果不想看到这个报错,可降低Autowired检测的级别:
总结
到这里,简单MyBatis实现数据库访问已经基本实现,但这不能满足实际业务需求,比如复杂的sql如何处理,如何访问多个库等。
同时,MyBatis的一些注解对于新手来说还是比较陌生的,下一篇我会尝试从我的角度去深度整理下MyBatis的复杂使用,和大家一起分享,共同进步。