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

摘要:
本文记录了使用JdbcTemplate访问SpringBoot中的数据库。二、使用JdbcTemplate的示例目前,我们使用的主流开源数据库访问框架主要包括Hibernate、Mybatis和Spring Jdbc。SpringJdbc是一个由Spring封装到Jdbc的ORM框架。JdbcTemplate是Spring Jdbc为访问数据库提供的接口类。我们可以通过它轻松访问数据库。

  本文记录在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入门 (四) 数据库访问之JdbcTemplate第1张

四 连接池配置

  在我们没有配置数据库连接池时,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了,启动项目可以看到控制台日志信息

SpringBoot入门 (四) 数据库访问之JdbcTemplate第2张

 

免责声明:文章转载自《SpringBoot入门 (四) 数据库访问之JdbcTemplate》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇关于Centos7 firewalld防火墙开放端口后仍不能访问ftp和nginx的问题解决Linux之Ansible下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Delphi 匿名函数的几个实际应用(二)

Timing Anonymous Methods 计时功能匿名函数   开发者们经常需要添加计时代码到一个已有的常规过程中,比较他们的相关速度。前面例子已经使用了几次实例,指出Uncode字符执行速度。对比两个代码片段,比较他们的执行毫秒数,妳可以写出下面内容(在本书第二章的“转换字符”例子):   [delphi]view plaincopy...

Android之OkHttp详解(非原创)

文章大纲 一、OkHttp简介二、OkHttp简单使用三、OkHttp封装四、项目源码下载 一、OkHttp简介 1. 什么是OkHttp   一般在Java平台上,我们会使用Apache HttpClient作为Http客户端,用于发送 HTTP 请求,并对响应进行处理。比如可以使用http客户端与第三方服务(如SSO服务)进行集成,当然还可以爬取网...

JDBC的批量查询报告内存溢出解决方法

由于表中的数据过多(我的超过了50W+),查询select * from table ....报告内存溢出 Exception in thread "main"java.lang.OutOfMemoryError: Java heap space at com.mysql.jdbc.MysqlIO.nextRowFast(MysqlIO.java...

Swift开发中 JSON对象/JSON字符串/Data的互转

本文将介绍Swift开发中常用的转换(JSON对象/JSON字符串/Data之间的互相转换) #pragma mark - JSON(对象)----->JSON字符串 1、原生方法 //JSON--->data--->JSON字符串 let data = try?JSONSerialization.data(withJSONObject:...

[Swift]扩展String类:Base64的编码和解码

★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs.com/strengthen/)➤GitHub地址:https://github.com/strengthen/LeetCode➤原文地址:https://w...

求2个集合的交集

求2个集合的交集 第一种方法 最简单、粗暴的循环遍历2个集合,判断如果有相同的元素就取出来。假设集合1的长度为M,集合2的长度为N,那么,时间复杂度为:O(M*N) 代码: public static List<string> GetIntersection(List<string> list1, List<string&...