前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【翻译】spring-data 之JdbcTemplate 使用

【翻译】spring-data 之JdbcTemplate 使用

作者头像
_淡定_
发布2019-08-18 22:53:58
6570
发布2019-08-18 22:53:58
举报
文章被收录于专栏:dotnet & java

Jdbc的使用

基础的代码结构:

一个Application作为入口。IUserRepositoryUserRepository作为具体的实现。applicationContext.xml定义spring的配置。db.properties保存数据库相关的信息。

环境搭建步骤

新建项目

新建一个maven项目,编辑pom.xml文件,如下。除了mysql的驱动,其他是必须的。

代码语言:javascript
复制
<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.lou.spring.demo5.tx</groupId>
    <artifactId>lou-spring-demo5-tx</artifactId>
    <version>1.0-SNAPSHOT</version>
  
    <dependencies>
        <!--spring的核心-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>4.3.25.RELEASE</version>
        </dependency>
        <!--orm相关,比如jdbctemplate-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-orm</artifactId>
            <version>4.3.25.RELEASE</version>
        </dependency>
        <!--mysql数据库驱动-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>6.0.6</version>
        </dependency>
        <!-- datasource 数据源 -->
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-dbcp2</artifactId>
            <version>2.7.0</version>
        </dependency>
    </dependencies>
</project>
applicationContext.xml

在resources下面添加spring的配置文件applicationContext.xml

内容:

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">

<!--    1.无需定义repository注解,通过属性设置的方式进行-->
    <bean id="userRepository1" class="com.lou.spring.demo5.tx.UserRepository">
        <property name="jdbcTemplate" ref="dataSource"></property>
    </bean>

<!--    2.使用Component-scan的方式配合@repository注解-->
<!--    <context:component-scan base-package="com.lou.spring.demo5.tx"></context:component-scan>-->

    <bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource">
        <property name="driverClassName" value="${jdbc.dirverClassName}"></property>
        <property name="url" value="${jdbc.url}"></property>
        <property name="username" value="${jdbc.username}"></property>
        <property name="password" value="${jdbc.password}"></property>
    </bean>
  <!--    上面datasource用到的属性值来自这个-->
    <context:property-placeholder location="db.properties"></context:property-placeholder>
</beans>
db.properties

在resources下面添加db.properties文件

代码语言:javascript
复制
jdbc.dirverClassName=com.mysql.cj.jdbc.Driver
jdbc.username=root
jdbc.password=123456
jdbc.url=jdbc:mysql://localhost:3306/test1?useSSL=false
Repository

添加IUserRepository和UserRepository用于数据库的访问。

IUserRepository.java

代码语言:javascript
复制
package com.lou.spring.demo5.tx;

public interface IUserRepository {
    //显示总数
    void showCount();
}

UserRepository.java

代码语言:javascript
复制
package com.lou.spring.demo5.tx;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Repository;

import javax.sql.DataSource;

@Repository
public class UserRepository implements IUserRepository {
    private JdbcTemplate jdbcTemplate;

    @Autowired
    public void setJdbcTemplate(DataSource dataSource) {
        this.jdbcTemplate = new JdbcTemplate(dataSource);
    }

    @Override
    public void showCount() {
        Integer count = jdbcTemplate.queryForObject("select count(*) from account", Integer.class);
        System.out.println(count);
    }
}
  • 不使用Repository和Autowired注解方式 没有开启Repository和Autowired注解,所以,需要在xml中手动配置。确保set方法的后面部分和applicationContext.xml#userRepository1#property的name字段名字是一样的。然后传入一个DataSource参数,也就是property的ref引用
  • 开启Repository和Autowired注解方式 开启了注解之后就需要定义在applicationContext.xml中定义component-scan,然后spring自己去扫描查找需要的依赖。
程序入口

新建Application.java 作为程序入口。

代码语言:javascript
复制
package com.lou.spring.demo5.tx;

import org.apache.commons.dbcp2.BasicDataSource;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Application {
    public static void main(String[] args) {
        ClassPathXmlApplicationContext classPathXmlApplicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
        BasicDataSource dataSource = (BasicDataSource) classPathXmlApplicationContext.getBean("dataSource");
        //用来测试数据源是否通
        System.out.println(dataSource);
        //通过id的方式获取
        UserRepository userRepository = (UserRepository) classPathXmlApplicationContext.getBean("userRepository1");
        userRepository.showCount();
        //通过class的方式获取
        UserRepository userRepository1 = classPathXmlApplicationContext.getBean(UserRepository.class);
        userRepository1.showCount();
    }
}

