SpringBoot:9、整合MyBatis

1、MyBatis介绍

MyBatis的官方定义:MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生类型、接口和 Java 的 POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。

2、MyBatis配置

官方文档说明:https://mybatis.org/mybatis-3/zh/configuration.htmlMyBatis 的配置文件包含了会深深影响 MyBatis 行为的设置和属性信息。 配置文档的顶层结构如下:

  • configuration(配置)
    • properties(属性):属性文件在实际应用中一般采用Spring进行配置,而不是MyBatis。
    • settings(设置):这是 MyBatis 中极为重要的调整设置,它们会改变 MyBatis 的运行时行为,可以配置映射规则,如自动映射和驼峰映射、执行器、缓存等,具体配置项可以参考官方文档:https://mybatis.org/mybatis-3/zh/configuration.html#settings
    • typeAliases(类型别名):类型别名是为 Java 类型设置一个短的名字。 它只和 XML 配置有关,存在的意义仅在于用来减少类完全限定名的冗余。
    • typeHandlers(类型处理器):在MyBatis写入和读取数据库的过程中对于不同类型的数据(Java对应JavaType,数据库对应JdbcType)进行自定义转换。
    • objectFactory(对象工厂):MyBatis 每次创建结果对象的新实例时,它都会使用一个对象工厂(ObjectFactory)实例来完成。 默认的对象工厂需要做的仅仅是实例化目标类,要么通过默认构造方法,要么在参数映射存在的时候通过参数构造方法来实例化。 如果想覆盖对象工厂的默认行为,则可以通过创建自己的对象工厂来实现。
    • plugins(插件):也可以成为拦截器,通过动态代理和责任链模式来完成,可以修改MyBatis底层的实现功能。
    • environments(环境配置):可以配置数据库连接内容和事务,一般可以交给Spring托管。
      • environment(环境变量)
        • transactionManager(事务管理器)
        • dataSource(数据源)
    • databaseIdProvider(数据库厂商标识):允许MyBatis配置多类型数据库支持。
    • mappers(映射器):提供SQL和POJO映射关系。

3、实战

3.1 创建项目

创建一个项目springboot-mybatis,引入相关依赖:

<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.1.1</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.1.10</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

3.2 代码清单

SQL脚本

-- ----------------------------
-- Table structure for t_user
-- ----------------------------
DROP TABLE IF EXISTS `t_user`;
CREATE TABLE `t_user` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '用户ID',
  `name` varchar(10) DEFAULT '' COMMENT '用户姓名',
  `password` varchar(32) DEFAULT '' COMMENT '密码',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;

INSERT INTO `t_user` VALUES (1, '小H', '123456');
INSERT INTO `t_user` VALUES (2, '萧炎', '123456');

用户实体对象:User.java

public class User {

    // 主键
    private String id;
    // 用户名
    private String name;
    // 密码
    private String password;
    // 省略掉getter、setter、toString
}

dao层接口:UserDao.java

@Mapper
public interface UserDao {
    List<User> findAll();
}

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="com.xiaoh.springboot.mybatis.dao.UserDao">

    <!-- 可根据自己的需求,是否要使用 -->
    <resultMap type="com.xiaoh.springboot.mybatis.domain.User" id="userMap">
        <result property="id" column="id"/>
        <result property="name" column="name"/>
        <result property="password" column="password"/>
    </resultMap>

    <sql id="Base_Column_List">
        id,
        name,
        password
    </sql>

    <select id="findAll" resultMap="userMap">
        SELECT <include refid="Base_Column_List"/> FROM t_user
    </select>

</mapper>

注意:UserDao中的方法名需要与UserMapper.xml中方法保持一致。
SQL 映射文件只有很少的几个顶级元素(按照应被定义的顺序列出):

  • cache:对给定命名空间的缓存配置cache-ref – 对其他命名空间缓存配置的引用
  • cache-ref:对其他命名空间缓存配置的引用
  • resultMap:是最复杂也是最强大的元素,用来描述如何从数据库结果集中来加载对象
  • sql:可被其他语句引用的可重用语句块
  • insert:映射插入语句
  • update:映射更新语句
  • delete: 映射删除语句
  • select:映射查询语句
    具体的元素细节可以参考官方文档:https://mybatis.org/mybatis-3/zh/sqlmap-xml.html

service层接口:UserService.java

public interface UserService {
    List<User> findAll();
}

UserServiceImpl.java

@Service
public class UserServiceImpl implements UserService {

    @Autowired
    UserDao userDao;

    @Override
    public List<User> findAll() {
        return userDao.findAll();
    }
}

配置文件:application.yml

spring:
  datasource:
    url: jdbc:mysql://172.16.6.31:3306/test
    username: root
    password: 123456
    driver-class-name: com.mysql.jdbc.Driver
    type: com.alibaba.druid.pool.DruidDataSource
    initialSize: 5
    minIdle: 5
    maxActive: 20
    maxWait: 60000
    timeBetweenEvictionRunsMillis: 60000
    minEvicableIdleTimeMillis: 300000
    validationQuery: SELECT 1 FROM DUAL
    testWhileIdle: true
    testOnBorrow: false
    testOnReturn: false
    poolPreparedStatements: true
    maxPoolPreparedStatementPerConnectionSize: 20
    filters: stat,wall,log4j
    connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000
    useGlobalDataourceStat: true
mybatis:
  # 配置MyBatis映射文件
  mapper-locations: classpath*:/mapper/*Mapper.xml
  # MyBatis扫描包别名
  type-aliases-package: com.xiaoh.springboot.mybatis.domain

写个Controller测试,UserController.java

@RestController
public class UserController {

    @Autowired
    private UserService userService;

    @RequestMapping(value = "/users")
    public List<User> findAll() {
        return userService.findAll();
    }
}

数据库配置类:DruidConfiguration.java

@Configuration
public class DruidConfiguration {

    private static final Logger logger = LoggerFactory.getLogger(DruidConfiguration.class);

    private static final String DB_PREFIX = "spring.datasource";

    @Bean
    public ServletRegistrationBean druidServlet() {
        logger.info("init Druid Servlet Configuration ");
        ServletRegistrationBean servletRegistrationBean = new ServletRegistrationBean(new StatViewServlet(), "/druid/*");
        // IP白名单
        servletRegistrationBean.addInitParameter("allow", "127.0.0.1");
        // IP黑名单(共同存在时,deny优先于allow)
        servletRegistrationBean.addInitParameter("deny", "192.168.1.100");
        //控制台管理用户
        servletRegistrationBean.addInitParameter("loginUsername", "admin");
        servletRegistrationBean.addInitParameter("loginPassword", "9527");
        //是否能够重置数据 禁用HTML页面上的“Reset All”功能
        servletRegistrationBean.addInitParameter("resetEnable", "false");
        return servletRegistrationBean;
    }

    @Bean
    public FilterRegistrationBean filterRegistrationBean() {
        FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean(new WebStatFilter());
        filterRegistrationBean.addUrlPatterns("/*");
        filterRegistrationBean.addInitParameter("exclusions", "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*");
        return filterRegistrationBean;
    }
}

SpringbootMybatisApplication.java

@SpringBootApplication
@MapperScan(value = "com.xiaoh.springboot.mybatis.dao")
public class SpringbootMybatisApplication {

    public static void main(String[] args) {
        SpringApplication.run(SpringbootMybatisApplication.class, args);
    }
}

4、测试

启动项目,浏览器访问:http://localhost:8080/users ,结果如下:
file

5、源码

GitHub:https://github.com/chenjiecg/springboot

本文由博客一文多发平台 OpenWrite 发布!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值