• SpringBoot入门 (四) 数据库访问之JdbcTemplate


      本文记录在SpringBoot中使用JdbcTemplate访问数据库。

    一 JDBC回顾

      最早是在上学时接触的使用JDBC访问数据库,主要有以下几个步骤:

    1 加载驱动 Class.forName(Driver)

    2 获取数据库连接 conn = DriverManager.getConnection(url, user,password)

    3 创建一个statement对象来访问操作数据库 statement = conn.createStatement();

    4 执行SQL,访问操作数据库 rs = statement.execute(sql)

    5 得到结果集,业务处理

    6 关闭连接,释放资源 statement.close(); conn.close();

    使用jdbc访问并操作数据库时比较麻烦,后来也做了一定的封装,主要是对statement的创建前和sql执行后进行的封装。

    二 JdbcTemplate使用示例

      目前我们使用的主流的开源的数据库访问框架主要有Hibernate,Mybatis,SpringJdbc。SpringJdbc时spring对JDBC封装后的一个ORM框架,JdbcTemplate就是SpringJdbc对外提供的一个访问数据库的接口类,我们通过它可以很容易的实现数据库的访问操作。但是需要我们自己根据业务手写相关的SQl,然后执行。

    在spring boot项目中引入依赖,本文练习中使用的时MySql数据库

    <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-jdbc</artifactId>
            </dependency>
            
            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
            </dependency>

    在application.properties中配置数据库连接相关信息

    #数据库配置
    #连接
    spring.datasource.url=jdbc:mysql://localhost:3306/test
    #账号
    spring.datasource.username=root
    #密码
    spring.datasource.password=123456
    #驱动
    spring.datasource.driver-class-name=com.mysql.jdbc.Driver

    完成以上配后,在启动springboot项目时,会自动把数据源信息注入到JdbcTemplate中,我们只需要在使用的地方注入JdbcTemplate就可以了

    定义要操作数据库的相关方法接口

    public interface UserDao {
    
        /**
         * 添加用户
         */
        int insert(UserInfo user);
    
        /**
         * 根据ID删除用户
         */
        int delete(Long id);
    
        /**
         * 修改用户
         */
        int update(UserInfo user);
    
        /**
         * 根据ID查询用户
         */
        UserInfo queryById(Long id);
    
        /**
         * 查询所有用户
         * @return
         */
        List<UserInfo> queryAll();
    
        /**
         * 分页查询用户
         * @param start 开始位置
         * @param size 要查询的数据条数
         * @return
         */
        List<UserInfo> pagedQuery(int start, int size);
    
    }
    接口的实现
    @Service
    public class UserDaoImpl implements UserDao {
    
        @Autowired
        private JdbcTemplate jdbcTemplate;
    
        @Override
        public int insert(UserInfo user) {
            String insertSql = "insert into t_user(name, age) values(?, ?)";
            return jdbcTemplate.update(insertSql, user.getName(), user.getAge());
        }
    
        @Override
        public int delete(Long id) {
            String deleteSql = "delete from t_user where id = ?";
            return jdbcTemplate.update(deleteSql, id);
        }
    
        @Override
        public int update(UserInfo user) {
            String updateSql = "update t_user set name = ?, age = ? where id = ?";
            return jdbcTemplate.update(updateSql, user.getName(), user.getAge(), user.getId());
        }
    
        @Override
        public UserInfo queryById(Long id) {
            String sql = "select * from t_user where id = ?";
            return jdbcTemplate.queryForObject(sql, new Object[]{id}, new BeanPropertyRowMapper<UserInfo>(UserInfo.class));
        }
    
        @Override
        public List<UserInfo> queryAll() {
            String sql = "select * from t_user";
            return jdbcTemplate.query(sql, new BeanPropertyRowMapper(UserInfo.class));
        }
    
        @Override
        public List<UserInfo> pagedQuery(int start, int size) {
            String sql = "select * from t_user limit ?, ?";
            return jdbcTemplate.query(sql, new Object[]{start, size}, new BeanPropertyRowMapper(UserInfo.class));
        }
    }

    可以看到,使用JdbcTemplate时我们完全省去了使用JDBC时的创建连接,释放资源等操作。不同数据库的分页查询不一样,MySql中用的limit关键字,第一个参数代表获取数据的起点,第二个是要查询的数量,如:limit 5,5  我们查询出来的是第6行到10行 共5条数据

    三 测试,使用Junit Test

    @RunWith(SpringRunner.class)
    @SpringBootTest
    public class SpringbootJdbctemplateApplicationTests {
    
        @Autowired
        private UserDaoImpl userDaoImpl;
    
        @Test
        public void testInsert(){
            UserInfo user = new UserInfo("kg", 21);
            userDaoImpl.insert(user);
        }
    
        @Test
        public void testDelete(){
            long id = 2;
            userDaoImpl.delete(id);
        }
    
        @Test
        public void testUpdate(){
            long id = 1;
            UserInfo user = new UserInfo();
            user.setId(id);
            user.setName("kobe");
            user.setAge(3);
            userDaoImpl.update(user);
        }
    
        @Test
        public void testQueryById(){
            long id = 1;
            UserInfo user = userDaoImpl.queryById(id);
        }
    
        @Test
        public void testQueryAll(){
            List<UserInfo> list = userDaoImpl.queryAll();
        }
    
        @Test
        public void testPagedQuery(){
            List<UserInfo> list = userDaoImpl.pagedQuery(1, 2);
        }
    }

    在启动项目时,可以看到在控制台上输出的日志信息中有以下内容

    四 连接池配置

      在我们没有配置数据库连接池时,springboot默认给我们提供的Hikari连接池。如果我们像使用其他的,我们可以自己配置,比如我们想使用阿里的Druid连接池,我们需要引入依赖

    <dependency>
                <groupId>com.alibaba</groupId>
                <artifactId>druid</artifactId>
                <version>1.1.10</version>
            </dependency>
    

    为了测试方便,我这里直接用@Value注解来获取配置信息

    @SpringBootConfiguration
    public class DataSourceConfig {
    
        @Value("${spring.datasource.driver-class-name}")
        private String DRIVER;
        @Value("${spring.datasource.url}")
        private String URL;
        @Value("${spring.datasource.username}")
        private String USER;
        @Value("${spring.datasource.password}")
        private String PASSWORD;
    
        @Bean
        public JdbcTemplate jdbcTemplate(){
            JdbcTemplate jdbcTemplate = new JdbcTemplate();
            jdbcTemplate.setDataSource(dataSource());
            return jdbcTemplate;
        }
    
        @Bean
        public DataSource dataSource(){
            System.out.println("初始化数据源start。。。");
            DruidDataSource dataSource = new DruidDataSource();
            dataSource.setDriverClassName(DRIVER);
            dataSource.setUrl(URL);
            dataSource.setUsername(USER);
            dataSource.setPassword(PASSWORD);
            //连接池的其他的属性。。。
            dataSource.setMaxActive(5);
            //...
            System.out.println("初始化数据源end。。。");
            return dataSource;
        }
    
    }
    

     @SpringBootConfiguration 这个注解说明当前类是一个配置类,需要被特殊处理,在扫描时发现有@Bean 注解,会把当前方法返回的类Bean注入的容器中,方法名会别标记为注入的Bean的别名,如上JdbcTemplate使用的DataSource就从默认的Hikari修改为Druid了,启动项目可以看到控制台日志信息

     

  • 相关阅读:
    查看centos版本
    Internal.Cryptography.CryptoThrowHelper+WindowsCryptographicException 拒绝访问 / 出现了内部错误 c# – 当使用X509Certificate2加载p12/pfx文件时出现
    asp.net asp.net application 升级到 asp.net web 解决找不到控件 批量生成.designer文件
    netcore发布到 iis 设置 部署 环境 变量
    sqlserver 3145
    windows server 2012 远程桌面不好使
    VirtualBox 桥接模式,虚拟机ping不通宿主机
    移动端笔记
    css笔记——关于css中写上charset “utf-8”
    工作笔记——前端分页数据回显
  • 原文地址:https://www.cnblogs.com/love-wzy/p/10320484.html
Copyright © 2020-2023  润新知