前言
MyBatis — 半自动ORM框架,现如今,常见的持久层框架有:Hibernate,MyBatis , JPA…
MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。
步骤
引入依赖
<!--mybatis依赖 -->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.2.2</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.15</version>
</dependency>
修改配置文件 application.properties
# 数据库
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/yang?useUnicode=true&characterEncoding=utf-8&autoReconnect=true&failOverReadOnly=false&useSSL=true&zeroDateTimeBehavior=convertToNull&allowMultiQueries=true&serverTimezone=UTC
spring.datasource.username=root
spring.datasource.password=root
# mybatis
# 给实体类起别名
mybatis.type-aliases-package=com.example.canal.mybatis.entity
启动类
package com.example.canal;
import com.xpand.starter.canal.annotation.EnableCanalClient;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
@MapperScan(basePackages = "com.example.canal.mybatis.mapper")
public class CanalApplication {
public static void main(String[] args) {
SpringApplication.run(CanalApplication.class,args);
}
}
实体类
package com.example.canal.mybatis.entity;
import org.apache.ibatis.type.Alias;
@Alias("User")
public class User {
private Integer userId;
private String userName;
private String userSex;
private Integer userAge;
public Integer getUserId() {
return userId;
}
public void setUserId(Integer userId) {
this.userId = userId;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getUserSex() {
return userSex;
}
public void setUserSex(String userSex) {
this.userSex = userSex;
}
public Integer getUserAge() {
return userAge;
}
public void setUserAge(Integer userAge) {
this.userAge = userAge;
}
}
控制层
package com.example.canal.mybatis.controller;
import com.alibaba.fastjson.JSON;
import com.example.canal.mybatis.entity.User;
import com.example.canal.mybatis.service.IUserService;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import java.util.Map;
@RestController
@RequestMapping("/yang")
public class UserController {
@Resource
private IUserService userServiceImpl;
@RequestMapping(value = "/getById", method = RequestMethod.POST)
public User getById(@RequestBody String jsonString) {
Map mapTypes = JSON.parseObject(jsonString);
int id = Integer.valueOf(mapTypes.get("id").toString());
return userServiceImpl.selectUser(id);
}
}
服务层
package com.example.canal.mybatis.service;
import com.example.canal.mybatis.entity.User;
public interface IUserService {
User selectUser(int id);
}
package com.example.canal.mybatis.service;
import com.example.canal.mybatis.entity.User;
import com.example.canal.mybatis.mapper.UserMapper;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
@Service
public class UserServiceImpl implements IUserService {
@Resource
private UserMapper userMapper;
@Override
public User selectUser(int id) {
return userMapper.selectUser(id);
}
}
Mapper
package com.example.canal.mybatis.mapper;
import com.example.canal.mybatis.entity.User;
import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface UserMapper {
User selectUser(int id);
}
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.canal.mybatis.mapper.UserMapper">
<resultMap id="BaseResultMap" type="com.example.canal.mybatis.entity.User">
<result column="id" jdbcType="INTEGER" property="userId"/>
<result column="name" jdbcType="VARCHAR" property="userName"/>
<result column="sex" jdbcType="VARCHAR" property="userSex"/>
<result column="age" jdbcType="INTEGER" property="userAge"/>
</resultMap>
<select id="selectUser" resultMap="BaseResultMap" resultType="User">
select * from user where id = #{id}
</select>
<update id="updUser" parameterType="User"></update>
<delete id="delUser"></delete>
<insert id="addUser" parameterType="com.example.canal.mybatis.entity.User">
insert into user value (${id},#{name},${sex},#{age})
</insert>
</mapper>
常见问题
解决 org.apache.ibatis.binding.BindingException: Invalid bound statement (not found) 错误
1. xxx.xml 文件没有按照传统的maven架构进行放置
在构建工程的时候,如果我们的 ×××.xml 文件没有放到 src/main/resources 下面,是不会被maven build plugin给默认扫描到的。此时需要在 pom文件的 build 标签里面加入:
<build>
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>false</filtering>
</resource>
</resources>
</build>