hi,你好!欢迎访问本站!登录
本站由网站地图腾讯云宝塔系统阿里云强势驱动
当前位置:首页 - 教程 - 杂谈 - 正文 君子好学,自强不息!

Spring Boot2 系列教程(十九)Spring Boot 整合 JdbcTemplate

2019-11-18杂谈搜奇网34°c
A+ A-

在 Java 范畴,数据耐久化有几个罕见的计划,有 Spring 自带的 JdbcTemplate 、有 MyBatis,另有 JPA,在这些计划中,最简朴的就是 Spring 自带的 JdbcTemplate 了,这个东西虽然没有 MyBatis 那末轻易,然则比起最最先的 Jdbc 已强了许多了,它没有 MyBatis 功用那末壮大,固然也意味着它的运用比较简朴,事实上,JdbcTemplate 算是最简朴的数据耐久化计划了,本文就和大伙来讲说这个东西的运用。

1. 基础设置

JdbcTemplate 基础用法实际上很简朴,开发者在建立一个 SpringBoot 项目时,除了挑选基础的 Web 依靠,再记得选上 Jdbc 依靠,以及数据库驱动依靠即可,以下:

项目建立胜利以后,记得增加 Druid 数据库连接池依靠(注重这里能够增加特地为 Spring Boot 打造的 druid-spring-boot-starter,而不是我们平常在 SSM 中增加的 Druid),一切增加的依靠以下:

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid-spring-boot-starter</artifactId>
    <version>1.1.10</version>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>5.1.27</version>
    <scope>runtime</scope>
</dependency>

项目建立完后,接下来只须要在 application.properties 中供应数据的基础设置即可,以下:

spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.username=root
spring.datasource.password=123
spring.datasource.url=jdbc:mysql:///test01?useUnicode=true&characterEncoding=UTF-8

云云以后,一切的设置就算完成了,接下来就能够直接运用 JdbcTemplate 了?咋这么轻易呢?实在这就是 SpringBoot 的自动化设置带来的优点,我们先说用法,一会来讲道理。

2. 基础用法

起首我们来建立一个 User Bean,以下:

public class User {
    private Long id;
    private String username;
    private String address;
    //省略getter/setter
}

然厥后建立一个 UserService 类,在 UserService 类中注入 JdbcTemplate ,以下:

@Service
public class UserService {
    @Autowired
    JdbcTemplate jdbcTemplate;
}

好了,云云以后,预备工作就算完成了。

2.1 增

JdbcTemplate 中,除了查询有几个 API 以外,增编削一致都运用 update 来操纵,自身来传入 SQL 即可。比方增加数据,要领以下:

public int addUser(User user) {
    return jdbcTemplate.update("insert into user (username,address) values (?,?);", user.getUsername(), user.getAddress());
}

update 要领的返回值就是 SQL 实行受影响的行数。

这里只须要传入 SQL 即可,假如你的需求比较复杂,比方在数据插进去的历程当中愿望完成主键回填,那末能够运用 PreparedStatementCreator,以下:

public int addUser2(User user) {
    KeyHolder keyHolder = new GeneratedKeyHolder();
    int update = jdbcTemplate.update(new PreparedStatementCreator() {
        @Override
        public PreparedStatement createPreparedStatement(Connection connection) throws SQLException {
            PreparedStatement ps = connection.prepareStatement("insert into user (username,address) values (?,?);", Statement.RETURN_GENERATED_KEYS);
            ps.setString(1, user.getUsername());
            ps.setString(2, user.getAddress());
            return ps;
        }
    }, keyHolder);
    user.setId(keyHolder.getKey().longValue());
    System.out.println(user);
    return update;
}

实际上这里就相当于完整运用了 JDBC 中的解决计划了,起首在构建 PreparedStatement 时传入 Statement.RETURN_GENERATED_KEYS,然后传入 KeyHolder,终究从 KeyHolder 中猎取方才插进去数据的 id 保存到 user 对象的 id 属性中去。

你能想到的 JDBC 的用法,在这里都能完成,Spring 供应的 JdbcTemplate 虽然不如 MyBatis,然则比起 Jdbc 照样要轻易许多的。

2.2 删

删除也是运用 update API,传入你的 SQL 即可:

public int deleteUserById(Long id) {
    return jdbcTemplate.update("delete from user where id=?", id);
}

固然你也能够运用 PreparedStatementCreator。

2.3 改

public int updateUserById(User user) {
    return jdbcTemplate.update("update user set username=?,address=? where id=?", user.getUsername(), user.getAddress(),user.getId());
}

固然你也能够运用 PreparedStatementCreator。

2.4 查

查询的话,轻微有点变化,这里主要向大伙引见 query 要领,比方查询一切用户:

