zoukankan      html  css  js  c++  java
  • Spring Boot 整合JDBC

    今天主要讲解一下SpringBoot如何整合JDBC,没啥理论好说的,直接上代码,看项目整体结构

    查看对应的pom.xml(父节点)

    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
        <parent>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-parent</artifactId>
            <version>2.2.6.RELEASE</version>
            <relativePath/> <!-- lookup parent from repository -->
        </parent>
        <groupId>com.agan.boot</groupId>
        <artifactId>agan-boot</artifactId>
        <version>1.0.0-SNAPSHOT</version>
        <name>agan-boot</name>
        <description>Demo project for Spring Boot</description>
    
        <properties>
            <java.version>1.8</java.version>
        </properties>
    
        <dependencies>
    
        </dependencies>
    
        <modules>
            <module>agan-boot-config</module>
            <module>agan-boot-test1</module>
            <module>agan-boot-yml</module>
            <module>agan-boot-log</module>
            <module>agan-boot-test2</module>
            <module>agan-boot-jdbc</module>
        </modules>
        <build>
            <plugins>
                <plugin>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-maven-plugin</artifactId>
                </plugin>
            </plugins>
        </build>
    
    </project>

    查看对应的pom.xml(子节点)

    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
        <parent>
            <groupId>com.agan.boot</groupId>
            <artifactId>agan-boot</artifactId>
            <version>1.0.0-SNAPSHOT</version>
        </parent>
        <groupId>com.agan.boot</groupId>
        <artifactId>agan-boot-jdbc</artifactId>
        <version>1.0.0-SNAPSHOT</version>
    
        <properties>
            <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
            <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
            <java.version>1.8</java.version>
        </properties>
    
        <dependencies>
    
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-jdbc</artifactId>
            </dependency>
    
            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
                <version>5.1.36</version>
                <scope>runtime</scope>
            </dependency>
    
            <!--阿里巴巴数据源-->
            <dependency>
                <groupId>com.alibaba</groupId>
                <artifactId>druid</artifactId>
                <version>1.1.5</version>
            </dependency>
    
    
           <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
    
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-test</artifactId>
                <scope>test</scope>
                <exclusions>
                    <exclusion>
                        <groupId>org.junit.vintage</groupId>
                        <artifactId>junit-vintage-engine</artifactId>
                    </exclusion>
                </exclusions>
            </dependency>
        </dependencies>
    
        <build>
            <plugins>
                <plugin>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-maven-plugin</artifactId>
                </plugin>
            </plugins>
        </build>
    
    </project>

    定义User.java

    package com.springboot.jdbc.bean;
    
    import java.math.BigDecimal;
    
    public class User {
    
        public User(Long id, String username) {
            super();
            this.id = id;
            this.username = username;
        }
    
        public User() {
            super();
        }
    
        private Long id;
    
        private String username;
    
        public Long getId() {
            return this.id;
        }
    
        public void setId(Long id) {
            this.id = id;
        }
    
        public String getUsername() {
            return this.username;
        }
    
        public void setUsername(String username) {
            this.username = username;
        }
    
    
    }

     定义数据源配置,这里使用druid,所以需要写一个配置类

    package com.springboot.jdbc.config;
    
    import java.sql.SQLException;
    import javax.sql.DataSource;
    
    import com.springboot.jdbc.resposity.UserDAO;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.boot.web.servlet.FilterRegistrationBean;
    import org.springframework.boot.web.servlet.ServletRegistrationBean;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.context.annotation.Primary;
    import com.alibaba.druid.pool.DruidDataSource;
    import com.alibaba.druid.support.http.StatViewServlet;
    import com.alibaba.druid.support.http.WebStatFilter;
    /**
     * @Function druid配置
     */
    @Configuration
    public class DruidConfig {
        private static  final Logger log = (Logger) LoggerFactory.getLogger(UserDAO.class);
    
        @Value("${spring.datasource.url}")
        private String dbUrl;
    
        @Value("${spring.datasource.username}")
        private String username;
    
        @Value("${spring.datasource.password}")
        private String password;
    
        @Value("${spring.datasource.driver-class-name}")
        private String driverClassName;
    
        @Value("${spring.datasource.initialSize}")
        private int initialSize;
    
        @Value("${spring.datasource.minIdle}")
        private int minIdle;
    
        @Value("${spring.datasource.maxActive}")
        private int maxActive;
    
        @Value("${spring.datasource.maxWait}")
        private int maxWait;
    
        @Value("${spring.datasource.timeBetweenEvictionRunsMillis}")
        private int timeBetweenEvictionRunsMillis;
    
        @Value("${spring.datasource.minEvictableIdleTimeMillis}")
        private int minEvictableIdleTimeMillis;
    
        @Value("${spring.datasource.validationQuery}")
        private String validationQuery;
    
        @Value("${spring.datasource.testWhileIdle}")
        private boolean testWhileIdle;
    
        @Value("${spring.datasource.testOnBorrow}")
        private boolean testOnBorrow;
    
        @Value("${spring.datasource.testOnReturn}")
        private boolean testOnReturn;
    
        @Value("${spring.datasource.poolPreparedStatements}")
        private boolean poolPreparedStatements;
    
        @Value("${spring.datasource.filters}")
        private String filters;
    
        @Value("${spring.datasource.logSlowSql}")
        private String logSlowSql;
    
        @Bean
        @Primary //选择默认的数据源
        public DataSource dataSource(){
            //log.info("打桩 : 进入方法 dataSource ");
    
            DruidDataSource datasource = new DruidDataSource();
            datasource.setUrl(dbUrl);
            datasource.setUsername(username);
            datasource.setPassword(password);
            datasource.setDriverClassName(driverClassName);
            datasource.setInitialSize(initialSize);
            datasource.setMinIdle(minIdle);
            datasource.setMaxActive(maxActive);
            datasource.setMaxWait(maxWait);
            datasource.setTimeBetweenEvictionRunsMillis(timeBetweenEvictionRunsMillis);
            datasource.setMinEvictableIdleTimeMillis(minEvictableIdleTimeMillis);
            datasource.setValidationQuery(validationQuery);
            datasource.setTestWhileIdle(testWhileIdle);
            datasource.setTestOnBorrow(testOnBorrow);
            datasource.setTestOnReturn(testOnReturn);
            datasource.setPoolPreparedStatements(poolPreparedStatements);
            //log.info("打桩 : *1*");
            try {
                //log.info("打桩 : *2*");
                datasource.setFilters(filters);
                //log.info("打桩 : *3*");
            } catch (SQLException e) {
    
                e.printStackTrace();
            }
    
            //log.info("打桩 : 退出方法 dataSource ");
            return datasource;
        }
    
        /**
         *
         * @return 添加登录权限
         */
        @Bean
        public ServletRegistrationBean druidServlet() {
            ServletRegistrationBean reg = new ServletRegistrationBean();
            reg.setServlet(new StatViewServlet());
            reg.addUrlMappings("/druid/*");
            reg.addInitParameter("loginUsername", username);
            reg.addInitParameter("loginPassword", password);
            reg.addInitParameter("logSlowSql", logSlowSql);
            return reg;
        }
    
        /**
         * 过滤规则
         * @return
         */
        @Bean
        public FilterRegistrationBean filterRegistrationBean() {
            FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean();
            filterRegistrationBean.setFilter(new WebStatFilter());
            filterRegistrationBean.addUrlPatterns("/*");
            filterRegistrationBean.addInitParameter("exclusions", "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*");
            filterRegistrationBean.addInitParameter("profileEnable", "true");
            return filterRegistrationBean;
        }
    }

    上面指定druid的属性配置,和用户登录的账号信息以及对应的过滤规则:

    下面定义数据访问接口和对应的实现:

    package com.springboot.jdbc.resposity;
    
    
    import com.springboot.jdbc.bean.User;
    
    public interface IUserDAO {
        User findUserById(long id);
    }
    package com.springboot.jdbc.resposity;
    import com.springboot.jdbc.bean.User;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.jdbc.core.BeanPropertyRowMapper;
    import org.springframework.jdbc.core.JdbcTemplate;
    import org.springframework.stereotype.Repository;
    import java.util.List;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    
    @Repository
    public class UserDAO implements IUserDAO {
        private static  final Logger log = (Logger) LoggerFactory.getLogger(UserDAO.class);
        /*public UserDAO(){
            log.info("打桩 : 进入UserDAO的无参构造方法。");
        }*/
        @Autowired
        private JdbcTemplate jdbcTemplate; // 这个是系统自带的
        @Override
        public User findUserById(long id) {
    
            //log.info("进入findUserById");
            List<User> list = jdbcTemplate.query("select * from user where id = ?", new Object[]{id}, new BeanPropertyRowMapper(User.class));
            if(list!=null && list.size()>0){
                User account = list.get(0);
                return account;
            }else{
                return null;
            }
    
        }
    }

    数据访问层很简单,直接注入JdbcTemplate模板即可,下面再看对应的service和实现

    package com.springboot.jdbc.service;
    
    
    import com.springboot.jdbc.bean.User;
    
    public interface IUserService {
        User findUser(long id);
    }
    package com.springboot.jdbc.service;
    
    
    import com.springboot.jdbc.bean.User;
    import com.springboot.jdbc.resposity.IUserDAO;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Service;
    
    @Service
    public class UserService implements IUserService {
        @Autowired
        private IUserDAO userDAO;
        @Override
        public User findUser(long id) {
            return userDAO.findUserById(id);
        }
    }

    写一个测试的controller:

    package com.springboot.jdbc.controller;
    
    
    import com.springboot.jdbc.bean.User;
    import com.springboot.jdbc.service.IUserService;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.PathVariable;
    import org.springframework.web.bind.annotation.RestController;
    
    
    @RestController
    public class UserController {
        @Autowired
        private IUserService userService;
        @GetMapping("/findUser/{id}")
        public User findUser(@PathVariable long id){
            return userService.findUser(id);
        }
    }

    对应的application.yaml配置文件

    server:
      port: 8888
    
    spring:
      datasource:
        driver-class-name: com.mysql.jdbc.Driver
        filters: stat、wall、log4j    (踩过的坑,不能写成 )
        initialSize: 5
        maxActive: 20
        maxOpenPreparedStatements: 20
        maxWait: 60000
        minEvictableIdleTimeMillis: 300000
        minIdle: 1
        password: 123
        poolPreparedStatements: true
        testOnBorrow: false
        testOnReturn: false
        testWhileIdle: true
        timeBetweenEvictionRunsMillis: 60000
        type: com.alibaba.druid.pool.DruidDataSource
        url: jdbc:mysql://127.0.0.1:3306/emp
        username: root
        validationQuery: select 'x'
        logSlowSql: true
    filters: stat、wall、log4j    (踩过的坑,不能写成 stat,wall,log4j , 用顿号,而不能用逗号

    写一个启动应用类:

    package com.springboot.jdbc;
    
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    
    @SpringBootApplication
    public class JdbcTemplateApplication {
        public static void main(String[] args) {
            SpringApplication.run(JdbcTemplateApplication.class,args);
        }
    }

    到此为止代码和配置文件都讲解完了,接下来进行创建数据库和数据表:

    -- ----------------------------
    -- Table structure for `user`
    -- ----------------------------
    DROP TABLE IF EXISTS `user`;
    CREATE TABLE `user` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `username` varchar(255) DEFAULT NULL,
      UNIQUE KEY `id_x` (`id`) USING BTREE
    ) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;
     
    -- ----------------------------
    -- Records of user
    -- ----------------------------
    INSERT INTO `user` VALUES ('1', 'jiahp');
    INSERT INTO `user` VALUES ('2', 'wangli');
    INSERT INTO `user` VALUES ('3', 'guoyanbin');
    INSERT INTO `user` VALUES ('4', 'yaodong');

    等应用成功启动成功之后,在浏览器端访问 http://localhost:8888/findUser/1 对应结果如下:

    当然可以都访问几个id,然后再访问druid的监控页面 在浏览器端访问http://localhost:8888/druid/login.html

    会弹出登录对话框,输入配置文件里面的用户名和密码就会登录成功,然后跳转到下面这样的页面

     

    这上面的功能很多,比如sql监控:可以看到查询了哪些sql语句

     

    还有url监控 可以查询对应sql调用的api:

     

    还有其他功能,可以自己都点点看,还是蛮强大的,好了到此为止springboot和jdbc的整合就介绍完了

    代码路径 : https://files.cnblogs.com/files/william-dai/agan-boot.rar 

    参考文档: https://blog.csdn.net/qq_18603599/article/details/81169198

  • 相关阅读:
    CodeForces 347B Fixed Points (水题)
    CodeForces 347A Difference Row (水题)
    CodeForces 346A Alice and Bob (数学最大公约数)
    CodeForces 474C Captain Marmot (数学,旋转,暴力)
    CodeForces 474B Worms (水题,二分)
    CodeForces 474A Keyboard (水题)
    压力测试学习(一)
    算法学习(一)五个常用算法概念了解
    C#语言规范
    异常System.Threading.Thread.AbortInternal
  • 原文地址:https://www.cnblogs.com/william-dai/p/12795663.html
Copyright © 2011-2022 走看看