【SpringBoot笔记6】SpringBoot整合Mybatis和PageHelper

参考:

官方文档

http://www.ityouknow.com/springboot/2016/11/06/spring-boo-mybatis.html
https://github.com/pagehelper/pagehelper-spring-boot

1 无xml整合

xml整合就是不使用*.xml文件,全部都是用注解来绑定SQL

1.1 引入mybatis-spring-boot-starter

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中。

1.2 数据源和mybatis配置

这里以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

1.3 使用@MapperScan

有两种方法可以让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路径。

1.4 编写Dao

@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类的编写不再赘述。

1.5 使用

这里省略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);
    }
}

2 基于xml整合

基于xml就是不使用注解来绑定SQL,而是用*.xml文件来管理SQL

2.1 引入mybatis-spring-boot-starter

SpringBoot整合Mybatis,首先需要引入mybatis-spring-boot-starter依赖:

<dependency>
    <groupId>org.mybatis.spring.bootgroupId>
    <artifactId>mybatis-spring-boot-starterartifactId>
    <version>1.3.2version>
dependency>

2.2 数据源和mybatis配置

这里以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>

2.3 使用@MapperScan

和前边一样,可以在启动类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路径。

2.4 编写Dao

编写Dao的时候不需要使用@Select等注解。

UserDao为例:

public interface UserDao {

    /**
     * 获得所有的用户
     *
     * @return
     */
    List<User> list();

    /**
     * 根据username获取User对象
     *
     * @param username
     * @return
     */
    User queryUserByUsername(@Param("username") String username);
}

2.5 编写mapper文件

每个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>

2.6 使用

这里省略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);
    }
}

3 整合PageHelper

3.1 添加pagehelper-spring-boot-starter依赖

需要在pom.xml文件中添加pagehelper-spring-boot-starter依赖:


<dependency>
	<groupId>com.github.pagehelpergroupId>
	<artifactId>pagehelper-spring-boot-starterartifactId>
	<version>1.2.10version>
dependency>

3.2 配置

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

3.3 使用

经过以上配置,就可以使用PageHelper了。

你可能感兴趣的:(SpringBoot)