Spring框架学习笔记(9)——Spring对JDBC的支持

一、使用JdbcTemplate和JdbcDaoSupport

1、配置并连接数据库

①创建项目并添加jar包,要比之前Spring项目多添加两个jar包c3p0-0.9.1.2.jar和mysql-connector-java-5.1.7-bin.jar

②创建db.properties添加以下配置

pp为数据库名initPoolSize和maxPoolSize随意

jdbc.user=root
jdbc.password=root
jdbc.driverClass=com.mysql.jdbc.Driver
jdbc.jdbcUrl=jdbc:mysql:///pp

jdbc.initPoolSize=5
jdbc.maxPoolSize=10

③创建applicationContext.xml添加配置

<!-- 导入资源 -->
<context:property-placeholder location="classpath:db.properties"/>

<!-- 配置C3P0数据源 -->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
   <property name="user" value="${jdbc.user}"></property>
      <property name="password" value="${jdbc.password}"></property>
      <property name="driverClass" value="${jdbc.driverClass}"></property>
      <property name="jdbcUrl" value="${jdbc.jdbcUrl}"></property>
      
      <property name="initialPoolSize" value="${jdbc.initPoolSize}"></property>
      <property name="maxPoolSize" value="${jdbc.maxPoolSize}"></property>
</bean>

④创建一个单元测试类测试是否能够连接数据库

public class JDBCtest {

    private ApplicationContext ctx = null;
    
    {
        ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
    }
    @Test
    public void testDataSource() throws SQLException {
        DataSource dataSource = ctx.getBean(DataSource.class);
        System.out.println(dataSource.getConnection());
    }

}

MySql创建数据库

2、使用JdbcTemplate

①applicationContext.xml添加bean

<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
    <property name="dataSource" ref="dataSource"></property>
</bean>

②修改JDBCtest.java添加JbdcTemplate属性和Update方法

public class JDBCtest {

    private ApplicationContext ctx = null;
    
    private JdbcTemplate jdbcTemplate = null;
    
    {
        ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
        jdbcTemplate = (JdbcTemplate) ctx.getBean("jdbcTemplate");
    }

    @Test
    public void testUpdate() {
        String sql = "update tbl_user set name = ? where id = ?";
        jdbcTemplate.update(sql, "李四" , 1);
    }
    
    @Test
    public void testDataSource() throws SQLException {
        DataSource dataSource = ctx.getBean(DataSource.class);
        System.out.println(dataSource.getConnection());
    }
}

执行成功“张三”修改为“李四”

update还可以用来新增和删除

使用jdbcTemplate.update执行insert和delete

@Test
public void testUpdate() {
    String sql = "update tbl_user set name = ? where id = ?";
    jdbcTemplate.update(sql, "李四", 1);
    String sql1 = "insert into tbl_user(name , account) values (?,?)";
    jdbcTemplate.update(sql1, new Object[]{"jj",250});
    String sql2 = "delete from tbl_user where id = ?";
    jdbcTemplate.update(sql2, 1);
}

③使用jdbcTemplate.batchUpdate执行批量操作

@Test
public void testBatchUpdate() {
    String sql = "insert into tbl_user(name , account) values (?,?)";
    List<Object[]> args = new ArrayList<Object[]>();
    args.add(new Object[] { "jja", 250 });
    args.add(new Object[] { "jjb", 260 });
    args.add(new Object[] { "jjc", 270 });
    args.add(new Object[] { "jjd", 280 });
    args.add(new Object[] { "jje", 290 });
    jdbcTemplate.batchUpdate(sql, args);
}

同样的batchUpdate也可以用来执行批量删除和添加

④使用jdbcTemplate.queryForObject从数据库获取对象

首先新建对象User

public class User {

    private int id;
    private String name;
    private double account;
    private Date birthday;

    public int getId() {
        return id;
    }

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

    public String getName() {
        return name;
    }

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

    public double getAccount() {
        return account;
    }

    public void setAccount(double account) {
        this.account = account;
    }

    public Date getBirthday() {
        return birthday;
    }

    public void setBirthday(Date birthday) {
        this.birthday = birthday;
    }

    @Override
    public String toString() {
        return "User [id=" + id + ", name=" + name + ", account=" + account + ", birthday=" + birthday + "]";
    }

}

在JDBCtest.java里添加testQueryForObject方法

/**
 * <p>Description: 从数据库获取一个对象
 * 不是使用jdbcTemplate.queryForObject(sql, requiredType, args)方法
 * 而是使用jdbcTemplate.queryForObject(sql, args, argTypes, rowMapper)方法
 * </p>
 */
@Test
public void testQueryForObject() {
    String sql = "select id, name, account, birthday from tbl_user where id = ?";
    RowMapper<User> rowMapper = new BeanPropertyRowMapper<User>(User.class); 
    User user = jdbcTemplate.queryForObject(sql, rowMapper, 1);
    System.out.println(user.toString());
}

⑤使用jdbcTemplate的局限性

不支持级联属性,JdbcTemplate到底是一JDBC小工具不是ORM框架

 ⑥查实体类集合

/**
 * <p>Description: 查实体类集合</p>
 */
@Test
public void testQueryForList() {
    String sql = "select id, name, account, birthday from tbl_user where id > ?";
    RowMapper<User> rowMapper = new BeanPropertyRowMapper<User>(User.class); 
    List<User> users = jdbcTemplate.query(sql, rowMapper, 5);
    System.out.println(users.toString());
}

 二、使用NamedParameterJdbcTemplate

1、配置NamedParameterJdbcTemplate Bean

<!-- 该对象可以使用具名参数,该对象没有无参构造器,所以必须传一个参数 -->
<bean id="namedParameterJdbcTemplate" class="org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate">
    <constructor-arg ref="dataSource"></constructor-arg>
</bean>

2、在JDBCtest测试类中添加测试方法

/**
 * <p>Description: 可以为参数起名字增强维护性,较为麻烦</p>
 */
@Test
public void testNamedParameterJdbcTemplate() {
    String sql = "insert into tbl_user(name, account) values (:name,:account)";
    Map<String , Object> paramMap = new HashMap<String , Object>();
    paramMap.put("name", "hj");
    paramMap.put("account", "10000000000");
    namedParameterJdbcTemplate.update(sql, paramMap);
}

/**
 * <p>Description: 可以直接传对象</p>
 */
@Test
public void testNamedParameterJdbcTemplate2() {
    String sql = "insert into tbl_user(name, account) values (:name,:account)";
    User user = new User();
    user.setName("kk");
    user.setAccount(666);
    SqlParameterSource paramSource = new BeanPropertySqlParameterSource(user);
    namedParameterJdbcTemplate.update(sql, paramSource);
}

数据库中添加数据成功

在经典的 JDBC 用法中, SQL 参数是用占位符 ? 表示,并且受到位置的限制. 定位参数的问题在于, 一旦参数的顺序发生变化, 就必须改变参数绑定. 
在 Spring JDBC 框架中, 绑定 SQL 参数的另一种选择是使用具名参数(named parameter). 
具名参数: SQL 按名称(以冒号开头)而不是按位置进行指定. 具名参数更易于维护, 也提升了可读性. 具名参数由框架类在运行时用占位符取代
具名参数只在 NamedParameterJdbcTemplate 中得到支持
原文地址:https://www.cnblogs.com/huangjian2/p/6397547.html