之前一直用的jpa,现在项目上开始用mybaits,今天想搭一个自己玩玩但是过程有点艰辛,特地记录下来。
首先引入pom依赖:
<dependencies> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus</artifactId> <version>2.3</version> </dependency> <!--注意,如果不引入这个依赖,无法注入到spring中--> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>2.3</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> <version>2.0.0.RELEASE</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.38</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <version>2.0.0.RELEASE</version> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.34</version> </dependency> </dependencies>开始由于没有引入 mybatis-plus-boot-starter依赖,一直无法注入要spring中。
接下来是写一个配置文件 application.yml:
server: port: 8083 mybatis-plus: mapper-locations: classpath:/mapper/*.xml spring: datasource: name: test url: jdbc:mysql://127.0.0.1:3306/test_mybatis?characterEncoding=utf8&allowMultiQueries=true username: root password: 123456 driver-class-name: com.mysql.jdbc.Driver
在写一个mapper:
import com.baomidou.mybatisplus.mapper.BaseMapper; import org.apache.ibatis.annotations.Mapper; import test.mybatis.plus.entity.Person; import java.util.List; @Mapper public interface PersonMapper extends BaseMapper<Person> { List<Person> selectByAge(Integer age); }PersonMapper.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="test.mybatis.plus.mapper.PersonMapper"> <select id="selectByAge" resultType="test.mybatis.plus.entity.Person" parameterType="Integer"> select t.* from person t where age = #{age} </select> </mapper>
这边由于把resultType和parameterType写成了resultMap和parameterMap,然后程序一直报错:
其实这边只要改成resultType和parameterType就可以解决了。
到这边之后调用接口发现,又报错了,真是够心累的。。。
nested exception is org.apache.ibatis.reflection.ReflectionException: Error instantiating interface test.mybatis.plus.mapper.PersonMapper with invalid types () or values (). Cause: java.lang.NoSuchMethodException: test.mybatis.plus.mapper.PersonMapper.<init>()
看报错说是PersonMapper没有初始化,原来是我们在 resultType那里返回的结果写错了,我写成了mapper的,应该是model的才对,改成model之后成功返回了结果。
太不容易了。
最后再附上Peron表的代码 以及 service和controller代码:
import com.baomidou.mybatisplus.annotations.TableField; import com.baomidou.mybatisplus.annotations.TableId; import com.baomidou.mybatisplus.annotations.TableName; import com.baomidou.mybatisplus.enums.IdType; import java.io.Serializable; @TableName("person") public class Person implements Serializable { @TableId(value = "id", type = IdType.UUID) private String id; private String name; private Integer age; @TableField(value = "address") private String address; public String getId() { return id; } public void setId(String id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } } public interface IPersonService { Person getPersonById(String id); List<Person> getPersonByAge(Integer age); void insertPerson(Person person); } import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import test.mybatis.plus.entity.Person; import test.mybatis.plus.mapper.PersonMapper; import test.mybatis.plus.service.IPersonService; import java.util.List; import java.util.UUID; @Service public class PersonServiceImpl implements IPersonService { @Autowired private PersonMapper personMapper; @Override public Person getPersonById(String id) { return personMapper.selectById(id); } @Override public List<Person> getPersonByAge(Integer age) { return personMapper.selectByAge(age); } @Override public void insertPerson(Person person) { person.setId(UUID.randomUUID().toString().replace("-","")); personMapper.insert(person); } } import com.alibaba.fastjson.JSONObject; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import test.mybatis.plus.entity.Person; import test.mybatis.plus.service.IPersonService; @RestController @RequestMapping("person") public class PersonContrller { @Autowired private IPersonService personService; @GetMapping("{id}") public String personById(@PathVariable String id){ return JSONObject.toJSONString(personService.getPersonById(id)); } @PostMapping("insert") public void insert(@RequestBody Person person){ personService.insertPerson(person); } @GetMapping("/age") public String personByAge(@RequestParam Integer age){ return JSONObject.toJSONString(personService.getPersonByAge(age)); } }
到这里一个简单的springboot集成mybaits就完成,下次再搭建一个mybaits集成分页的功能