Spring Boot整合mybatis
mybatis与Spring Boot的整合
有两种方式:
1、使用mybatis官方提供的Spring Boot整合包。
2、使用Spring和mybatis的整合方式
如何选择?
根据项目需要,来进行选择。
例如:如果是简单的CRUD,明显使用第一种方式。如果比较复杂,且涉及到多个表的,建议使用第二种方式,这样可以很方便的控制Mybatis的各种配置。
一、使用mybatis官方提供的Spring Boot整合包。
这里使用的是maven,所以首先导入相关的依赖。
<dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>1.0.0</version> </dependency>
在application.properties配置mysql的连接配置
spring.datasource.driver-class-name=com.mysql.jdbc.Driver spring.datasource.url=jdbc:mysql://localhost:3306/springboot?useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull&serverTimezone=GMT spring.datasource.username=root spring.datasource.password=mysqladmin
在mysql数据库中创建一个User表
CREATE TABLE `user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(100) DEFAULT NULL,
`age` int(11) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8
创建User表的映射实体类User
public class User {
private Long id;
private String name;
private int age;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
创建UserMapper
@MapperScan
public interface UserMapper {
@Select("select * from user where name = #{name}")
User findByName(@Param("name") String name);
@Insert("insert into User(name, age) values(#{name}, #{age})")
int insertUser(@Param("name") String name, @Param("age") int age);
}
进行单元测试
@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = DemoApplication.class) //DemoApplication为该项目的入口类
public class DemoApplicationTests {
@Autowired
private UserMapper userMapper;
@Test
public void find() throws Exception {
userMapper.insertUser("126", 16);
User u = userMapper.findByName("126");
Assert.assertEquals(16, u.getAge());
}
}
二、使用Spring和mybatis的整合方式
在这里我使用了通用Mapper
首先,建立一个Spring Boot项目
导入相关的依赖
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jdbc</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> </dependency> <!-- Mybatis --> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.2.8</version> </dependency> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis-spring</artifactId> <version>1.2.2</version> </dependency> <!-- 通用Mapper --> <dependency> <groupId>com.github.abel533</groupId> <artifactId>mapper</artifactId> <version>2.3.4</version> </dependency> <!-- 连接池 --> <dependency> <groupId>com.jolbox</groupId> <artifactId>bonecp-spring</artifactId> <version>0.8.0.RELEASE</version> </dependency>
在application.properties配置mysql的连接配置
spring.datasource.type=com.jolbox.bonecp.BoneCPDataSource spring.datasource.driver-class-name=com.mysql.jdbc.Driver spring.datasource.url=jdbc:mysql://localhost:3306/springboot?useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull&serverTimezone=GMT spring.datasource.username=root spring.datasource.password=mysqladmin
使用bonecp连接池,spring.datasource.type=com.jolbox.bonecp.BoneCPDataSource
创建mybatis的配置类MybatisConfig
import org.mybatis.spring.SqlSessionFactoryBean; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.core.io.Resource; import org.springframework.core.io.support.PathMatchingResourcePatternResolver; import org.springframework.core.io.support.ResourcePatternResolver; import javax.sql.DataSource; @Configuration public class MybatisConfig { @Autowired private DataSource dataSource; @Bean @ConditionalOnMissingBean //当容器没有指定的Bean的情况下创建该对象 public SqlSessionFactoryBean sqlSessionFactoryBean(){ SqlSessionFactoryBean sqlSessionFactoryBean=new SqlSessionFactoryBean(); //设置数据源 sqlSessionFactoryBean.setDataSource(dataSource); //设置mybatis的主配置文件 ResourcePatternResolver resourcePatternResolver=new PathMatchingResourcePatternResolver(); Resource mybatisXml=resourcePatternResolver.getResource("classpath:mybatis-config.xml"); sqlSessionFactoryBean.setConfigLocation(mybatisXml); //设置别名包 sqlSessionFactoryBean.setTypeAliasesPackage("com.example.demo.pojo"); return sqlSessionFactoryBean; } }
建立mybatis的主配置文件
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration> <settings> <!-- 驼峰的自动映射 --> <setting name="mapUnderscoreToCamelCase" value="true" /> </settings> <plugins> <plugin interceptor="com.github.abel533.mapperhelper.MapperInterceptor"> <!--主键自增回写方法,默认值MYSQL--> <property name="IDENTITY" value="MYSQL" /> <!--通用Mapper接口,多个通用接口用逗号隔开 --> <property name="mappers" value="com.github.abel533.mapper.Mapper" /> </plugin> </plugins> </configuration>
建立Mapper接口的扫描类MapperScannerConfig
import org.mybatis.spring.mapper.MapperScannerConfigurer;
import org.springframework.boot.autoconfigure.AutoConfigureAfter;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
@AutoConfigureAfter(MybatisConfig.class) //保证在MyBatisConfig实例化之后再实例化该类
public class MapperScannerConfig {
/*
mapper接口的扫描器
*/
@Bean
public MapperScannerConfigurer mapperScannerConfigurer(){
MapperScannerConfigurer mapperScannerConfigurer=new MapperScannerConfigurer();
mapperScannerConfigurer.setBasePackage("com.example.demo.mapper");
return mapperScannerConfigurer;
}
}
创建User表的映射实体类User
import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.Table; @Table(name="user") public class User { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String name; private int age; public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(Integer age) { this.age = age; } }
创建UserMapper接口
import com.example.demo.pojo.User; import com.github.abel533.mapper.Mapper; import org.apache.ibatis.annotations.Insert; import org.apache.ibatis.annotations.Param; import org.apache.ibatis.annotations.Select; public interface UserMapper extends Mapper<User> { @Select("select * from user where name = #{name}") User findByName(@Param("name") String name); @Insert("insert into User(name, age) values(#{name}, #{age})") int insertUser(@Param("name") String name, @Param("age") int age); }
单元测试
@RunWith(SpringJUnit4ClassRunner.class) @SpringApplicationConfiguration(classes = DemoApplication.class) //DemoApplication为该项目的入口类 public class DemoApplicationTests { @Autowired private UserMapper userMapper; @Test public void find() throws Exception { User user=new User(); user.setName("ceshi"); user.setAge(19); userMapper.insertSelective(user); User u = userMapper.findByName("126"); Assert.assertEquals(16, u.getAge()); } }
目录结构如下: