• Spring中的 JdbcTemplate


    Spring中的 JdbcTemplate

    JdbcTemplate 概述

    它是 spring 框架中提供的一个对象,是对原始 Jdbc API 对象的简单封装。spring 框架为我们提供了很多 的操作模板类。

    操作关系型数据的:

    JdbcTemplate

    HibernateTemplate
    操作 nosql 数据库的: RedisTemplate
    操作消息队列的: JmsTemplate
    我们今天的主角在 spring-jdbc-5.0.2.RELEASE.jar 中,我们在导包的时候,除了要导入这个 jar 包 外,还需要导入一个 spring-tx-5.0.2.RELEASE.jar(它是和事务相关的)。

    环境搭建

    bean.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"
           xsi:schemaLocation="http://www.springframework.org/schema/beans
            http://www.springframework.org/schema/beans/spring-beans.xsd">
    
    
        
        <!-- 配置账户的持久层-->  
        <bean id="accountDao" class="com.itheima.dao.impl.AccountDaoImpl">
            <!--<property name="jdbcTemplate" ref="jdbcTemplate"></property>-->
            <property name="dataSource" ref="dataSource"></property>
        </bean>
    
        <!--配置JdbcTemplate <!-- 引入外部属性文件: --> 
        <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
            <property name="dataSource" ref="dataSource"></property>
        </bean>-->
    
        <!-- 配置数据源-->
       我们之前已经接触过了两个数据源,C3P0 和 DBCP。要想使用这两数据源都需要导入对应的 jar 包。
      spring 框架也提供了一个内置数据源,我们也可以使用 spring 的内置数据源,它就在 spring-jdbc-5.0.2.REEASE.jar 包中
        <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
            <property name="driverClassName" value="com.mysql.jdbc.Driver"></property>
            <property name="url" value="jdbc:mysql://localhost:3306/eesy"></property>
            <property name="username" value="root"></property>
            <property name="password" value="1234"></property>
        </bean>
    </beans>
    

    JdbcTemplate的最基本用法

    使用xml配置

    package com.itheima.dao.impl;
    
    import com.itheima.dao.IAccountDao;
    import com.itheima.domain.Account;
    import org.springframework.jdbc.core.BeanPropertyRowMapper;
    import org.springframework.jdbc.core.support.JdbcDaoSupport;
    
    import java.util.List;
    
    /**
     * 账户的持久层实现类
     */
    public class AccountDaoImpl extends JdbcDaoSupport implements IAccountDao {
    
        @Override
        public Account findAccountById(Integer accountId) {
            List<Account> accounts = super.getJdbcTemplate().query("select * from account where id = ?",new BeanPropertyRowMapper<Account>(Account.class),accountId);
            return accounts.isEmpty()?null:accounts.get(0);
        }
    
        @Override
        public Account findAccountByName(String accountName) {
            List<Account> accounts = super.getJdbcTemplate().query("select * from account where name = ?",new BeanPropertyRowMapper<Account>(Account.class),accountName);
            if(accounts.isEmpty()){
                return null;
            }
            if(accounts.size()>1){
                throw new RuntimeException("结果集不唯一");
            }
            return accounts.get(0);
        }
    
        @Override
        public void updateAccount(Account account) {
            super.getJdbcTemplate().update("update account set name=?,money=? where id=?",account.getName(),account.getMoney(),account.getId());
        }
    }
    
    

    使用注解配置

    package com.itheima.dao.impl;
    
    import com.itheima.dao.IAccountDao;
    import com.itheima.domain.Account;
    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.List;
    
    /**
     * 账户的持久层实现类
     */
    @Repository
    public class AccountDaoImpl2 implements IAccountDao {
    
        @Autowired
        private JdbcTemplate jdbcTemplate;
    
    
        @Override
        public Account findAccountById(Integer accountId) {
            List<Account> accounts = jdbcTemplate.query("select * from account where id = ?",new BeanPropertyRowMapper<Account>(Account.class),accountId);
            return accounts.isEmpty()?null:accounts.get(0);
        }
    
        @Override
        public Account findAccountByName(String accountName) {
            List<Account> accounts = jdbcTemplate.query("select * from account where name = ?",new BeanPropertyRowMapper<Account>(Account.class),accountName);
            if(accounts.isEmpty()){
                return null;
            }
            if(accounts.size()>1){
                throw new RuntimeException("结果集不唯一");
            }
            return accounts.get(0);
        }
    
        @Override
        public void updateAccount(Account account) {
            jdbcTemplate.update("update account set name=?,money=? where id=?",account.getName(),account.getMoney(),account.getId());
        }
    }
    

    JdbcTemplate的CRUD用法

    package com.itheima.jdbctemplate;
    
    import com.itheima.domain.Account;
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.support.ClassPathXmlApplicationContext;
    import org.springframework.jdbc.core.JdbcTemplate;
    import org.springframework.jdbc.core.RowMapper;
    
    import java.sql.ResultSet;
    import java.sql.SQLException;
    
    /**
     * JdbcTemplate的CRUD操作
     */
    public class JdbcTemplateDemo3 {
    
        public static void main(String[] args) {
            //1.获取容器
            ApplicationContext ac = new ClassPathXmlApplicationContext("bean.xml");
            //2.获取对象
            JdbcTemplate jt = ac.getBean("jdbcTemplate",JdbcTemplate.class);
            //3.执行操作
            
            保存
            jt.update("insert into account(name,money)values(?,?)","eee",3333f);
            
            更新
            jt.update("update account set name=?,money=? where id=?","test",4567,7);
            
            删除
            jt.update("delete from account where id=?",8);
            
            查询所有
            List<Account> accounts = jt.query("select * from account where money > ?",new AccountRowMapper(),1000f);
            List<Account> accounts = jt.query("select * from account where money > ?",new BeanPropertyRowMapper<Account>(Account.class),1000f);
            for(Account account : accounts){
                System.out.println(account);
            }
            
           查询一个
           List<Account> accounts = jt.query("select * from account where id = ?",new BeanPropertyRowMapper<Account>(Account.class),1);
           System.out.println(accounts.isEmpty()?"没有内容":accounts.get(0));
    
            查询返回一行一列(使用聚合函数,但不加group by子句)
            Long count = jt.queryForObject("select count(*) from account where money > ?",Long.class,1000f);
            System.out.println(count);
        }
    }
    
    /**
     * 定义Account的封装策略 
     */
    class AccountRowMapper implements RowMapper<Account>{
        /**
         * 把结果集中的数据封装到Account中,然后由spring把每个Account加到集合中
         * @param rs
         * @param rowNum
         * @return
         * @throws SQLException
         */
        @Override
        public Account mapRow(ResultSet rs, int rowNum) throws SQLException {
            Account account = new Account();
            account.setId(rs.getInt("id"));
            account.setName(rs.getString("name"));
            account.setMoney(rs.getFloat("money"));
            return account;
        }
    }
    
  • 相关阅读:
    几个数之和----数组刷题
    单调栈刷题
    腾讯金融科技凉经
    mysql刷题
    链表类题目常用方法
    阿里云一面凉经
    腾讯TEG一面凉经
    腾讯软件开发-后台开发实习生-一面凉经
    剑指 Offer 19. 正则表达式匹配
    剑指 Offer 20. 表示数值的字符串
  • 原文地址:https://www.cnblogs.com/Lilwhat/p/12593335.html
Copyright © 2020-2023  润新知