Spring 中的JdbcTemplate

Posted 红颜莫知己

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring 中的JdbcTemplate相关的知识,希望对你有一定的参考价值。

目录

1.JdbcTemplate

  • Jdbc是Spring框架中提供的一个对象,是对原始JDBC API的简单封装。 Spring框架为我们提供了很多的操作模板类。
  • 操作关系型数据的:

JdbcTemplate
HibernateTemplate

  • 操作nosql数据库的:

RedisTemplate

  • 操作消息队列的:

JmsTemplate

  • 我们今天的主角在spring-jdbc-5.2.5.RELEASE.jar中,我们在导包的时候,除了要导入这个jar包外,还需要导入spring-tx-5.2.5.RELEASE.jar(和事务相关的)

2.使用jdbcTemplate进行数据库操作

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = SpringConfig.class)
public class Test2 
    @Resource
    private JdbcTemplate jdbcTemplate;

    /**
     * 最普通的测试
     */
    @Test
    public void test1()
        String sql = "insert into t_channel(cid,cname,description) " +
                        "   values(222,'教育','教育')";
        jdbcTemplate.execute(sql);
    

    /**
     * 添加测试
     */
    @Test
    public void test2()
        String sql = "insert into t_channel(cid,cname,description) " +
                "   values(?,?,?)";
        jdbcTemplate.update(sql,23,"科学","科学");
    

    /**
     * 更新测试
     */
    @Test
    public void test3()
        String sql = "update t_channel set cname = ?,description = ? where cid = ?";
        jdbcTemplate.update(sql,"农业","农业",222);
    

    /**
     * 删除测试
     */
    @Test
    public void test4()
        String sql = "delete from t_channel where cid = ?";
        jdbcTemplate.update(sql,222);
    

    /**
     * 查询列表测试
     */
    @Test
    public void test5()
        class T implements RowMapper<Channel>
            @Override
            public Channel mapRow(ResultSet rs, int i) throws SQLException 
                Channel c = new Channel();
                c.setCid(rs.getInt("cid"));
                c.setCname(rs.getString("cname"));
                c.setDescription(rs.getString("description"));
                return c;
            
        
        String sql = "select * from t_channel";
        List<Channel> list = jdbcTemplate.query(sql,new T());
        System.out.println(list);
    

    /**
     * 查询列表测试
     */
    @Test
    public void test6()

        String sql = "select cid,cname,description from t_channel";
        List<Map<String,Object>> list = jdbcTemplate.queryForList(sql);
        System.out.println(list);
        for(Map<String,Object> row : list)
            System.out.println(row.get("cid"));
            System.out.println(row.get("cname"));
            System.out.println(row.get("description"));
        
    

    /**
     * 查询一条记录测试
     */
    @Test
    public void test7()

        String sql = "select cid,cname,description from t_channel where cid = ?";
        Channel c = jdbcTemplate.queryForObject(sql, new RowMapper<Channel>() 
            @Override
            public Channel mapRow(ResultSet rs, int i) throws SQLException 
                Channel c = new Channel();
                c.setCid(rs.getInt("cid"));
                c.setCname(rs.getString("cname"));
                c.setDescription(rs.getString("description"));
                return c;
            
        ,9);

        System.out.println(c);

    

    /**
     * 查询一条基本类型(Integer,String等)数据测试
     */
    @Test
    public void test8()

        String sql = "select count(*) from t_channel";
        Integer a = jdbcTemplate.queryForObject(sql,Integer.class);

        System.out.println(a);

    


3.事务管理

3.1编程式事务

spring提供事务管理器,可以进行事务管理

我们通过一个转账示例来说明事务的细节

1.创建一个帐户表

create table t_account(
  accountName varchar(20),
  money int
)

2.添加张三李四两个帐号

insert into t_account values('张三',10000); -- 添加张三帐户
insert into t_account values('李四',10000); -- 添加李四帐户

3.创建帐户实体类

package edu.xalead.entity;

import lombok.Data;
import org.springframework.stereotype.Component;

@Data
public class Account 
    private String accountName;
    private int money;

4.创建配置类

package edu.config;

import com.alibaba.druid.pool.DruidDataSource;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.*;
import org.springframework.jdbc.core.JdbcTemplate;

import javax.sql.DataSource;

