上一篇介绍了Springboot集成JPA实现数据库的操作,但是目前,大多数主流公司基本采用Mybatis完成数据库的操作。Mybatis是一种持久层框架,也属于ORM映射,是一种半自动化语言,需要自己编写Sql语句,简单易学,Sql写在xml里,便于统一管理和优化。通过sql基本上可以实现我们不使用数据访问框架可以实现的所有功能,将业务逻辑与数据访问分离解耦。下面开始编写项目:
首先同样,将相关包进行导入,如下:
4.0.0
com.tdw.mybatis
mybatis-demo
0.0.1-SNAPSHOT
jar
org.springframework.boot
spring-boot-starter-parent
2.0.3.RELEASE
UTF-8
UTF-8
1.8
org.springframework.boot
spring-boot-starter-web
org.springframework.boot
spring-boot-starter-test
test
org.springframework.boot
spring-boot-devtools
org.mybatis.spring.boot
mybatis-spring-boot-starter
1.3.2
mysql
mysql-connector-java
org.springframework.boot
spring-boot-maven-plugin
接下来编写application.properties,如下:
#mybatis config
mybatis.config-location = classpath:mapper/config/sqlMapConfig.xml
mybatis.mapper-locations = classpath:mapper/*.xml
#datasource config
spring.datasource.url=jdbc:mysql://localhost:3306/springboot
spring.datasource.username = root
spring.datasource.password = 123
spring.datasource.driverClassName = com.mysql.jdbc.Driver
spring.datasource.max-active=20
spring.datasource.max-idle=8
spring.datasource.min-idle=8
spring.datasource.initial-size=10
server.port = 8083
很简单,包含了数据库的相关配置以及和mybatis的。server.port设置访问端口。
可以看到在mybatis配置中,maper-location定义为(你自己可以进行选择放置位置),mapper/*.xml如下目录:
配置好,接下来开发相关的代码:
给出实体类代码:
public class UserVO implements Serializable{
private static final long serialVersionUID = 1L;
/**
* id
*/
private Integer id;
/**
* 名称
*/
private String name;
/**
* 密码
*/
private String password;
/**
* 用户名
*/
private String username;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
}
首先开发业务层,定义一个接口findAllUser,找出所有用户:
public interface IUserService {
public List findAllUser();
}
接下来完成与数据库交互的Dao层接口:
@Mapper
public interface IUserDao {
/**
* 找出所有的用户
* @return
*/
public List findAllUser();
}
接下来,在上面配置的mapper目录下新建同样名称的文件IUserDao.xml:
DAO层开发好后,接下来实现该接口的功能,
@Service
public class UserServiceImpl implements IUserService{
@Autowired
private IUserDao userDao;
public List findAllUser() {
System.out.print("-findAllUser--");
return userDao.findAllUser();
}
}
完成业务层开发,接下来实现controller层的代码开发,这里是提供给外部进行访问的:
@RestController
public class UserController {
@Autowired
private IUserService userService;
@RequestMapping("/list/findUsers")
public List findUsers()
{
System.out.println("coming...");
return userService.findAllUser();
}
}
最后,定义Springboot的启动类,如下:
package com.tdw.mybatis;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class MybatisApplication {
public static void main(String[] args) {
SpringApplication.run(MybatisApplication.class, args);
}
}
使用postman进行测试,如下结果:
至此,代码开发完成。
延伸:
在IUserDao接口上面去掉@Mapper注解,然后在Springboot的启动类添加@MapperScan注解,如下:
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@MapperScan("com.tdw.mybatis.*")
@SpringBootApplication
public class MybatisApplication {
public static void main(String[] args) {
SpringApplication.run(MybatisApplication.class, args);
}
}
启动会报错,原因在controller层通过注解引入IUserService接口无法识别到特定的服务,添加注解@Qualifier("userServiceImpl")即可,同时在UserServiceImpl中的注解改为@Service("userServiceImpl")。
@Qualifier注解了,qualifier的意思是合格者,通过这个标示,表明了哪个实现类才是我们所需要的,我们修改调用代码,添加@Qualifier注解,需要注意的是@Qualifier的参数名称必须为我们之前定义@Service注解的名称之一。
再次启动成功。这是另一种方式扫描配置。
接下来更深层次学习下@Mapper和@MapperScan的区别,同时阅读源码看下原理如何。