美文网首页
Spring使用JdbcTemplate操作数据库附源码解释

Spring使用JdbcTemplate操作数据库附源码解释

作者: 码农很低调 | 来源:发表于2021-04-01 18:58 被阅读0次

    目录

    1.JdbcTemplate概述

    2.JdbcTemplate准备工作

    • 引入相关 jar 包
    • 如果是maven项目,使用pom.xml代替引入jar包的过程(注意)
    • 配置xml配置文件

    3.JdbcTemplate 操作数据库

    • 准备好数据库uset_db创建一个t_user表
    • 对应数据库创建User实体类
    • 创建UserDao接口并创建UserDaoImpl类
    • 创建UserService类并在其中注入UserDao
    • 编写测试类进行测试

    4.JdbcTemplate源码解释

    • jdbcTemplate.update(增删改操作)
    • jdbcTemplate.queryForObject(返回记录条数)
    • jdbcTemplate.queryForObject(返回对象)
    • jdbcTemplate.query(返回对象集合)
    • jdbcTemplate.batchUpdate(批量操作)

    JdbcTemplate概述

    Spring 框架对 JDBC 进行封装,使用 JdbcTemplate 方便实现对数据库操作。

    JdbcTemplate准备工作

    引入相关 jar 包

    Spring使用JdbcTemplate操作数据库附源码解释

    如果是maven项目,使用pom.xml代替引入jar包的过程(注意)

    pom.xml:

    <?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.Keafmd</groupId>
        <artifactId>day04_eesy_01jdbctemplate</artifactId>
        <version>1.0-SNAPSHOT</version>
        <build>
            <plugins>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-compiler-plugin</artifactId>
                    <configuration>
                        <source>7</source>
                        <target>7</target>
                    </configuration>
                </plugin>
            </plugins>
        </build>
        <packaging>jar</packaging>
    
        <dependencies>
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-context</artifactId>
                <version>5.2.6.RELEASE</version>
            </dependency>
    
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-jdbc</artifactId>
                <version>5.2.7.RELEASE</version>
            </dependency>
    
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-tx</artifactId>
                <version>5.2.7.RELEASE</version>
            </dependency>
    
            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
                <version>5.1.46</version>
            </dependency>
            <dependency>
                <groupId>com.alibaba</groupId>
                <artifactId>druid</artifactId>
                <version>1.1.10</version>
            </dependency>
    
            <dependency>
                <groupId>org.aspectj</groupId>
                <artifactId>aspectjweaver</artifactId>
                <version>1.8.9</version>
            </dependency>
            <dependency>
                <groupId>junit</groupId>
                <artifactId>junit</artifactId>
                <version>4.12</version>
                <scope>compile</scope>
            </dependency>
        </dependencies>
    
    </project>
    ————————————————
    

    maven项目的代码结构:

    image.png

    配置xml配置文件

    在 spring 配置文件配置数据库连接池,配置 JdbcTemplate 对象,注入 DataSource。配置时用的是引用外部配置文件,所以还需要引入外部的属性文件,同时创建对象时是基于注解的所以还要开启组件扫描。

    bean1.xml:

    <?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:p="http://www.springframework.org/schema/p"
           xmlns:util="http://www.springframework.org/schema/util"
           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/util http://www.springframework.org/schema/util/spring-util.xsd
                               http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
    
        <!--开启组件扫描-->
        <context:component-scan base-package="com.Keafmd"></context:component-scan>
    
        <!--引入外部的属性文件-->
        <context:property-placeholder location="classpath:jdbc.properties"/>
    
        <!--配置连接池-->
        <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
    
            <property name="driverClassName" value="${jdbc.driverClass}"></property>
            <property name="url" value="${jdbc.url}" ></property>
            <property name="username" value="${jdbc.username}" ></property>
            <property name ="password" value="${jdbc.password}" ></property>
    
        </bean>
    
        <!--创建jdbcTemplate对象-->
        <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
            <!--注入DataSource-->
            <property name="dataSource" ref="dataSource"></property>
    
        </bean>
    
    </beans>
    

    jdbc.properties:

    jdbc.driverClass=com.mysql.jdbc.Driver
    jdbc.url=jdbc:mysql://127.0.0.1:3306/user_db?characterEncoding=utf8&useUnicode=true&useSSL=false
    jdbc.username=root
    jdbc.password=root
    

    JdbcTemplate 操作数据库

    相关的操作及注释都在代码中,请看代码。

    准备好数据库uset_db创建一个t_user表

    Spring使用JdbcTemplate操作数据库附源码解释

    对应数据库创建User实体类

    User类:

    package com.Keafmd.spring5.entity;
    
    /**
     * Keafmd
     *
     * @ClassName: User
     * @Description: 数据库对应user实体类
     * @author: 牛哄哄的柯南
     * @date: 2021-01-19 10:07
     */
    
    public class User {
        private String userId;
        private String username;
        private String ustatus;
    
        public User() {
        }
    
        public User(String userId, String username, String ustatus) {
            this.userId = userId;
            this.username = username;
            this.ustatus = ustatus;
        }
    
        public void setUserId(String userId) {
            this.userId = userId;
        }
    
        public void setUsername(String username) {
            this.username = username;
        }
    
        public void setUstatus(String ustatus) {
            this.ustatus = ustatus;
        }
    
        public String getUserId() {
            return userId;
        }
    
        public String getUsername() {
            return username;
        }
    
        public String getUstatus() {
            return ustatus;
        }
    
        @Override
        public String toString() {
            return "User{" +
                    "userId='" + userId + '\'' +
                    ", username='" + username + '\'' +
                    ", ustatus='" + ustatus + '\'' +
                    '}';
        }
    }
    

    创建UserDao接口并创建UserDaoImpl类

    在UserDaoImpl内注入jdbcTemplate。

    UserDao接口:

    package com.Keafmd.spring5.dao;
    
    import com.Keafmd.spring5.entity.User;
    
    import java.util.List;
    
    /**
     * Keafmd
     *
     * @ClassName: UserDao
     * @Description:
     * @author: 牛哄哄的柯南
     * @date: 2021-01-19 9:56
     */
    
    public interface UserDao {
    
        //添加方法
        void add(User user);
    
        //修改方法
        void updateUser(User user);
    
        //删除方法
        void delete(String id);
    
        //查询记录数
        int selectCount();
    
        //查询返回对象
        User findUserInfo(String id);
    
        //查询集合
        List<User> findAllUser();
    
        //批量添加
        void batchAddUser(List<Object[]> batchArgs);
    
        //批量修改
        void batchUpdateUser(List<Object[]> batchArgs);
    
        //批量删除
        void batchDeleteUser(List<Object[]> batchArgs);
    }
    

    UserDaoImpl类:

    package com.Keafmd.spring5.dao;
    
    import com.Keafmd.spring5.entity.User;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.jdbc.core.BeanPropertyRowMapper;
    import org.springframework.jdbc.core.JdbcTemplate;
    import org.springframework.stereotype.Repository;
    
    import java.util.Arrays;
    import java.util.List;
    
    /**
     * Keafmd
     *
     * @ClassName: UserDaoImpl
     * @Description: UserDao实现类
     * @author: 牛哄哄的柯南
     * @date: 2021-01-19 9:56
     */
    @Repository
    public class UserDaoImpl implements UserDao {
    
        //注入jdbcTemplate
        @Autowired
        private JdbcTemplate jdbcTemplate;
    
        //添加的方法
        @Override
        public void add(User user) {
            //创建sql语句
            String sql=" INSERT INTO t_user (user_id, username, ustatus) VALUES (?, ?, ?) ";
            // 调用方法实行
            int updat = jdbcTemplate.update(sql,user.getUserId(),user.getUsername(),user.getUstatus());
            // 返回成功的条数
            System.out.println(updat);
        }
        //修改
        @Override
        public void updateUser(User user) {
    
            String sql = "UPDATE   user_db.t_user SET   username = ?,  ustatus = ? WHERE user_id = ?";
            Object[] args = {user.getUsername(),user.getUstatus(),user.getUserId()};
            int updat = jdbcTemplate.update(sql,args);
            System.out.println(updat);
        }
        //删除
        @Override
        public void delete(String id) {
    
            String sql ="DELETE FROM user_db.t_user WHERE user_id = ?";
            int updat = jdbcTemplate.update(sql,id);
            System.out.println(updat);
        }
    
        //查询记录数
        @Override
        public int selectCount() {
            String sql ="SELECT COUNT(*) FROM t_user";
            Integer count = jdbcTemplate.queryForObject(sql,Integer.class);
            return count;
    
        }
    
        //返回对象
        @Override
        public User findUserInfo(String id) {
            String sql ="SELECT * FROM t_user where user_id = ?";
            User user = jdbcTemplate.queryForObject(sql,new BeanPropertyRowMapper<User>(User.class),id);
            return user;
        }
    
        //返回集合对象
        @Override
        public List<User> findAllUser() {
            String sql = "select * from t_user";
            List<User> userList =jdbcTemplate.query(sql,new BeanPropertyRowMapper<User>(User.class));
            return userList;
        }
    
        //批量添加
        @Override
        public void batchAddUser(List<Object[]> batchArgs) {
            String sql=" INSERT INTO t_user (user_id, username, ustatus) VALUES (?, ?, ?) ";
            int []ints = jdbcTemplate.batchUpdate(sql,batchArgs);
            System.out.println(Arrays.toString(ints));
        }
    
        //批量修改
        @Override
        public void batchUpdateUser(List<Object[]> batchArgs) {
            String sql = "UPDATE   user_db.t_user SET   username = ?,  ustatus = ? WHERE user_id = ?";
            int []ints = jdbcTemplate.batchUpdate(sql,batchArgs);
            System.out.println(Arrays.toString(ints));
        }
    
        //批量删除
        @Override
        public void batchDeleteUser(List<Object[]> batchArgs) {
            String sql ="DELETE FROM user_db.t_user WHERE user_id = ?";
            int []ints = jdbcTemplate.batchUpdate(sql,batchArgs);
            System.out.println(Arrays.toString(ints));
        }
    }
    

    创建UserService类并在其中注入UserDao

    UserService类:

    package com.Keafmd.spring5.service;
    
    import com.Keafmd.spring5.dao.UserDao;
    import com.Keafmd.spring5.dao.UserDaoImpl;
    import com.Keafmd.spring5.entity.User;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Service;
    
    import java.util.List;
    
    /**
     * Keafmd
     *
     * @ClassName: BookService
     * @Description:
     * @author: 牛哄哄的柯南
     * @date: 2021-01-19 9:55
     */
    @Service
    public class UserService {
    
        //注入dao
        @Autowired
        private UserDao userDao;
    
        //添加的方法
        public void addUser(User user){
            userDao.add(user);
        }
    
        //修改的方法
        public void updateUser(User user){
            userDao.updateUser(user);
        }
    
        //删除的方法
        public void deleteUser(String id){
            userDao.delete(id);
        }
    
        //查询表中的记录数
        public int findCount(){
            return userDao.selectCount();
        }
    
        //查询返回对象
        public User findOne(String id){
            return userDao.findUserInfo(id);
        }
    
        //查询返回集合
        public List<User> findAll(){
            return userDao.findAllUser();
        }
    
        //批量添加
        public void batchAdd(List<Object[]> batchArgs){
            userDao.batchAddUser(batchArgs);
        }
    
        //批量修改
        public void batchUpdate(List<Object[]> batchArgs){
            userDao.batchUpdateUser(batchArgs);
        }
    
        //批量删除
        public void batchDelete(List<Object[]> batchArgs){
            userDao.batchDeleteUser(batchArgs);
        }
    
    }
    

    编写测试类进行测试

    TestUser :

    package com.Keafmd.spring5.test;
    
    import com.Keafmd.spring5.entity.User;
    import com.Keafmd.spring5.service.UserService;
    import org.junit.Test;
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.support.ClassPathXmlApplicationContext;
    
    import java.util.ArrayList;
    import java.util.List;
    
    /**
     * Keafmd
     *
     * @ClassName: TestUser
     * @Description:
     * @author: 牛哄哄的柯南
     * @date: 2021-01-19 10:35
     */
    public class TestUser {
    
        @Test
        public void testJdbcTemplate(){
            ApplicationContext context = new ClassPathXmlApplicationContext("bean1.xml");
            UserService userService = context.getBean("userService", UserService.class);
    
            //添加
            /*User user = new User("001","Keafmd","11");
            userService.addUser(user);*/
    
            //更新
            /*User user1 = new User("001","Keafmd","2");
            userService.updateUser(user1);*/
    
            //删除
            /*String id = "2";
            userService.deleteUser(id);*/
    
            //返回总条数
            int count = userService.findCount();
            System.out.println(count);
    
            // 返回对象
            User user = userService.findOne("1");
            System.out.println(user);
    
            // 返回集合对象
    
            List<User> userList =userService.findAll();
            System.out.println(userList);
    
            //批量添加
            /*List<Object[]> batchArgs = new ArrayList<>();
            Object[]o1 = {"7","77","7"};
            Object[]o2 = {"8","88","8"};
            Object[]o3 = {"9","99","9"};
            batchArgs.add(o1);
            batchArgs.add(o2);
            batchArgs.add(o3);
            userService.batchAdd(batchArgs);*/
    
            //批量修改
            /*List<Object[]> batchArgs = new ArrayList<>();
            Object[]o11 = {"tt","2","7"};
            Object[]o22 = {"uu","2","8"};
            Object[]o33 = {"ii","2","9"};
            batchArgs.add(o11);
            batchArgs.add(o22);
            batchArgs.add(o33);
            userService.batchUpdate(batchArgs);*/
    
            //批量删除
            List<Object[]> batchArgs = new ArrayList<>();
            Object[]o1 = {"7"};
            Object[]o2 = {"8"};
            Object[]o3 = {"9"};
            batchArgs.add(o1);
            batchArgs.add(o2);
            batchArgs.add(o3);
            userService.batchDelete(batchArgs);
    
        }
    }
    

    输出结果:

    一月 19, 2021 4:05:28 下午 com.alibaba.druid.pool.DruidDataSource info
    信息: {dataSource-1} inited
    9
    User{userId='1', username='Keafmd', ustatus='2'}
    [User{userId='1', username='Keafmd', ustatus='2'}, User{userId='2', username='aa', ustatus='1'}, User{userId='3', username='bb', ustatus='1'}, User{userId='4', username='cc', ustatus='1'}, User{userId='5', username='dd', ustatus='1'}, User{userId='6', username='ee', ustatus='1'}, User{userId='7', username='tt', ustatus='2'}, User{userId='8', username='uu', ustatus='2'}, User{userId='9', username='ii', ustatus='2'}]
    [1, 1, 1]
    
    Process finished with exit code 0
    
    Spring使用JdbcTemplate操作数据库附源码解释

    上面两行红色的是日志信息,不是报错,不用担心。

    JdbcTemplate源码解释

    jdbcTemplate.update(增删改操作)

    在增删改操作中调用的jdbcTemplate.update(sql,id);中有两个参数。 源码:

    public int update(String sql, @Nullable Object... args) throws DataAccessException {
        return this.update(sql, this.newArgPreparedStatementSetter(args));
    }
    

    第一个参数:sql 语句。

    第二个参数:可变参数,设置为 sql 语句值。

    jdbcTemplate.queryForObject(返回记录条数)

    在查询记录数操作中调用的
    jdbcTemplate.queryForObject(sql,Integer.class);中有两个参数。

    源码:

    public <T> T queryForObject(String sql, Class<T> requiredType) throws DataAccessException {
        return this.queryForObject(sql, this.getSingleColumnRowMapper(requiredType));
    }
    

    两个参数:

    第一个参数:sql 语句。

    第二个参数:返回类型 Class。

    jdbcTemplate.queryForObject(返回对象)

    在返回对象中调用的
    jdbcTemplate.queryForObject(sql,new BeanPropertyRowMapper(User.class),id);中有三个参数。

    源码:

    public <T> T queryForObject(String sql, RowMapper<T> rowMapper, @Nullable Object... args) throws DataAccessException {
        List<T> results = (List)this.query((String)sql, (Object[])args, (ResultSetExtractor)(new RowMapperResultSetExtractor(rowMapper, 1)));
        return DataAccessUtils.nullableSingleResult(results);
    }
    

    有三个参数 :

    第一个参数:sql 语句。

    第二个参数:RowMapper 是接口,针对返回不同类型数据,使用这个接口里面实现类完成数据封装。

    第三个参数:sql 语句值。

    jdbcTemplate.query(返回对象集合)

    在返回对象集合中调用的jdbcTemplate.query(sql,newBeanPropertyRowMapper(User.class));中有两个参数。

    源码:

    public <T> List<T> query(String sql, RowMapper<T> rowMapper) throws DataAccessException {
        return (List)result(this.query((String)sql, (ResultSetExtractor)(new RowMapperResultSetExtractor(rowMapper))));
    }
    

    有两个个参数 :

    第一个参数:sql 语句。

    第二个参数:RowMapper 是接口,针对返回不同类型数据,使用这个接口里面实现类完成数据封装。

    jdbcTemplate.batchUpdate(批量操作)

    在批量操作中调用的jdbcTemplate.batchUpdate(sql,batchArgs);有两个参数。

    源码:

    public int[] batchUpdate(String sql, List<Object[]> batchArgs) throws DataAccessException {
        return this.batchUpdate(sql, batchArgs, new int[0]);
    }
    

    有两个参数 :

    第一个参数:sql 语句。

    第二个参数:List 集合,添加了多条记录数据。

    以上就是Spring中使用JdbcTemplate操作数据库(增删改查以及批量操作)附带源码解释的全部内容。

    看完如果对你有帮助,感谢点赞支持!

    如果你是电脑端的话,看到右下角的 “一键三连” 了吗,没错点它[哈哈]

    Spring使用JdbcTemplate操作数据库附源码解释

    原文链接:
    https://blog.csdn.net/weixin_43883917/article/details/112845731

    相关文章

      网友评论

          本文标题:Spring使用JdbcTemplate操作数据库附源码解释

          本文链接:https://www.haomeiwen.com/subject/oiotkltx.html