• SpringBoot之集成数据库


    一、集成 MySQL 数据库

    1.1 配置 MySQL

    添加依赖

    <dependencies>
        <!--Spring 数据库相关依赖-->
    	<dependency>
    		<groupId>org.springframework.boot</groupId>
    		<artifactId>spring-boot-starter-data-jpa</artifactId>
    	</dependency>
    	<!--mysql 驱动依赖-->
    	<dependency>
    		<groupId>mysql</groupId>
    		<artifactId>mysql-connector-java</artifactId>
    		<scope>runtime</scope>
    	</dependency>
    </dependencies>
    

    设置配置文件

    spring:
      datasource:
        driver-class-name: com.mysql.cj.jdbc.Driver
        url: jdbc:mysql://localhost:3306/test?characterEncoding=utf8
        username: root
        password: sa000
    

    1.2 测试数据库连接

    添加测试依赖

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
    

    test/java 目录下新建测试类

    @SpringBootTest
    public class DataBaseTest {
    
        @Autowired
        private DataSource dataSource;
    
        @Test
        public void testConnection() {
            try {
                Connection connection = dataSource.getConnection();
                Assert.assertNotNull(connection);
            } catch (SQLException e) {
                fail("数据库连接获取失败,错误原因:" + e);
            }
        }
    }
    

    执行测试,发现绿条说明测试通过。

    1.3 设置连接池

    SpringBoot 在我们引入 spring-boot-starter-jdbcspring-boot-starter-data-jpa 依赖后就会默认启用连接池功能,它的连接池默认创建选择规则如下:

    • 优先寻找创建 HikariCP 连接池

    • 如果没有 HikariCP 连接池,会查找创建 Tomcat

    • 如果没有 Tomcat 连接池,会查找创建 dbcp

    • 如果没有 dbcp 连接池,会查找创建 dbcp2

    • 也可以使用 spring.datasource.type 属性指定连接池类型

      spring.datasource.type= com.zaxxer.hikari.HikariDataSource
      

    我们来通过一个测试方法验证下:

    @SpringBootTest
    public class DataBaseTest {
    
        @Autowired
        private DataSource dataSource;
    
        @Test
        public void testDataSourceType(){
            Assert.assertEquals(HikariDataSource.class,dataSource.getClass());
        }
    }    
    

    执行测试,发现绿条说明测试通过。

    常用连接池配置如下:

    #验证连接的有效性
    spring.datasource.primary.test-while-idle=true
    #获取连接时候验证,会影响性能
    spring.datasource.primary.test-on-borrow=false
    #在连接归还到连接池时是否测试该连接
    spring.datasource.primary.test-on-return=false
    spring.datasource.primary.validation-query=SELECT 1 FROM DUAL
    #空闲连接回收的时间间隔,与test-while-idle一起使用,设置5分钟
    spring.datasource.primary.time-between-eviction-runs-millis=300000
    #连接池空闲连接的有效时间 ,设置30分钟
    spring.datasource.primary.min-evictable-idle-time-millis=1800000
    spring.datasource.primary.initial-size=5
    #指定连接池中最大的活跃连接数.
    spring.datasource.primary.max-active=50
    #指定连接池等待连接返回的最大等待时间,毫秒单位.
    spring.datasource.primary.max-wait=60000
    #指定必须保持连接的最小值
    spring.datasource.primary.min-idle=5
    

    更多配置请参考 SprignBoot文档

    1.4 JDBC 使用

    配置好数据库之后,我们就来使用一下最基本的数据库操作。

    在数据库 test 新建一个用户表:

    CREATE TABLE `sys_user` (
      `user_id` int(21) NOT NULL COMMENT '用户编码',
      `user_name` varchar(50) DEFAULT NULL COMMENT '用户名',
      `age` int(3) DEFAULT NULL COMMENT '年龄',
      `email` varchar(100) DEFAULT NULL COMMENT '邮箱',
      PRIMARY KEY (`user_id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
    

    test/java 目录下新建测试类

    @SpringBootTest
    public class JdbcTest {
        @Autowired
        private JdbcTemplate jdbcTemplate;
    
    
        @Test
        public void test() {
            delete();
            Assert.assertEquals(0,count());
            add();
            Assert.assertEquals(1,count());
        }
    
    
        private int count() {
            String sql = "select count(user_id) from sys_user ";
            Integer result = jdbcTemplate.queryForObject(sql, Integer.class);
            return result;
        }
    
        private void add() {
            String sql = "insert into sys_user " +
                    "values('1','marklogzhu','26','marklogzhu@163.com')";
            jdbcTemplate.execute(sql);
        }
    
        private void delete() {
            String sql = "delete from sys_user ";
            jdbcTemplate.execute(sql);
        }
    
    }
    

    执行测试,发现绿条说明测试通过。

    二、集成 Redis 数据库

    2.1 配置 Redis

    添加依赖

    <dependencies>
    	......
    	<!--Spring redis 依赖-->
    	<dependency>
    		<groupId>org.springframework.boot</groupId>
    		<artifactId>spring-boot-starter-data-redis</artifactId>
    	</dependency>
    	<!--redis 连接池依赖-->
    	<dependency>
    		<groupId>org.apache.commons</groupId>
    		<artifactId>commons-pool2</artifactId>
    		<version>2.7.0</version>
    	</dependency>
    </dependencies>
    

    设置配置文件

    spring:
      redis:
        host: 127.0.0.1
        port: 6379
        # 连接超时时间
        timeout: 1000ms
        jedis:
          pool:
            # 最大连接数
            max-active: 8
            # 最大阻塞等待时间(负数表示没限制)
            max-wait: -1ms
            # 最大空闲
            max-idle: 8
            # 最小空闲
            min-idle: 0
    

    测试

    @SpringBootTest
    public class RedisTest {
    
        @Autowired
        private StringRedisTemplate stringRedisTemplate;
       
        @Test
        public void testSimpleValue(){
            String key = "name";
            String name ="MarkLogZhu";
            stringRedisTemplate.opsForValue().set(key,name);
            String result = stringRedisTemplate.opsForValue().get(key);
            Assert.assertEquals(name,result);
        }
        
    }
    

    执行测试,发现绿条说明测试通过。

    2.2 实现序列化功能

    添加依赖

    <dependencies>
    	......
    	<!--JSON工具类依赖-->
    	<dependency>
    		<groupId>com.google.code.gson</groupId>
    		<artifactId>gson</artifactId>
    		<version>2.8.6</version>
    	</dependency>
    </dependencies>
    

    设置序列化功能

    @Configuration
    public class RedisConfig {
    
    
        @Bean
        @ConditionalOnMissingBean(name = "redisTemplate")
        public RedisTemplate<Object, Object> redisTemplate(
                RedisConnectionFactory redisConnectionFactory) {
            RedisTemplate<Object, Object> redisTemplate = new RedisTemplate<>();
            redisTemplate.setKeySerializer(new StringRedisSerializer());
            redisTemplate.setHashKeySerializer(jackson2JsonRedisSerializer());
            redisTemplate.setValueSerializer(jackson2JsonRedisSerializer());
            redisTemplate.setConnectionFactory(redisConnectionFactory);
            redisTemplate.afterPropertiesSet();
            return redisTemplate;
        }
    
        @SuppressWarnings({"unchecked", "rawtypes"})
        @Bean
        public Jackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer() {
            final Jackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(
                    Object.class);
            final ObjectMapper objectMapper = Jackson2ObjectMapperBuilder.json().build();
            objectMapper.disable(DeserializationFeature.FAIL_ON_IGNORED_PROPERTIES);
            objectMapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);
            objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
            objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
            objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
            jackson2JsonRedisSerializer.setObjectMapper(objectMapper);
            return jackson2JsonRedisSerializer;
        }
    
    
    }
    

    测试

    @SpringBootTest
    public class RedisTest {
    
        @Autowired
        private RedisTemplate redisTemplate;
    
        @Test
        public void testObjectValue(){
            String key = "obj";
            SysUser user = new SysUser(1,"MarkLogZhu");
            redisTemplate.opsForValue().set(key,user);
            SysUser result = (SysUser)redisTemplate.opsForValue().get(key);
            Assert.assertEquals(user,result);
        }
        
    }
    

    执行测试,发现绿条说明测试通过。

  • 相关阅读:
    配置Log4j(非常具体)
    System.Net.WebClient.cs
    Code:获取指定汉字的首字母
    DBS:目录
    Jasper:推送 API
    Jasper-template
    Code:Base64 编码/解码
    DCloud-HTML5+:5+ App开发入门指南
    DCloud-HTML5+:barcode
    Nuget-QRCode:QRCoder
  • 原文地址:https://www.cnblogs.com/markLogZhu/p/11743534.html
Copyright © 2020-2023  润新知