参考:
官方文档
http://www.ityouknow.com/springboot/2016/11/06/spring-boo-mybatis.html
https://github.com/pagehelper/pagehelper-spring-boot
无xml
整合就是不使用*.xml
文件,全部都是用注解来绑定SQL
。
SpringBoot
整合Mybatis
,首先需要引入mybatis-spring-boot-starter
依赖:
<dependency>
<groupId>org.mybatis.spring.bootgroupId>
<artifactId>mybatis-spring-boot-starterartifactId>
<version>1.3.2version>
dependency>
mybatis-spring-boot-starter
将会:
DataSource
。SqlSessionFactoryBean
创建并注册一个SqlSessionFactory
实例,并配置DataSource
。SqlSessionFactory
创建并注册一个SqlSessionTemplate
实例。@Mapper
注解类,并关联SqlSessionTemplate
,将它们注册到Spring Context
中。这里以postgresql
为例。
首先,需要在pom.xml
中引入postgresql
驱动:
<dependency>
<groupId>org.postgresqlgroupId>
<artifactId>postgresqlartifactId>
<scope>runtimescope>
dependency>
然后,需要在application.properties
配置文件中配置数据源:
# 配置数据源
spring.datasource.driver-class-name=org.postgresql.Driver
spring.datasource.url=jdbc:postgresql://127.0.0.1:5432/springbootstarter?useUnicode=true&characterEncoding=UTF-8
spring.datasource.username=postgres
spring.datasource.password=password
进行简单的Mybatis
配置,所有可配置属性请查看 这里 和 这里:
# Mybatis基本配置
# 自动驼峰命名转换
mybatis.configuration.map-underscore-to-camel-case=true
# 设置驱动等待数据库返回response的超时时间,单位(秒)
mybatis.configuration.default-statement-timeout=30
有两种方法可以让Mybatis
检测到mapper
,也就是Dao
。一种是在每个mapper
上面添加@Mapper
注解,一种是通过在启动类(配置类)上添加@MapperScan
注解来指定mapper
的位置。推荐使用第二种:
可以在启动类Application
上添加@MapperScan
:
@SpringBootApplication
@MapperScan({"com.tao.springbootstarter.web.dao", "com.tao.springbootstarter.core.dao"})
public class Application extends SpringBootServletInitializer {
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
return builder.sources(Application.class);
}
public static void main(String[] args) {
SpringApplication app = new SpringApplication(Application.class);
// 执行run方法
app.run(args);
}
}
@MapperScan
支持指定一个或多个package
路径。
在@MapperScan
指定的package
路径下编写Dao
。
以UserDao
为例:
public interface UserDao {
/**
* 获得所有的用户
*
* @return
*/
@Select("select user_id, username, password, create_time from tb_user")
@Results(id = "baseResultMap", value = {
@Result(column = "user_id", property = "userId", jdbcType = JdbcType.VARCHAR, javaType = String.class),
@Result(column = "username", property = "username", jdbcType = JdbcType.VARCHAR, javaType = String.class),
@Result(column = "password", property = "password", jdbcType = JdbcType.VARCHAR, javaType = String.class),
@Result(column = "create_time", property = "createTime", jdbcType = JdbcType.TIMESTAMP, javaType = Timestamp.class)
})
List<User> list();
/**
* 根据username获取User对象
*
* @param username
* @return
*/
@Select("select user_id, username, password, create_time from tb_user where username = #{username}")
@ResultMap("baseResultMap")
User queryUserByUsername(@Param("username") String username);
}
这里使用了注解来绑定SQL
语句:
@Select
是查询类的注解,所有的查询均使用这个。@Result
修饰返回的结果集,关联实体类属性和数据库字段一一对应,如果实体类属性和数据库属性名保持一致,就不需要这个属性来修饰。@Insert
插入数据库使用,直接传入实体类会自动解析属性到对应的值。@Update
负责修改,也可以直接传入对象。@Delete
负责删除。为了简化代码,减少不必要的重复编写@Results
,可以给@Results
设置一个id
,然后就可以使用@ResultMap
来引用它。
注意,使用#符号和$符号的不同:
// This example creates a prepared statement, something like select * from teacher where name = ?;
@Select("Select * from teacher where name = #{name}")
Teacher selectTeachForGivenName(@Param("name") String name);
// This example creates n inlined statement, something like select * from teacher where name = 'someName';
@Select("Select * from teacher where name = '${name}'")
Teacher selectTeachForGivenName(@Param("name") String name);
User
类的编写不再赘述。
这里省略Service
层的编写,直接在Controller
注入UserDao
:
@RestController
@RequestMapping("/userService")
public class UserController {
@Resource
private UserDao userDao;
@GetMapping("/users")
public List<User> getAllUsers() {
return userDao.list();
}
@GetMapping("/users/username/{username}")
public User getUserByUsername(@PathVariable("username") String username) {
return userDao.queryUserByUsername(username);
}
}
基于xml
就是不使用注解来绑定SQL
,而是用*.xml
文件来管理SQL
。
SpringBoot
整合Mybatis
,首先需要引入mybatis-spring-boot-starter
依赖:
<dependency>
<groupId>org.mybatis.spring.bootgroupId>
<artifactId>mybatis-spring-boot-starterartifactId>
<version>1.3.2version>
dependency>
这里以postgresql
为例。
首先,需要在pom.xml
中引入postgresql
驱动:
<dependency>
<groupId>org.postgresqlgroupId>
<artifactId>postgresqlartifactId>
<scope>runtimescope>
dependency>
然后,需要在application.properties
配置文件中配置数据源:
# 配置数据源
spring.datasource.driver-class-name=org.postgresql.Driver
spring.datasource.url=jdbc:postgresql://127.0.0.1:5432/springbootstarter?useUnicode=true&characterEncoding=UTF-8
spring.datasource.username=postgres
spring.datasource.password=password
基于
xml
整合,需要配置*.xml
的位置。
在application.properties
文件中添加两行:
# 指定mybatis的配置文件的位置
mybatis.config-location=classpath:mybatis/mybatis-config.xml
# 指定mapper文件的位置
mybatis.mapper-locations=classpath:mybatis/mapper/*.xml
在mybatis-config.xml
文件中可以进行mybatis
的一些基础配置,例如:
<configuration>
<settings>
<setting name="useGeneratedKeys" value="true"/>
<setting name="useColumnLabel" value="true"/>
<setting name="mapUnderscoreToCamelCase" value="true"/>
<setting name="lazyLoadingEnabled" value="true"/>
<setting name="defaultStatementTimeout" value="30"/>
settings>
<typeAliases>
<typeAlias type="java.lang.Integer" alias="Integer"/>
<typeAlias type="java.lang.String" alias="String"/>
<typeAlias type="java.lang.Long" alias="Long"/>
<typeAlias type="java.util.ArrayList" alias="ArrayList"/>
<typeAlias type="java.util.LinkedList" alias="LinkedList"/>
<typeAlias type="java.util.HashMap" alias="HashMap"/>
<typeAlias type="java.util.LinkedHashMap" alias="LinkedHashMap"/>
typeAliases>
configuration>
和前边一样,可以在启动类Application
上添加@MapperScan
:
@SpringBootApplication
@MapperScan({"com.tao.springbootstarter.web.dao", "com.tao.springbootstarter.core.dao"})
public class Application extends SpringBootServletInitializer {
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
return builder.sources(Application.class);
}
public static void main(String[] args) {
SpringApplication app = new SpringApplication(Application.class);
// 执行run方法
app.run(args);
}
}
@MapperScan
支持指定一个或多个package
路径。
编写Dao
的时候不需要使用@Select
等注解。
以UserDao
为例:
public interface UserDao {
/**
* 获得所有的用户
*
* @return
*/
List<User> list();
/**
* 根据username获取User对象
*
* @param username
* @return
*/
User queryUserByUsername(@Param("username") String username);
}
每个Dao
需要编写一个对应的mapper
文件,需要放在mybatis.mapper-locations
指定的位置。
以UserDao.xml
为例:
<mapper namespace="com.tao.springbootstarter.web.dao.UserDao">
<resultMap id="baseResultMap" type="com.tao.springbootstarter.web.entity.User">
<id column="user_id" property="userId" jdbcType="VARCHAR" javaType="java.lang.String"/>
<result column="username" property="username" jdbcType="VARCHAR" javaType="java.lang.String"/>
<result column="password" property="password" jdbcType="VARCHAR" javaType="java.lang.String"/>
<result column="create_time" property="createTime" jdbcType="TIMESTAMP" javaType="java.sql.Timestamp"/>
resultMap>
<select id="list" resultMap="baseResultMap">
SELECT
user_id,
username,
password,
create_time
FROM tb_user
select>
<select id="queryUserByUsername" parameterType="java.lang.String" resultMap="baseResultMap">
SELECT
user_id,
username,
password,
create_time
FROM tb_user
WHERE username = #{username}
select>
mapper>
这里省略Service
层的编写,直接在Controller
注入UserDao
:
@RestController
@RequestMapping("/userService")
public class UserController {
@Resource
private UserDao userDao;
@GetMapping("/users")
public List<User> getAllUsers() {
return userDao.list();
}
@GetMapping("/users/username/{username}")
public User getUserByUsername(@PathVariable("username") String username) {
return userDao.queryUserByUsername(username);
}
}
需要在pom.xml
文件中添加pagehelper-spring-boot-starter
依赖:
<dependency>
<groupId>com.github.pagehelpergroupId>
<artifactId>pagehelper-spring-boot-starterartifactId>
<version>1.2.10version>
dependency>
在application.properties
文件中对PaheHelper
进行基本配置:
# PageHelper基本配置
###########################################################
# 配置数据库类型
pagehelper.helperDialect=postgresql
# 分页合理化参数,默认值为false。
# 当该参数设置为 true 时,pageNum<=0 时会查询第一页; pageNum>pages(超过总数时),会查询最后一页.
# 默认false 时,直接根据参数进行查询。
pagehelper.reasonable=true
# 支持通过 Mapper 接口参数来传递分页参数,默认值false
pagehelper.supportMethodsArguments=true
完整参数说明请参考:https://github.com/pagehelper/Mybatis-PageHelper/blob/master/wikis/zh/HowToUse.md
经过以上配置,就可以使用PageHelper
了。