30.【 Spring中的JdbcTemplate】

JdbcTemplate的概述和入门

package cn.luis.jdbctemplate;

import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.datasource.DriverManagerDataSource;

public class Demo1 {

    public static void main(String[] args) {
        // 准备数据源
        DriverManagerDataSource dataSource = new DriverManagerDataSource();
        dataSource.setDriverClassName("com.mysql.jdbc.Driver");
        dataSource.setUrl("jdbc:mysql:///eesy");
        dataSource.setUsername("root");
        dataSource.setPassword("root");

        // 创建对象
        JdbcTemplate jt = new JdbcTemplate();
        // 给jt设置数据源 【在创建对象时传入也可】
        jt.setDataSource(dataSource);
        // 执行操作
        jt.execute("insert into account(name,money)values('ccc',1000)");
    }
}

JdbcTemplate在IOC中使用

package cn.luis.jdbctemplate;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.datasource.DriverManagerDataSource;

public class Demo2 {

    public static void main(String[] args) {
        // 创建容器对象
        ApplicationContext ac = new ClassPathXmlApplicationContext("bean.xml");
        // 获取对象
        JdbcTemplate jt = ac.getBean("jdbcTemplate",JdbcTemplate.class);

        // 执行操作
        jt.execute("insert into account(name,money)values('ddd',2000)");
    }
}

配置文件

<?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="cn.luis.dao.impl.AccountDaoImpl">
        <property name="jdbcTemplate" ref="jdbcTemplate"></property>
        <!--JdbcDaoSupport里面自动生成JDBCTemplate-->
<!--        <property name="dataSource" ref="dataSource"></property>-->
    </bean>
    <!--配置JDBCTemplate-->
    <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
        <property name="dataSource" ref="dataSource"></property>
    </bean>

    <!--配置数据源-->
    <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="root"></property>
    </bean>

</beans>

JdbcTemplate的CRUD操作

在查询时我们自己创建了 AccountRowMapper类 实现了RowMapper<>接口,它的作用就是,一个把结果集的数据封装到Account中,由Spring将每个account添加到集合中

  • Spring提供了一个:new BeanPropertyRowMapper<T>()实现

    T:就是我们要封装的类型,参数就是字节码文件,填入之后即可实现相同作用。

  • 聚合函数的第二个参数类型:Integer、Long均可。

   Long count = jt.queryForObject("select count(*) from account where money > ?", Long.class, 1000f);

代码:

package cn.luis.jdbctemplate;

import cn.luis.domian.Account;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;

/**
 * JdbcTemplate的CRUD操作
 * @author L
 */
public class Demo3 {

    public static void main(String[] args) {
        // 1.创建容器对象
        ApplicationContext ac = new ClassPathXmlApplicationContext("bean.xml");
        // 2.获取对象
        JdbcTemplate jt = ac.getBean("jdbcTemplate",JdbcTemplate.class);
        // 3.执行操作
        // 3.1保存
        //jt.update("insert into account(name,money)values(?,?)","eee",3000F);
        // 3.2更新
        //jt.update("update account set name=?,money=? where id=?","test",4567,5);
        // 3.3删除
        //jt.update("delete from account where id = ?",5);
        // 3.4查询所有[RowMapper接口]
        //List<Account> accounts = jt.query("select * from account where money > ?", new AccountRowMapper(), 1000);
        // 由spring提供的new BeanPropertyRowMapper
        /*List<Account> accounts = jt.query("select * from account where money > ?", new BeanPropertyRowMapper<Account>(Account.class), 1000);
        for (Account account : accounts) {
            System.out.println(account);
        }*/
        // 3.5查询一个
        //List<Account> accounts1 = jt.query("select * from account where id = ?", new BeanPropertyRowMapper<Account>(Account.class), 6);
        //System.out.println(accounts1.isEmpty() ? "没有内容" : accounts1.get(0));
        // 3.6查询返回一行一列(聚合函数)【三个参数:第二个参数代表返回值类型】
        Long count = jt.queryForObject("select count(*) from account where money > ?", Long.class, 1000f);
        System.out.println(count);

    }
}

/**
 * 定义Account的封装策略 【3.4查询所有】
 */
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;
    }
}

将CRUD操作写到Dao层实现类中

package cn.luis.dao.impl;

import cn.luis.dao.IAccountDao;
import cn.luis.domian.Account;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;

import java.util.List;

/**
 * @ClassName IAccountDaoImpl
 * @Description 账户的持久层实现类
 * @Author L
 * @Date 2020.04.05 21:46
 * @Version 1.0
 * @Remark TODO
 **/

public class AccountDaoImpl implements IAccountDao {
    
    private JdbcTemplate jdbcTemplate;

    public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
        this.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 accont where name = ?", new BeanPropertyRowMapper<Account>(Account.class), accountName);
        if (accountName.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());
    }
}

测试类

package cn.luis.jdbctemplate;

import cn.luis.dao.IAccountDao;
import cn.luis.domian.Account;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.jdbc.core.JdbcTemplate;

/**
 * JdbcTemplate在spring的ioc中使用
 * @author L
 */
public class Demo4 {

    public static void main(String[] args) {
        //1.获取容器
        ApplicationContext ac = new ClassPathXmlApplicationContext("bean.xml");
        //2.获取对象
        IAccountDao accountDao = ac.getBean("accountDao", IAccountDao.class);

        Account account = accountDao.findAccountById(1);
        System.out.println(account);

        account.setMoney(30000f);
        accountDao.updateAccount(account);
        System.out.println(account);
    }
}

JdbcDaoSupport

有两种来源

  • JdbcDaoSupport这个类由我们自己写时:spring可以通过xml和注解两种方式配置
  •      若继承spring提供的`JdbcDaoSupport`时,我们无法修改jar包中的代码,无法添加注解!
    

代码:

  • 此类用于抽取dao中的重复代码
package cn.luis.dao.impl;

import org.springframework.jdbc.core.JdbcTemplate;

import javax.sql.DataSource;

public class JdbcDaoSupport {

    private JdbcTemplate jdbcTemplate;

    public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
        this.jdbcTemplate = jdbcTemplate;
    }

    public JdbcTemplate getJdbcTemplate() {
        return jdbcTemplate;
    }


    public void setDataSource(DataSource dataSource) {
        if(jdbcTemplate == null){
            jdbcTemplate = createJdbcTemplate(dataSource);
        }
    }

    private JdbcTemplate createJdbcTemplate(DataSource dataSource){
        return new JdbcTemplate(dataSource);
    }
}

实现类需继承JdbcDaoSupport

extends JdbcDaoSupport

package cn.luis.dao.impl;

import cn.luis.dao.IAccountDao;
import cn.luis.domian.Account;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;

import java.util.List;


public class AccountDaoImpl extends JdbcDaoSupport implements IAccountDao {

    /**
     *  super.getJdbcTemplate()使用父类的
     * @param accountId
     * @return
     */
    @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 = getJdbcTemplate().query("select * from accont where name = ?", new BeanPropertyRowMapper<Account>(Account.class), accountName);
        if (accountName.isEmpty()) {
            return null;
        }
        if (accounts.size() > 1) {
            throw new RuntimeException("结果集不唯一");
        }
        return accounts.get(0);
    }

    @Override
    public void updateAccount(Account account) {
        getJdbcTemplate().update("update account set name=?,money=? where id=?",account.getName(),account.getMoney(),account.getId());
    }
}
发布了36 篇原创文章 · 获赞 14 · 访问量 3586

猜你喜欢

转载自blog.csdn.net/qq_39720594/article/details/105341149
今日推荐