美文网首页
基于Spring Boot 使用Mybatis + Druid访

基于Spring Boot 使用Mybatis + Druid访

作者: 一起码 | 来源:发表于2020-03-04 16:24 被阅读0次

    概述

    MyBatis简介

    MyBatis是支持定制化SQL、存储过程以及高级映射的优秀的持久层框架,详细介绍可参考官网,其优缺点如下,

    MyBatis优点

    • 可以手写SQL,支持编写动态SQL语句(XML中使用if、else),并且手写的SQL容易优化
    • SQL可写在XML里,从程序中彻底分离,降低耦合度
    • 学习成本较低,基本没有学习成本

    MyBatis缺点

    • SQL语句编写的工作量较大,尤其是字段多,关联表较多时,不过可以使用mybatis-generate插件解决
    • SQL语句依赖于数据库,导致数据库移植性差,不能随意更换数据库

    MyBatis适用场景

    MyBatis专注于SQL本身,试一个足够灵活的DAO层解决方案,对性能要求较高或者需求变化较多的项目,如互联网项目,MyBatis将是不错的选择。

    Druid简介

    Druid是阿里开源的一个JDBC组件库,包含数据库连接池、SQL Parser等组件,并且内置强大的监控功能,监控特性不影响性能,功能强大,能防止SQL注入,内置Loging能诊断Hack应用行为

    项目实战

    依赖配置

    创建Spring Boot项目,在pom中加入MyBatis、MySQL、Druid依赖,版本version信息详见parent pom,具体代码可参考github

            <!-- mybatis -->
            <dependency>
                <groupId>org.mybatis.spring.boot</groupId>
                <artifactId>mybatis-spring-boot-starter</artifactId>
            </dependency>
    
            <!-- mysql -->
            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
            </dependency>
            <!-- druid 连接池 -->
            <dependency>
                <groupId>com.alibaba</groupId>
                <artifactId>druid-spring-boot-starter</artifactId>
            </dependency>
    

    配置文件

    application.yml

    spring:
      datasource:
        # 数据库驱动
        driver-class-name: com.mysql.cj.jdbc.Driver
        # 数据库地址
        url: 'jdbc:mysql://localhost:3306/test?zeroDateTimeBehavior=convertToNull&useUnicode=true&characterEncoding=utf-8
        &serverTimezone=Asia/Shanghai&useSSL=false'
        username: root
        password: root
        
        druid:
          # 初始化大小、最小或最大
          initial-size: 5
          min-idle: 5
          max-active: 20
          # 获取连接等待超时的时间,单位毫秒
          max-wait: 60000
          # 配置间隔多久进行一次检测,检测需要关闭的空闲连接,单位是毫秒
          time-between-eviction-runs-millis: 60000
          # 配置一个连接在连接池中的最小生存时间,单位是毫秒
          min-evictable-idle-time-millis: 300000
          validation-query: SELECT 1
          test-while-idle: true
          test-on-borrow: false
          test-on-return: false
          # 打开PSCache,并且制定每个连接上PSCache的大小
          pool-prepared-statements: true
          max-pool-prepared-statement-per-connection-size: 20
          # 配置监控统计拦截的filters,去掉后监控界面sql无法统计,wall用于防火墙
        
    mybatis:
      # MyBatis 配置是否开启
      check-config-location: true
      # MyBatis配置文件位置,与check-config-location配合使用
      config-location: classpath:mybatis/mybatis-config.xml
      # mapper 文件存放位置
      mapper-locations: classpath*:mapper/*Mapper.xml
    
    logging:
      level:
        # 日志打印级别,可具体到包、类
        com.kk.domain.mapper: debug
    

    Spring Boot 会自动加载 spring.datasource.* 相关配置,数据源就会自动注入到 sqlSessionFactory 中,sqlSessionFactory 会自动注入到 Mapper 中,对了,你一切都不用管了,直接拿起来使用就行了。

    mybatis-config.xml

    在src/main/resources/mybatis下创建mybatis-config.xml,该文件是MyBatis的全局配置文件,包含以下几种类型的配置,这些配置必须按以下顺序配置
    propertis(属性)、settings(全局配置参数)、typeAliases(类型别名)、typeHandlers(类型处理器)、objectFactory(对象工厂)、plugins(插件)、environments(环境集合熟悉对象)、transactionManager(事务管理)、dataSource(数据源)、mappers(映射器),可到官网查看详细配置

    druid配置类

    与多数据源或者动态数据源类似,在src/main/java/com/kk/infrastructure/config下定义一个配置类用于接收Druid配置,

    @Configuration
    public class DataSourceConfig {
    
        @Value("${spring.datasource.url}")
        private String jdbcUrl;
    
        @Value("${spring.datasource.username}")
        private String username;
    
        ... 详细代码可参考github
    
        @Value("${spring.datasource.druid.max-pool-prepared-statement-per-connection-size}")
        private int maxPoolPreparedStatementPerConnectionSize;
    
        @Bean
        @Primary // 主数据源
        public DataSource dataSource() {
            DruidDataSource dataSource = new DruidDataSource();
            dataSource.setUrl(jdbcUrl);
            dataSource.setUsername(username);
            dataSource.setPassword(password);
            dataSource.setDriverClassName(driverClassName);
    
            dataSource.setInitialSize(initialSize);
            ... 详细代码可参考github
     dataSource.setMaxPoolPreparedStatementPerConnectionSize(maxPoolPreparedStatementPerConnectionSize);
            
            return dataSource;
        }
    
    }
    

    创建实体类

    使用@Alias注解标识类”别名“,具体代码可参考github,本项目采用DDD目录分层,在src/main/java/com/kk/domain/entity 下创建User POJO类

    @Alias("user")
    public class User {
    
        private int id;
        private String userName;
        private String userPassword;
    
        public User(String userName, String userPassword) {
            this.userName = userName;
            this.userPassword = userPassword;
        }
        
        set、get方法...
    

    Mapper接口类

    在src/main/java/com/kk/domain/mapper 下创建UserMapper interface,在类上增加@Mapper注解或者在启动类上增加@MapperScan注解,扫描指定的包就不需要每个mapper增加注解了

    @Mapper
    public interface UserMapper {
    
        User findUserByUserName(String userName);
    
        void updateUserByUserName(User user);
    
        void deleteUserByUserName(String userName);
    
        void saveUser(User user);
    
        List<User> getUserList();
    }
    

    Mapper xml配置文件

    在src/main/resources/mapper下创建UserMapper.xml 对应UserMapper接口类的方法

    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD SQL Mapper 3.0//EN"
            "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    <mapper namespace="com.kk.domain.mapper.UserMapper">
        <resultMap id="user" type="com.kk.domain.entity.User"/>
        <parameterMap id="user" type="com.kk.domain.entity.User"/>
        <select id="findUserByUserName" parameterType="String" resultMap="user">
            SELECT * FROM user WHERE user_name = #{1}
        </select>
    
        <update id="updateUserByUserName" parameterMap="user">
            UPDATE user SET user_password = #{userPassword} WHERE user_name = #{userName}
        </update>
    
        <delete id="deleteUserByUserName" parameterType="String">
            DELETE FROM user WHERE user_name = #{1}
        </delete>
    
        <!-- 使用alias自定义的parameterType -->
        <insert id="saveUser" parameterType="user">
            INSERT INTO user (user_password, user_name) VALUES (#{userPassword}, #{userName})
        </insert>
    
        <select id="getUserList" resultMap="user">
            SELECT * FROM user
        </select>
    </mapper>
    

    注:select 标签用于执行查询,多一个resultType用于接收返回类型,resultMap用于建立SQL查询结果字段与实体属性的映射关系

    启动类

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

    测试Controller

    在src/main/java/com/kk/userinterface.controller下创建UserController类用于测试采用的增加、删除、修改、查询操作,可使用注释的url在浏览起中进行测试

    @RestController
    @RequestMapping("/user")
    public class UserController {
    
        @Autowired
        private UserMapper userMapper;
    
        // http://localhost:8071/user/getUser?username=kk
        @RequestMapping("/getUser")
        public String getUser(String username) {
            User user = userMapper.findUserByUserName(username);
            return user != null ? username + " password is " + user.getUserPassword() : "no exist " + username;
        }
    
        // http://localhost:8071/user/addUser?username=kk&password=123456
        @RequestMapping("addUser")
        public String addUser(String username, String password) {
            User user = new User(username, password);
            userMapper.saveUser(user);
            return "success";
        }
    
        // http://localhost:8071/user/updateUser?username=kk&password=abc123
        @RequestMapping("/updateUser")
        public String updateUser(String password, String username) {
            User user = new User(username, password);
            userMapper.updateUserByUserName(user);
            return "success";
        }
    
        // http://localhost:8071/user/deleteUser?username=kk
        @RequestMapping("/deleteUser")
        public String deleteUser(String username) {
            userMapper.deleteUserByUserName(username);
            return "success";
        }
    
        // http://localhost:8071/user/getUserList
        @RequestMapping("/getUserList")
        public List getUserList() {
            return userMapper.getUserList();
        }
    }
    

    示例代码

    基于Spring Boot 使用Mybatis + Druid访问MySQL spring-boot-demo

    相关文章

      网友评论

          本文标题:基于Spring Boot 使用Mybatis + Druid访

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