美文网首页
SpringBoot:9、整合MyBatis

SpringBoot:9、整合MyBatis

作者: 程序员小H | 来源:发表于2019-10-28 21:14 被阅读0次

    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.html
    MyBatis 的配置文件包含了会深深影响 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 发布!

    相关文章

      网友评论

          本文标题:SpringBoot:9、整合MyBatis

          本文链接:https://www.haomeiwen.com/subject/harivctx.html