使用demo

先定义一个User对象

User.java

代码语言:javascript
复制
package com.lou.spring.demo5.tx;

public class User {
    private Integer id;
    private String name;
    private Integer age;

    public Integer getId() {
        return id;
    }

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

    public String getName() {
        return name;
    }

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

    public Integer getAge() {
        return age;
    }

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

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}
查询相关(select)

修改一下IUserRepository,增加如下内容。

代码语言:javascript
复制
public interface IUserRepository {
    //总行数查询
    Integer getTotalCount();
    //带条件的总行数查询
    Integer getTotalCount(String name);
    //查询一个String
    String getName();
    //查询一个对象
    User getUser();
    //查询对象集合
    List<User> getUsers();
}

具体实现:

代码语言:javascript
复制
@Repository
public class UserRepository implements IUserRepository {
    private JdbcTemplate jdbcTemplate;

    @Autowired
    public void setJdbcTemplate111(DataSource dataSource) {
        this.jdbcTemplate = new JdbcTemplate(dataSource);
    }

    @Override
    public Integer getTotalCount() {
        Integer userCount = jdbcTemplate.queryForObject("select count(*) from user", Integer.class);
        return userCount;
    }

    @Override
    public Integer getTotalCount(String name) {
        Integer louCount = jdbcTemplate.queryForObject("select count(*) from user where name like ?", Integer.class, name);
        return louCount;
    }

    @Override
    public String getName() {
        String name = jdbcTemplate.queryForObject("select name from user where id=?", new Object[]{1}, String.class);
        return name;
    }

    @Override
    public User getUser() {
        User user = jdbcTemplate.queryForObject("select * from user where id = ?", new Object[]{1}, new UserMapper());
        return user;
    }

    @Override
    public List<User> getUsers() {
        List<User> users = jdbcTemplate.query("select * from user", new UserMapper());
        return users;
    }

    //抽取公共的RowMapper<User>,内部私有的class,放外面的话是要public,非static
    private static final class UserMapper implements RowMapper<User> {
        @Override
        public User mapRow(ResultSet resultSet, int i) throws SQLException {
            User user = new User();
            user.setId(resultSet.getInt("id"));
            user.setName(resultSet.getString("name"));
            user.setAge(resultSet.getInt("age"));
            return user;
        }
    }
}

使用RowMapper对结果集做映射。UserMapper是一个私有的静态类。使用的时候需要new。

update相关(包括insert,update,delete)
代码语言:javascript
复制
@Override
public Integer insertUser(User u) {
    return jdbcTemplate.update("insert into user (name,age) values(?,?)", u.getName(), u.getAge());
}

@Override
public Integer updateUser(Integer userId, String name) {
    return jdbcTemplate.update("update user set name=? where id=?", name, userId);
}

@Override
public Integer deleteUser(Integer userId) {
    return jdbcTemplate.update("delete from user where id = ?", userId);
}
execute 方法

用来执行create table 或者调用存储过程之类的sql语句。

代码语言:javascript
复制
this.jdbcTemplate.execute("create table mytable (id integer, name varchar(100))");
this.jdbcTemplate.update(
        "call SUPPORT.REFRESH_ACTORS_SUMMARY(?)",
        Long.valueOf(unionId));
JdbcTemplate的最佳实践

JdbcTemplate一旦被配置之后,他的实例就是线程安全的。这一点比较重要,因为这样你就可以把他注入到多个DAO或者Repository中。按照前文先配置DataSource,然后在构造函数里面实例化JdbcTemplate

总结

新建项目,添加依赖,添加spring的xml配置文件,写repo,写application,获取bean,运行。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019-08-14 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Jdbc的使用
    • 环境搭建步骤
      • 新建项目
      • applicationContext.xml
      • db.properties
      • Repository
      • 程序入口
    • 使用demo
      • 查询相关(select)
      • update相关(包括insert,update,delete)
      • execute 方法
      • JdbcTemplate的最佳实践
    • 总结
    相关产品与服务
    对象存储
    对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档