全注解方式
- 创建一个springboot项目,勾选如下启动器
- pom.xml 依赖如下
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.4.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.apdoer</groupId>
<artifactId>springboot-mybatis</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>springboot-mybatis</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.0.1</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.16.18</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
- 配置文件使用yml
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
username: root
password: 123456
url: jdbc:mysql://localhost:3306/springboot?useUnicode=true&characterEncoding=utf8
springboot会自动加载application.yml相关配置,配置会自动注入到SqlSessionFactory中,SQLSessionFactory会自动注入到mapper中
注意新版本的驱动中间多了个cj
注意新版本的驱动中间多了个cj
注意新版本的驱动中间多了个cj
- 项目目录结构如下
- 实体类代码
/**
* @Description user
* @Author apdoer
* @Date 2019/4/18 20:31
* @Version 1.0
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
private static final long serialVersionUID = 6215706484608288089L;
// 用户ID
private Long userId;
// 账号
private String account;
// 用户名称
private String name;
// 邮箱
private String email;
// 密码
private String password;
// google密钥
private String googleCode;
private String avator;
// 启用状态(0:启用,1:不启用,2:删除)
private Byte enabled;
// 备注
private String remark;
// 创建时间
private Date createTime;
}
- mapper接口代码【这里用的是全注解】
@Mapper
public interface UserMapper {
@Select("select * from web_user")
List<User> getUsers();
@Insert("insert into web_user(username,password) values (#{username},#{password})")
int insertUser(@Param("username")String username,@Param("password") String password);
}
- service代码如下
/**
* @Description userService
* @Author apdoer
* @Date 2019/4/1820:32
* @Version 1.0
*/
@Service
public class UserService {
@Autowired
private UserMapper userMapper;
public List<User> getUsers(){
return userMapper.getUsers();
}
/**
* 事务
*/
@Transactional
public void insertUser() {
userMapper.insertUser("张三","测试");
//模拟出错
int i = 5 / 0;
userMapper .insertUser("李四","测试事务");
}
}
- 控制层代码如下
/**
* @Description userController
* @Author apdoer
* @Date 2019/4/18 20:40
* @Version 1.0
*/
@RestController
public class UserController {
@Autowired
private UserService userService;
@GetMapping("/users")
public List<User> getUser(){
List<User> users = userService.getUsers();
return users;
}
/**
* 为了省事就不适用postmapping了,直接请求
* @return
*/
@RequestMapping("/insert")
public String insert(){
userService.insertUser();
return "insert";
}
}
启动项目,访问
localhost:8080/users
可以看到如下,user都查出来了
访问localhost:8080/insert
也可以看到,两次操作都没有成功
注解和XML结合
因为有了xml配置文件,所以我们要在配置中指定xml配置文件的位置,把application.yml改造成如下
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
username: root
password: 123456
url: jdbc:mysql://localhost:3306/springboot?useUnicode=true&characterEncoding=utf8
#指定mybatis映射文件的地址
mybatis:
mapper-locations: classpath:mapper/*.xml
这样,他就会去项目的classpath目下找mapper下面的所有以.xml结尾的文件
- 接口代码如下
@Mapper
public interface UserMapper {
User getUser();
int insertUser(@Param("username")String username,@Param("password") String password);
}
- 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.apdoer.springbootmybatis.com.apdoer.mapper.UserMapper">
<resultMap id="BaseResultMap" type="com.apdoer.springbootmybatis.com.apdoer.pojo.User">
<id column="user_id" jdbcType="BIGINT" property="userId"/>
<result column="account" jdbcType="VARCHAR" property="account"/>
<result column="name" jdbcType="VARCHAR" property="name"/>
<result column="email" jdbcType="VARCHAR" property="email"/>
<result column="password" jdbcType="VARCHAR" property="password"/>
<result column="google_code" jdbcType="VARCHAR" property="googleCode"/>
<result column="avator" jdbcType="VARCHAR" property="avator"/>
<result column="enabled" jdbcType="TINYINT" property="enabled"/>
<result column="remark" jdbcType="VARCHAR" property="remark"/>
<result column="create_time" jdbcType="TIMESTAMP" property="createTime"/>
</resultMap>
<select id="getUser" resultMap="BaseResultMap">
select * from web_user limit 1
</select>
<insert id="insertUser" >
insert into web_user (username,password) values (#{username},#{password})
</insert>
</mapper>
- service代码如下
@Service
public class UserService {
@Autowired
private UserMapper userMapper;
public User getUsers(){
return userMapper.getUser();
}
/**
* 事务
*/
@Transactional
public void insertUser() {
userMapper.insertUser("张三","测试");
//模拟出错
int i = 5 / 0;
userMapper .insertUser("李四","测试事务");
}
}
- 控制器代码
@RestController
public class UserController {
@Autowired
private UserService userService;
@GetMapping("/users")
public User getUser(){
User user = userService.getUsers();
return user;
}
/**
* 为了省事就不适用postmapping了,直接请求
* @return
*/
@RequestMapping("/insert")
public String insert(){
userService.insertUser();
return "insert";
}
}
- 启动后访问
localhost:8080/users
,也是可以获取到的,事务也是没问题的
注意
mapper接口可以再每个mapper文件都加上@Mapper注解,也可以不加注解,直接在启动器上加@MapperScan(“com.apdoer.springboot-mybatis.com.mapper”) 指定扫描的包路径
如果出现了Invalid bound statement (not found)
问题,可以参考以下几种解决方式1,mapper.xml文件的命名空间是否正确(namespace)
2.接口中的方法在xml文件中是否存在
3.select没有正确配置resultMap
4.mapper.xml扫描路径是否配置正确
5.接口名与文件名不需要一模一样,只要xml的namespce与接口全名对应就可以了,但是建议写一样
6.注意空格! 注意空格! 注意空格!
最后
本章代码在git仓库