与mybatis的初次会面
接触springboot也不过月余,由于工作需要,jdbctemplate冗杂的sql拼接已经不再符合接下来的深入学习。我迫切地意识到,倘若不用
spring-data-jpa操纵数据库,那就用mybatis吧。作为当前最流行的持久层框架之一,不学习它的方法,相当于与时代脱轨了。
首先,得知道集成mybatis的方法有哪些。其实大致也就两种:1、基于注解;2、基于xml配置文件。
不管使用哪种方法,引入mybatis的pom依赖都是必不可少的步骤。
a.在pom文件中添加mybatis-spring-boot-starter依赖以及mysql数据库驱动依赖:
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.1.1</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.21</version>
</dependency>
b. 然后,在数据库中新建一张user表:
c.在application.properties中添加mysql数据源:
spring.datasource.url=jdbc:mysql://localhost:3306/test
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
使用基于注解的方式
1.表建好后,在domain文件夹下新建一个User实体类,实体类的属性与数据库属性名称与数据类型一一对应。
public class User {
private Long id;
private String name;
private Integer age;
//省略get和set方法
}
2.在mapper文件夹下创建UserMapper接口:
import com.liqiaoqi.domain.User;
import org.apache.ibatis.annotations.*;
import org.springframework.stereotype.Component;
@Mapper
//该注解是解决IDEA mapper注入时显示could not autowire的问题
@Component(value = "userMapper")
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 insert(@Param("name") String name, @Param("age") Integer age);
}
注意:@Mapper注解必须加上。如果Mapper接口很多,可以直接在Application类前添加@MapperScan("mapper所在包名")注解。
@Component注解也可以不加,前提是在用@Autowired注解注入mapper时不提示“could not autowired”错误。
3.在service文件夹下添加UserService类:
@Service
public class UserService {
@Autowired
private UserMapper userMapper;
public String findByName(){
userMapper.insert("pinky",20);
User u = userMapper.findByName("pinky");
return u.getName();
}
}
4.然后在controller文件夹下添加UserController类:
@RestController
public class UserController {
@Autowired
private UserService userService;
@RequestMapping("/test")
public String findByName(){
return userService.findByName();
}
}
然后运行项目访问路径查看即可。
使用xml配置文件的方式
与基于注解方法不同,使用xml配置文件方法时,sql语句不在mapper接口中定义,而是剥离出来,在xml文件中单独定义。
这样做的好处是能够使得sql语句更为灵活也更利于维护。
但两种集成方法大致是一样的,主要有以下区别:
1.UserMapper中不写@Select注解。
import com.liqiaoqi.domain.User;
import org.apache.ibatis.annotations.*;
import org.springframework.stereotype.Component;
@Mapper
//该注解是解决IDEA mapper注入时显示could not autowire的问题
@Component(value = "userMapper")
public interface UserMapper {
User findByName(@Param("name") String name);
int insert(@Param("name") String name, @Param("age") Integer age);
}
2.在application.properties文件中添加mybatis的配置信息:
mybatis.config-locations=classpath:mybatis/mybatis-config.xml
mybatis.mapper-locations=classpath:mybatis/mapper/*.xml
mybatis.typeAliasesPackage=com.liqiaoqi.domain
3.添加UserMapper.xml。实现UserMapper映射的方法(即sql语句)将全部定义在该文件中。
<?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.liqiaoqi.mapper.UserMapper" >
<resultMap id="UserResultMap" type="com.liqiaoqi.domain.User">
<id property="id" column="id" />
<result property="name" column="name" />
<result property="age" column="age" />
</resultMap>
<insert id="insert">
INSERT INTO
user
(name,age)
VALUES
(#{name},#{age})
</insert>
<select id="findByName" resultType="com.liqiaoqi.domain.User" >
SELECT *
FROM user
WHERE name = #{name}
</select>
</mapper>
除以上三点与基于注解方法稍有不同外,其余部分全部不作改变。两种方法结果相同。
以下是项目的完整结构:
以上源码:示例代码
参考资料