Spring学习(三)——在Spring中使用JDBC

写过 JDBC 代码的人都懂,当需要操作数据库的时候,我们需要写一堆模板式的代码,除了核心的一两句代码,其它代码一模一样。
Spring 简化了这些操作,它把那些模板式的代码都封装起来了。jdbcTemplate就是是属于dao层数据库操作一层提供的基于JDBC的解决方法

Spring 的JDBC框架承担了资源管理和异常处理的工作,从而简化了JDBC代码,让我们只需要编写从数据库读写数据的必须代码。
Spring 提供的3个模板类

  • JdbcTemplate:最基本的Spring JDBC模板,这个模板支持最简单的JDBC数据库访问功能以及简单的索引参数查询
  • NamedParameterJdbcTemplate:使用该模板类执行查询时,可以将查询值以命名参数的形式绑定到SQL中,而不是以一些最简单的索引参数。
  • SimpleJdbcTemplate:该模板类利用java 5 的一些特性,如自动装箱、泛型以及可变参数列表来简化JDBC模板的使用。

NamedParameterJdbcTemplate 所具备的命名参数功能在Spring2.5 中被合并到了SimpleJdbcTemplate,所以我们也没有必要再使用NamedParameterJdbcTemplate了。

JdbcTemplate

先来一个例子了解一下JdbcTemplate的用法
在这里插入图片描述

public class User2 {
    private int id;
    private String name;
    private int age;
    private float score;


    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public float getScore() {
        return score;
    }

    public void setScore(float score) {
        this.score = score;
    }

    @Override
    public String toString() {
        return "User2{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", age=" + age +
                ", score=" + score +
                '}';
    }
}

这个数据表以及对应的Bean 就是我们操作的对象

首先配置一下数据源(我使用的c3p0连接池来配置数据源)

<!--配置数据源 c3p0-->
    <bean id="dataSource"  class="com.mchange.v2.c3p0.ComboPooledDataSource">
        <!--4个核心配置参数-->
        <property name="driverClass" value="com.mysql.jdbc.Driver"/>
        <property name="jdbcUrl" value="jdbc:mysql://localhost:3306/spring"/>
        <property name="user" value="root"/>
        <property name="password" value="123456"/>
    </bean>

来一个JdbcTemplate 对象,将数据源注入到JdbcTemplate对象中,JdbcTemplate就可以工作了。

<!--jdbc 模板对象,注入datasource-->
    <bean id="template" class="org.springframework.jdbc.core.JdbcTemplate">
        <!--配置数据源-->
        <property name="dataSource" ref="dataSource"></property>
    </bean>

将JdbcTemplate装配到DAO层并使用JdbcTemplate访问数据库。(代码非常少真的)

    @Resource(name = "template")
    private JdbcTemplate template;

查询一下

public User2 getUserById(int id) {
        //查询操作
        String sql4 = "select * from user where id = ?";
        User2 user = (User2) template.queryForObject(sql4, new MyUser2(), new Object[]{1});
        return user;
    }
 class MyUser2 implements RowMapper{
        public Object mapRow(ResultSet rs, int rowNum) throws SQLException {
            User2 user2 = new User2();

            //将jdbc返回的结果集属性分别映射到对象上的属性
            user2.setId(rs.getInt("id"));
            user2.setName(rs.getString("name"));
            user2.setAge(rs.getInt("age"));
            user2.setScore(rs.getInt("score"));
            //返回对象
            return user2;
        }
    }    

queryForObject()方法的三个参数

  • String :从数据库查找数据的SQL
  • RowMapper对象:用来从ResultSet 中提取并构建域对象
  • 可变参数列表:列出了要绑定到查询语句上的索引参数值

RowMapper对象中,对于查询返回的每一行数据,JdbcTemplate 将会调用RowMapper的mapRow方法,在这个方法中我们将得到的数据填充进了User2对象中。

测试一下

public class jdbctest {
    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("Spring-jdbc.xml");
        UserController controller = (UserController) context.getBean("controller");
        User2 user = controller.getUserById(1);
        System.out.println(user);
    }
}

