一:配置数据库连接池及jdbc Template或NamedParameterJdbcTemplate,
<!-- 导入资源文件 -->
<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="jdbcUrl" value="${jdbc.jdbcUrl}"></property>
<property name="driverClass" value="${jdbc.driverClass}"></property>
<property name="initialPoolSize" value="${jdbc.initPoolSize}"></property>
<property name="maxPoolSize" value="${jdbc.maxPoolSize}"></property>
</bean>
<context:component-scan base-package="com.wh.spring"></context:component-scan>
<!-- 配置spring的jdbc Template -->
<bean id="jdbcTemplate"
class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="dataSource"></property>
</bean>
<!-- 配置 NamedParameterJdbcTemplate,该对象可以使用具名参数,其没有无参构造器,必须为其构造器指定参数-->
<bean id="namedParameterJdbcTemplate"
class="org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate">
<constructor-arg ref="dataSource"></constructor-arg>
</bean>
二:使用jdbc Template
import static org.junit.Assert.*;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.sql.DataSource;
import org.junit.Test;
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 org.springframework.jdbc.core.namedparam.BeanPropertySqlParameterSource;
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;
import org.springframework.jdbc.core.namedparam.SqlParameterSource;
public class JDBCTest {
private ApplicationContext ctx;
private JdbcTemplate jdbcTemplate;
private Spring4Dao spring4Dao;
private Spring4DaoUseDaoSupport spring4DaoUseDaoSupport;
private NamedParameterJdbcTemplate namedParameterJdbcTemplate;
{
ctx=new ClassPathXmlApplicationContext("applicationContext.xml");
jdbcTemplate=(JdbcTemplate) ctx.getBean("jdbcTemplate");
spring4Dao=(Spring4Dao) ctx.getBean("spring4Dao");
spring4DaoUseDaoSupport=(Spring4DaoUseDaoSupport) ctx.getBean("spring4DaoUseDaoSupport");
namedParameterJdbcTemplate=(NamedParameterJdbcTemplate) ctx.getBean("namedParameterJdbcTemplate");
}
//@Test
public void testDataSource() throws SQLException {
DataSource dataSource=(DataSource) ctx.getBean("dataSource");
System.out.println(dataSource.getConnection());
}
/**
* 执行Insert,update,delete
*/
//@Test
public void testUpdate() {
String sql="insert into spring4 (name ,age) values('wh','23')";
jdbcTemplate.update(sql);
}
/**
* 执行批量更新:批量的inset,Updata,Delete
* 最后一个参数是List<Object[]>,修改一条记录需要一个Object[]
*/
//@Test
public void testBatchUpdate() {
String sql="insert into spring4(name,age) values(?,?)";
List<Object[]> batchArgs=new ArrayList<>();
batchArgs.add(new Object[] {"a",1});
batchArgs.add(new Object[] {"b",2});
batchArgs.add(new Object[] {"c",3});
batchArgs.add(new Object[] {"d",4});
jdbcTemplate.batchUpdate(sql,batchArgs);
}
/**
* 从数据库中获取一条记录,实际得到对应的一个对象
* 表跟类对应,记录跟对象对应(ORM)
* 注意,不是调用queryForObject(String sql, Class<Spring4> requiredType, @Nullable Object... args) 方法
* 该方法返回一个字段的值
* 查询一条记录需要调用queryForObject(String sql, RowMapper<Spring4> rowMapper, @Nullable Object... args)方法
* 1:RowMapper指定如何映射结果的行,常用的实现类为BeanPropertyRowMapper;
* 2:使用SQL中的列的别名完成列名和类的属性名的映射 , 例如last_name lastName
* 3:不支持级联属性,jdbcTemplate是JDBC的小工具,不是ORM框架
*/
//@Test
public void testQueryForObject() {
String sql="select * from spring4 where name=?";
RowMapper<Spring4> rowMapper=new BeanPropertyRowMapper<>(Spring4.class);
Spring4 spring4=jdbcTemplate.queryForObject(sql, rowMapper,"a");
System.out.println(spring4);
}
/**
* 查到实体类的集合
* 注意,调用的不是queryForList
*/
//@Test
public void testQueryForList() {
String sql="select * from spring4 where name=?";
RowMapper<Spring4> rowMapper=new BeanPropertyRowMapper<>(Spring4.class);
List<Spring4> spring4s=jdbcTemplate.query(sql, rowMapper,"wh");
System.out.println(spring4s);
}
/**
*获取单个列的值,或做统计查询
*使用queryForObject(String sql, Class<Integer> requiredType) 方法
*/
//@Test
public void testQueryForObject2() {
String sql="select count(*) from spring4";
int count=jdbcTemplate.queryForObject(sql, Integer.class);
System.out.println(count);
}
//@Test
public void testSpring4Dao() {
System.out.println(spring4Dao.get("a"));
}
//@Test
public void testSpring4DaoUseDaoSupport() {
System.out.println(spring4DaoUseDaoSupport.get("a"));
}
/**
* 可以为参数起名字
* 1:若有多个参数,则不用再对应位置,直接对应参数名,便于维护
* 2:较为麻烦
*/
//@Test
public void testNamedParameterJdbcTemplate() {
String sql="insert into spring4(name,age) values(:na,:ag)";
Map<String, String> paramMap=new HashMap<>();
paramMap.put("na", "wa");
paramMap.put("ag", "12");
namedParameterJdbcTemplate.update(sql, paramMap);
}
/**
* 使用具名参数时,可以使用update(String sql, SqlParameterSource paramSource) 方法进行更新操作
* 1:SQL语句的参数名和属性一致
* 2:使用SqlParameterSource的BeanPropertySqlParameterSource实现类作为参数
*/
@Test
public void testNamedParameterJdbcTemplate2() {
String sql="insert into spring4(name,age) values(:name,:age)";
Spring4 spring4=new Spring4();
spring4.setAge(16);
spring4.setName("小叶子");
SqlParameterSource paramSource=new BeanPropertySqlParameterSource(spring4);
namedParameterJdbcTemplate.update(sql, paramSource);
}
}
三:使用 JdbcDaoSupport
注意:要为 JdbcDaoSupport配置DataSource或jdbc Template
import javax.sql.DataSource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.jdbc.core.support.JdbcDaoSupport;
import org.springframework.stereotype.Repository;
/**
* 不推荐使用JdbcDaoSupport
* 推荐使用jdbcTemplate作为Dao的成员变量
*/
@Repository
public class Spring4DaoUseDaoSupport extends JdbcDaoSupport{
//由于setDataSource被Final修饰
@Autowired
public void setDataSource2(DataSource dataSource) {
setDataSource(dataSource);
}
public Spring4 get(String name) {
String sql="select * from spring4 where name=?";
RowMapper<Spring4> rowMapper=new BeanPropertyRowMapper<>(Spring4.class);
return getJdbcTemplate().queryForObject(sql, rowMapper,name);
}
}