• 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

  • 相关阅读:
    接口框架项目示例
    接口框架开发流程总结
    requests库的简单使用
    使用flask创建简单的接口
    session和token
    解决log函数生成重复log的问题
    自定义封装logging参考
    织梦dedecms做的网站首页标题篡改跳转赌博网站解决方案
    织梦网站安全查杀
    织梦重置密码的方法和织梦网站后台登陆账号修改方法
  • 原文地址:https://www.cnblogs.com/william-dai/p/12795663.html
Copyright © 2020-2023  润新知