在这里插入图片描述
Spring 帮我们封装了那些模板式的代码以及各种异常处理工作,对比一下使用JDBC直接操作,这样的代码更简洁,也便于理解。

Spring 的JDBC DAO 支持类

对于应用程序中的DAO 层,每一个类都需要一个JdbcTemplate对象,当我们程序中有好多个dao 的时候,每一个都装配一个JdbcTemplate 就显得很繁琐,一个通用的解决方案是创建一个通用的dao 类让其他的类都来继承,我们只需要将JdbcTemplate注入基类就ok啦。
所以Spring也提供了内置对的基类JdbcDaoSupport,我们dao 类只需要继承这个类就ok啦,然后再XML文件中为其服了注入一个JdbcTemplate

 <bean id="user2dao" class="com.tulun.dao.User2Dao">
        <property name="jdbcTemplate" ref="template"></property>
    </bean>

然后可以通过getJdbcTemplate()方法获取基类里的JdbcTemplate 对象

public class User2Dao extends JdbcDaoSupport {
    public User2 getUserById(int id) {
        //查询操作
        String sql4 = "select * from user where id = ?";
        User2 user = (User2) getJdbcTemplate().queryForObject(sql4, new User2Dao.MyUser2(), new Object[]{1});
        return user;
    }
    class MyUser2 implements RowMapper {
        public Object mapRow(ResultSet rs, int rowNum) throws SQLException {
            User2 user2 = new User2();

            //将jdbc返回的结果集属性分别映射到对象上的属性
            user2.setId(rs.getInt("id"));
            user2.setName(rs.getString("name"));
            user2.setAge(rs.getInt("age"));
            user2.setScore(rs.getInt("score"));
            //返回对象
            return user2;
        }
    }
}

最后,因为我们的dao类是继承自JdbcDaoSupport类,我们可以直接将数据源配置给我们自己的dao 对象的dataSource属性,这个属性是继承自JdbcDaoSupport的。像这样子。

<bean id="userdao2" class="com.tulun.dao.User2Dao">
      <property name="dataSource" ref="dataSource"></property>