public List<User> getAllUsers() {
    return jdbcTemplate.query("select * from user", new RowMapper<User>() {
        @Override
        public User mapRow(ResultSet resultSet, int i) throws SQLException {
            String username = resultSet.getString("username");
            String address = resultSet.getString("address");
            long id = resultSet.getLong("id");
            User user = new User();
            user.setAddress(address);
            user.setUsername(username);
            user.setId(id);
            return user;
        }
    });
}

查询的时刻须要供应一个 RowMapper,就是须要自身手动映照,将数据库中的字段和对象的属性一一对应起来,如许。。。。嗯看起来有点贫苦,实际上,假如数据库中的字段和对象属性的名字如出一辙的话,有别的一个简朴的计划,以下:

public List<User> getAllUsers2() {
    return jdbcTemplate.query("select * from user", new BeanPropertyRowMapper<>(User.class));
}

至于查询时刻传参也是运用占位符,这个和前文的一致,这里不再赘述。

2.5 其他

除了这些基础用法以外,JdbcTemplate 也支撑其他用法,比方挪用存储历程等,这些都比较轻易,而且和 Jdbc 自身都比较类似,这里也就不做引见了,有兴致能够留言议论。

3. 道理剖析

那末在 SpringBoot 中,设置完数据库基础信息以后,就有了一个 JdbcTemplate 了,这个东西是从哪里来的呢?源码在 org.springframework.boot.autoconfigure.jdbc.JdbcTemplateAutoConfiguration 类中,该类源码以下:

@Configuration
@ConditionalOnClass({ DataSource.class, JdbcTemplate.class })
@ConditionalOnSingleCandidate(DataSource.class)
@AutoConfigureAfter(DataSourceAutoConfiguration.class)
@EnableConfigurationProperties(JdbcProperties.class)
public class JdbcTemplateAutoConfiguration {
    @Configuration
    static class JdbcTemplateConfiguration {
        private final DataSource dataSource;
        private final JdbcProperties properties;
        JdbcTemplateConfiguration(DataSource dataSource, JdbcProperties properties) {
            this.dataSource = dataSource;
            this.properties = properties;
        }
        @Bean
        @Primary
        @ConditionalOnMissingBean(JdbcOperations.class)
        public JdbcTemplate jdbcTemplate() {
            JdbcTemplate jdbcTemplate = new JdbcTemplate(this.dataSource);
            JdbcProperties.Template template = this.properties.getTemplate();
            jdbcTemplate.setFetchSize(template.getFetchSize());
            jdbcTemplate.setMaxRows(template.getMaxRows());
            if (template.getQueryTimeout() != null) {
                jdbcTemplate
                        .setQueryTimeout((int) template.getQueryTimeout().getSeconds());
            }
            return jdbcTemplate;
        }
    }
    @Configuration
    @Import(JdbcTemplateConfiguration.class)
    static class NamedParameterJdbcTemplateConfiguration {
        @Bean
        @Primary
        @ConditionalOnSingleCandidate(JdbcTemplate.class)
        @ConditionalOnMissingBean(NamedParameterJdbcOperations.class)
        public NamedParameterJdbcTemplate namedParameterJdbcTemplate(
                JdbcTemplate jdbcTemplate) {
            return new NamedParameterJdbcTemplate(jdbcTemplate);
        }
    }
}

从这个类中,大抵能够看出,当当前类途径下存在 DataSource 和 JdbcTemplate 时,该类就会被自动设置,jdbcTemplate 要领则示意,假如开发者没有自身供应一个 JdbcOperations 的实例的话,体系就自动设置一个 JdbcTemplate Bean(JdbcTemplate 是 JdbcOperations 接口的一个完成)。好了,不知道大伙有无收成呢?

关注民众号【江南一点雨】,专注于 Spring Boot+微效劳以及前后端星散等全栈手艺,按期视频教程分享,关注后复兴 Java ,领取松哥为你经心预备的 Java 干货!

  选择打赏方式
微信赞助

打赏

QQ钱包

打赏

支付宝赞助

打赏

  移步手机端
Spring Boot2 系列教程(十九)Spring Boot 整合 JdbcTemplate

1、打开你手机的二维码扫描APP
2、扫描左则的二维码
3、点击扫描获得的网址
4、可以在手机端阅读此文章
未定义标签

本文来源:搜奇网

本文地址:https://www.sou7.cn/282239.html

关注我们:微信搜索“搜奇网”添加我为好友

版权声明: 本文仅代表作者个人观点,与本站无关。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。请记住本站网址https://www.sou7.cn/搜奇网。

发表评论

选填

必填

必填

选填

请拖动滑块解锁
>>