四、整合Mybatis
整合 MyBatis 有两种方式:
1) 使用 mybatis 官方提供的 Spring Boot 整合包实现。
2) 使用 mybatis-spring 整合的方式,也就是传统的方式(推荐,此方式容易控制 MyBatis 的配置)。
4.1配置依赖
方式一:
添加依赖
<!-- mybatis -->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.3.0</version>
</dependency>
<!-- mysql 驱动包 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
配置数据库连接:
在 application.properties 中添加:
# 数据源配置
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3380/springboot?useUnicode=true&characterEncoding=utf8
spring.datasource.username=root
spring.datasource.password=tiger
# mybatis 配置
mybatis.config-location=classpath:mybatis/mybatis-config.xml
mybatis.mapper-locations=classpath:mybatis/mapper/*.xml
方式二:
添加依赖:
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.4</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.3.1</version>
</dependency>
创建配置类:
@Configuration
public class MyBatisConfiguration {
@Bean
@ConditionalOnMissingBean // 当容器里没有指定的 Bean 的情况下创建该对象
public SqlSessionFactoryBean sqlSessionFactory(DataSource dataSource) {
SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
// 设置数据源
sqlSessionFactoryBean.setDataSource(dataSource);
// 设置mybatis的主配置文件
ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
Resource mybatisConfigXml = resolver.getResource("classpath:mybatis/mybatis-config.xml");
sqlSessionFactoryBean.setConfigLocation(mybatisConfigXml);
// 设置mapper映射文件
Resource[] mapperXml;
try {
mapperXml = resolver.getResources("classpath:mybatis/mapper/*.xml");
sqlSessionFactoryBean.setMapperLocations(mapperXml);
} catch (IOException e) {
e.printStackTrace();
}
// 设置别名包
//sqlSessionFactoryBean.setTypeAliasesPackage("com.light.domain");
return sqlSessionFactoryBean;
}
@Bean
@ConditionalOnBean(SqlSessionFactoryBean.class) // 当 SqlSessionFactoryBean 实例存在时创建对象
public MapperScannerConfigurer mapperScannerConfigurer() {
MapperScannerConfigurer mapperScannerConfigurer = new MapperScannerConfigurer();
mapperScannerConfigurer.setBasePackage("com.light.dao");
return mapperScannerConfigurer;
}
}
此方式也需要在 applicaton.properties 配置数据库连接,当不需要在文件中配置 mybatis 相关参数。
以上便是两种方式的配置的不同之处。
在 src/main/resources 下创建 mybatis 文件夹,并在 mybatis 文件夹中创建 "mybatis-config.xml" 配置文件,内容如下:
<?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>
<typeAliases>
</typeAliases>
</configuration>
mybatis 文件夹下再创建一个 "mapper" 文件夹,里边存放 Mpper 接口对应的 mapper 映射文件。
4.2测试
4.2.1建表
在 MySQL 中创建名为 eichong的数据库,在该库中创建 tbl_user表:
CREATE TABLE `tbl_user` (
`user_id` INT(11) NOT NULL,
`user_account` VARCHAR(10) NOT NULL,
`user_password` VARCHAR(50) NULL DEFAULT NULL,
PRIMARY KEY (`id`)
)
ENGINE=InnoDB
;
4.2.2实体类:
public class UserDO implements Serializable {
private static final long serialVersionUID = 2147698087288992750L;
private Long userId;
private String userAccount;
private String userPassword;
get,set方法省略
4.2.3Mapper接口
@Mapper
public interface UserMapper {
void insert(UserDO userDO);
void update(UserDO userDO);
void delete(@Param("id")Long id);
UserDO getById(@Param("id") Long id);
}
service方法
@Service
//@CacheConfig(cacheNames = "user")
public class UserServiceImpl implements UserService{
@Autowired
private UserMapper userMapper;
public void add(UserDO userDO) {
userMapper.insert(userDO);
}
public void update(UserDO userDO) {
userMapper.update(userDO);
}
public UserDO getById(Long id) {
return userMapper.getById(id);
}
public void remove(Long id) {
userMapper.delete(id);
}
}
mybatis/mapper/userMapper.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="cn.lf.ow.mapper.UserMapper">
<resultMap type="cn.lf.ow.model.UserDO" id="resutUser">
<id property="userId" column="user_id"/>
<result property="userAccount" column="user_account" />
<result property="userPassword" column="user_password" />
<result property="gmtCreate" column="gmt_create" />
</resultMap>
<insert id="insert" parameterType="cn.lf.ow.model.UserDO">
insert into tbl_user (user_account,user_password) values (#{userAccount},#{userPassword});
</insert>
<update id="update" parameterType="cn.lf.ow.model.UserDO">
update tbl_user
set user_account = #{userAccount},
user_password = #{userPassword}
where user_id = #{userId}
</update>
<delete id="delete" parameterType="java.lang.Long">
delete from tbl_user where user_id = #{id}
</delete>
<select id="getById" parameterType="java.lang.Long"
resultMap="resutUser">
select user_account,user_password from tbl_user where user_id = #{id};
</select>
</mapper>
测试类:
@Controller
@RequestMapping("user")
@ResponseBody
public class UserController {
@Autowired
private UserService userService;
@GetMapping("/save")
public Map<String,Object> save(){
UserDO user = new UserDO();
user.setUserAccount("jack124");
user.setUserPassword("jack124");
user.setGmtCreate(new Date());
userService.add(user);
Map<String,Object> map = new HashMap<String,Object>();
map.put("code", "200");
map.put("msg", "保存成功");
return map;
}
@RequestMapping("get/{id}")
public Map<String,Object> get(@PathVariable("id") Long id) {
UserDO user = this.userService.getById(id);
Map<String,Object> map = new HashMap<String,Object>();
map.put("code", "200");
map.put("msg", "获取成功");
map.put("data", user);
return map;
}
@GetMapping("/update")
public Map<String,Object> update(UserDO user){
userService.update(user);
Map<String,Object> map = new HashMap<String,Object>();
map.put("code", "200");
map.put("msg", "修改成功");
return map;
}
@RequestMapping("delete/{id}")
public Map<String,Object> delete(@PathVariable("id") Long id) {
this.userService.remove(id);
Map<String,Object> map = new HashMap<String,Object>();
map.put("code", "200");
map.put("msg", "删除成功");
return map;
}
}