</bean>
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
本篇文章是 Spring Boot 实践之十 9 Spring Boot综合项目实战——个人博客系统管理模块 的续篇,本次将介绍如何实现个人博客系统的拓展模块。 在实际开发,我们常常需要对系统进行扩展,添加一些新的功能模块。为了不影响原有代码的结构和功能,我们可以将这些新功能模块独立成为一个子模块,然后通过配置文件等方式将其与原有系统进行整合。 本文将以一个个人博客系统为例,介绍如何实现博客的拓展模块,具体包括以下几个方面: 1. 拓展模块的设计和实现 2. 拓展模块的集成和配置 3. 拓展模块的使用示例 ## 1. 拓展模块的设计和实现 在本例,我们将实现一个博客系统的拓展模块,该模块主要提供以下两个功能: 1. 统计博客文章的阅读量并显示 2. 在博客页面添加底部的版权声明 ### 1.1 统计博客文章的阅读量并显示 首先,我们需要在数据库添加一个字段来存储博客文章的阅读量。在本例,我们在 `blog` 表添加 `read_count` 字段来存储阅读量。 ```sql ALTER TABLE `blog` ADD COLUMN `read_count` INT NOT NULL DEFAULT 0 COMMENT '阅读量' AFTER `update_time`; ``` 接下来,在博客文章页面添加一个阅读量的显示。我们可以在博客文章详情页面的右侧添加一个阅读量的区域,显示该文章的阅读量。具体的实现方式为: 1. 在博客文章详情页面添加一个阅读量的区域。 2. 在加载博客文章详情页面时,通过 AJAX 请求统计该文章的阅读量,并更新阅读量区域的显示。 具体的代码实现如下: 在博客文章详情页面添加一个阅读量的区域: ```html <div class="blog-sidebar-item"> <div class="blog-sidebar-title">阅读量</div> <div class="blog-sidebar-content"> <span id="read-count">0</span> </div> </div> ``` 在加载博客文章详情页面时,通过 AJAX 请求统计该文章的阅读量,并更新阅读量区域的显示。具体的实现方式为: ```javascript $(function () { // 统计阅读量 var blogId = $("#blogId").val(); $.ajax({ url: "/blog/read/" + blogId, type: "POST", success: function (result) { if (result && result.success) { $("#read-count").text(result.data); } else { $("#read-count").text(0); } } }); }); ``` 在服务器端,我们需要实现一个接口来统计博客文章的阅读量,并将其保存到数据库。具体的实现方式为: ```java @RestController @RequestMapping("/blog") public class BlogController { ... /** * 统计博客文章的阅读量 * * @param blogId 博客文章ID * @return 统计结果 */ @PostMapping("/read/{blogId}") public Result<Integer> readBlog(@PathVariable("blogId") Long blogId) { int readCount = blogService.readBlog(blogId); return Result.success(readCount); } ... } ``` 在 `BlogService` 实现 `readBlog` 方法: ```java @Service public class BlogServiceImpl implements BlogService { ... /** * 统计博客文章的阅读量 * * @param blogId 博客文章ID * @return 统计结果 */ @Override public int readBlog(Long blogId) { Blog blog = blogMapper.selectByPrimaryKey(blogId); if (blog != null) { int readCount = blog.getReadCount() + 1; blog.setReadCount(readCount); blogMapper.updateByPrimaryKeySelective(blog); return readCount; } return 0; } ... } ``` ### 1.2 在博客页面添加底部的版权声明 接下来,我们将在博客页面底部添加一个版权声明。具体的实现方式为: 1. 在博客页面底部添加一个版权声明的区域。 2. 在加载博客页面时,通过 AJAX 请求获取版权声明的内容,并更新版权声明区域的显示。 具体的代码实现如下: 在博客页面底部添加一个版权声明的区域: ```html <div class="blog-footer"> <div><span id="copyright"> 版权声明:本博客所有文章均为作者原创或转载,未经授权禁止转载。 </span></div> </div> ``` 在加载博客页面时,通过 AJAX 请求获取版权声明的内容,并更新版权声明区域的显示。具体的实现方式为: ```javascript $(function () { // 加载版权声明 $.ajax({ url: "/blog/copyright", type: "GET", success: function (result) { if (result && result.success) { $("#copyright") .html("版权声明:" + result.data); } } }); }); ``` 在服务器端,我们需要实现一个接口来获取版权声明的内容。具体的实现方式为: ```java @RestController @RequestMapping("/blog") public class BlogController { ... /** * 获取版权声明的内容 * * @return 版权声明的内容 */ @GetMapping("/copyright") public Result<String> getCopyright() { String content = "本博客所有文章均为作者原创或转载,未经授权禁止转载。"; return Result.success(content); } ... } ``` ## 2. 拓展模块的集成和配置 在上一篇文章,我们已经将博客系统的所有模块都整合到了一个工程,因此我们可以通过添加一个 Maven 模块来实现拓展模块的开发,并将其整合到原有工程。 具体的步骤如下: 1. 在项目根目录下创建一个新的 Maven 模块,命名为 `blog-ext`,并将其添加到工程。 2. 在 `blog-ext` 模块添加 `pom.xml` 文件,并添加依赖关系。 3. 在 `blog-ext` 模块添加 Spring Boot 的配置文件 `application.yml`,并添加相关配置。 4. 在 `blog-ext` 模块添加拓展模块的代码和资源文件。 ### 2.1 添加 Maven 模块 在项目根目录下创建一个新的 Maven 模块,命名为 `blog-ext`,并将其添加到工程。具体的步骤如下: 1. 在项目根目录下创建一个新的 Maven 模块,命名为 `blog-ext`。 ```bash $ cd ~/workspace/springboot-blog $ mvn archetype:generate -DgroupId=com.waylau.spring.boot.blog \ -DartifactId=blog-ext -DarchetypeArtifactId=maven-archetype-quickstart \ -DinteractiveMode=false ``` 2. 将 `blog-ext` 模块添加到工程。 ```xml <modules> <module>blog-api</module> <module>blog-service</module> <module>blog-web</module> <module>blog-ext</module> </modules> ``` ### 2.2 添加依赖关系 在 `blog-ext` 模块添加 `pom.xml` 文件,并添加依赖关系。具体的依赖关系如下: ```xml <dependencies> <dependency> <groupId>com.waylau.spring.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>${spring.boot.version}</version> <type>pom</type> <scope>import</scope> </dependency> <!-- 添加 Spring Web MVC 的依赖 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!-- 添加 MyBatis 的依赖 --> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>${mybatis.boot.version}</version> </dependency> </dependencies> ``` ### 2.3 添加配置文件 在 `blog-ext` 模块添加 Spring Boot 的配置文件 `application.yml`,并添加相关配置。具体的配置如下: ```yaml spring: datasource: driver-class-name: com.mysql.jdbc.Driver url: jdbc:mysql://localhost:3306/blog?useSSL=false&useUnicode=true&characterEncoding=utf8 username: root password: root mvc: view: prefix: /templates/ suffix: .html resources: static-locations: classpath:/static/ ``` ### 2.4 添加拓展模块的代码和资源文件 在 `blog-ext` 模块添加拓展模块的代码和资源文件。具体的步骤如下: 1. 在 `blog-ext` 模块添加 `com.waylau.spring.boot.blog.ext` 包,并在该包下添加 `BlogExtApplication` 类。 ```java @SpringBootApplication(scanBasePackages = "com.waylau.spring.boot.blog.ext") public class BlogExtApplication { public static void main(String[] args) { SpringApplication.run(BlogExtApplication.class, args); } } ``` 2. 在 `blog-ext` 模块添加 `resources` 目录,并在该目录下添加 `templates` 和 `static` 目录。 3. 在 `templates` 目录添加 `read-count.html` 和 `copyright.html`。 ```html <!-- read-count.html --> <div class="blog-sidebar-item"> <div class="blog-sidebar-title">阅读量</div> <div class="blog-sidebar-content"> <span id="read-count">0</span> </div> </div> ``` ```html <!-- copyright.html --> <div class="blog-footer"> <div><span id="copyright"> 版权声明:本博客所有文章均为作者原创或转载,未经授权禁止转载。 </span></div> </div> ``` 4. 在 `static` 目录添加 `js` 目录,并在该目录下添加 `read-count.js` 和 `copyright.js`。 ```javascript // read-count.js $(function () { // 统计阅读量 var blogId = $("#blogId").val(); $.ajax({ url: "/blog/read/" + blogId, type: "POST", success: function (result) { if (result && result.success) { $("#read-count").text(result.data); } else { $("#read-count").text(0); } } }); }); ``` ```javascript // copyright.js $(function () { // 加载版权声明 $.ajax({ url: "/blog/copyright", type: "GET", success: function (result) { if (result && result.success) { $("#copyright") .html("版权声明:" + result.data); } } }); }); ``` ## 3. 拓展模块的使用示例 在完成了拓展模块的开发和配置之后,我们需要将其与原有系统进行整合。具体的步骤如下: 1. 在原有系统添加对拓展模块的依赖关系。 在 `blog-web` 模块的 `pom.xml` 文件添加对 `blog-ext` 模块的依赖关系: ```xml <dependencies> ... <!-- 添加 blog-ext 的依赖 --> <dependency> <groupId>com.waylau.spring.boot.blog</groupId> <artifactId>blog-ext</artifactId> <version>${project.version}</version> </dependency> </dependencies> ``` 2. 在原有系统添加拓展模块的使用示例。 在博客文章详情页面添加一个阅读量的区域: ```html <!-- 添加阅读量的区域 --> <div th:replace="blog-ext :: read-count"></div> ``` 在博客页面底部添加一个版权声明的区域: ```html <!-- 添加版权声明的区域 --> <div th:replace="blog-ext :: copyright"></div> ``` 经过以上的步骤,我们就已经成功地将博客系统的拓展模块整合到了原有系统。 ## 总结 本文介绍了如何实现 Spring Boot 的拓展模块,并将其与原有系统进行整合。在实际开发,我们可以根据具体的需求来实现不同的拓展模块,并通过配置文件等方式将其整合到原有系统。这种方式既提高了代码的可维护性,又方便了模块的扩展和升级。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值