@Configuration
@PropertySource("classpath:application.properties")
@ComponentScan(basePackages = "edu.xalead")
public class Config 
    @Value("$jdbc.driverClass")
    private String driverClass;
    @Value("$jdbc.url")
    private String url;
    @Value("$jdbc.username")
    private String username;
    @Value("$jdbc.password")
    private String password;

    @Bean
    public DataSource dataSource()
        DruidDataSource ds = new DruidDataSource();
        ds.setDriverClassName(driverClass);
        ds.setUrl(url);
        ds.setUsername(username);
        ds.setPassword(password);
        return ds;
    
    @Bean
    public JdbcTemplate jdbcTemplate(DataSource dataSource)
        JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
        return jdbcTemplate;
    


5.创建配置类所需要的属性文件application.properties

jdbc.driverClass=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/cms
jdbc.username=root
jdbc.password=root

可以有些学者的数据库添加的时候会出现??,我们只需要在URL后面加上?useUnicode=true&characterEncoding=UTF8,即

jdbc.url=jdbc:mysql://localhost:3306/cms?useUnicode=true&characterEncoding=UTF8

6.创建dao接口及实现类

package edu.xalead.dao;

import edu.xalead.entity.Account;
import edu.xalead.entity.Channel;

public interface ChannelDao 
    /**
     * 根据帐号名查询帐号
     * @param accountName
     * @return
     */
    public Account findByAccountName(String accountName);

    /**
     * 修改帐号
     * @param account
     */
    public void updateAccount(Account account);

//实现类
package edu.xalead1.dao;

import edu.xalead.entity.Account;
import edu.xalead.entity.Channel;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Repository;

import javax.annotation.Resource;
import java.sql.ResultSet;
import java.sql.SQLException;

@Repository("channelDao")
public class ChannelDaoImpl implements ChannelDao 
    @Resource
    private JdbcTemplate jdbcTemplate;
    public Account findByAccountName(String accountName) 
        String sql = "select * from t_account where accountName = ?";

        return jdbcTemplate.queryForObject(sql, new RowMapper<Account>() 
            public Account mapRow(ResultSet resultSet, int i) throws SQLException 
                Account a = new Account();
                a.setAccountName(resultSet.getString("accountName"));
                a.setMoney(resultSet.getInt("money"));
                return a;
            
        ,accountName);
    

    public void updateAccount(Account account) 
        String sql = "update t_account set money = ? where accountName = ?";
        jdbcTemplate.update(sql,account.getMoney(),account.getAccountName());
    


7.Service接口及实现类

接口

package edu.xalead.service;

import edu.xalead.entity.Channel;

public interface ChannelService 
    public void addChannel(Channel channel);
    /**
     * 转帐
     */
    public void zhuangZhang();

实现类

@Service("channelService")
public class ChannelServiceImpl implements ChannelService 
    @Resource
    private DataSource dataSource;
    /**
     * 转帐
     */
    public void zhuangZhang()
        //默认的事务定义
        TransactionDefinition definition = new DefaultTransactionDefinition();
        //实例化事务管理器,
        DataSourceTransactionManager transactionManager = new DataSourceTransactionManager(dataSource);


        String account1 = "张三";
        String account2 = "李四";

        Account a1 = channelDao.findByAccountName(account1);

        Account a2 = channelDao.findByAccountName(account2);

        //转帐
        a1.setMoney(a1.getMoney() - 1000);//张三帐号的存款减1000
        a2.setMoney(a2.getMoney() + 1000);//李四帐号的存款加1000
        //开启事务,开启事务时,要指定事务的定义
        TransactionStatus transactionStatus = null;

        try 
            transactionStatus = transactionManager.getTransaction(definition);
            //转帐实际是两个更新操作
            channelDao.updateAccount(a1);//更新张三的帐户
//            if(1==1)
//                throw new RuntimeException("异常!");
//            
            channelDao.updateAccount(a2);//更新李四的帐户
            //提交,无异常则提交,开启事务后对数据库的更新全部持久化
            transactionManager.commit(transactionStatus);
         catch (RuntimeException e) 
            e.printStackTrace();
            //回滚,有异常则回滚,回滚意味着开启事务后所有数据库的更新全部取消
            transactionManager.rollback(transactionStatus);
        
    


8.测试

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = Config.class)
public class Test1 
    @Resource
    private ChannelService channelService;
    @Test
    public void test1()
        channelService.zhuangZhang();
    

若有误,请指教!!!

以上是关于Spring 中的JdbcTemplate的主要内容,如果未能解决你的问题,请参考以下文章

使用 Spring JdbcTemplate 时如何动态更改数据库/目录

JdbcTemplate 如何自动生成主键

Spring 从入门到精通系列 11—— Spring 中的 JdbcTemplate

Spring第四课 Spring框架以及JDBCTemplate的使用

学习笔记——定义切面优先级 ;Spring中的JdbcTemplate;JdbcTemplate的常用API

Spring中的JdbcTemplate