JdbcTemplate
概述
JdbcTemplate是Spring提供的一个模板类,它是对jdbc的封装.用于支持持久层的操作.具有简单,方便等特点.
pom.xml
5.0.2.RELEASE
5.1.30
org.springframework
spring-context
${spring.version}
org.springframework
spring-jdbc
${spring.version}
mysql
mysql-connector-java
${mysql.version}
入门案例
/**
* spring JdbcTemplate入门案例
*/
public class JdbcTemplateDemo {
public static void main(String[] args) {
/**
* 需求:通过JdbcTemplate实现添加一条账户记录,到账户表account中
*/
// 创建JdbcTemplate对象
JdbcTemplate jdbcTemplate = new JdbcTemplate();
// 设置数据源对象
DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setDriverClassName("com.mysql.jdbc.Driver");
dataSource.setUrl("jdbc:mysql://127.0.0.1:3306/spring");
dataSource.setUsername("root");
dataSource.setPassword("root");
jdbcTemplate.setDataSource(dataSource);
// 添加账户信息
jdbcTemplate.update("insert into account(name,money) values('小黄',2000)");
}
}
SpringIOC管理JdbcTemplate
bean.xml
案例
/**
* spring JdbcTemplate入门案例
*/
public class JdbcTemplateDemo {
public static void main(String[] args) {
/**
* 通过spring IOC容器管理JdbcTemplate对象
*/
// 1.加载spring配置文件,创建spring IOC容器
ApplicationContext context = new ClassPathXmlApplicationContext("classpath:bean.xml");
// 2.从spring IOC容器中,获取JdbcTemplate
JdbcTemplate jdbcTemplate = (JdbcTemplate)context.getBean("jdbcTemplate");
// 3.添加账户
jdbcTemplate.update("insert into account(name,money) values('小敏',2000)");
}
}
整合数据源
在使用JdbcTemplate的时候,需要设置一个数据源对象才能完成数据库操作
内置数据源
c3p0数据源
0.9.5
com.mchange
c3p0
${c3p0.version}
dbcp数据源
1.4
commons-dbcp
commons-dbcp
${dbcp.version}
druid数据源
1.0.29
com.alibaba
druid
${druid.version}
RoeMapper
在JdbcTemplate中query方法有一个参数:RowMapper用于对结果集进行封装
public List query(String sql, RowMapper rowMapper) throws DataAccessException{
return ....
}
BeanPropertyRowMapper
Spring框架提供的RowMapper通用实现类
// 类结构
public class BeanPropertyRowMapper implements RowMapper{
.....
}
/**
* 关键方法一
* 1.根据传递进来的类型信息,通过反射技术,获取类的全部成员变量,以及set方法
* 2.把类的成员变量名称,和对应的set方法,存在集合Map中
* 3.等待执行完成数据库操作后,把对应字段的值,赋值到对应的成员变量上
*/
protected void initialize(Class mappedClass){
......
}
/**
* 关键方法二
* 1.执行完成数据库操作后,拿到结果集ResultSet
* 2.循环遍历ResultSet,每一行记录,调用一次该方法,进行结果集的封装
*/
public T mapRow(ResultSet rs, int rowNumber) throws SQLException{
......
}
自定义RowMapper
有时候为了代码更加简洁,会考虑使用自定义的RowMapper
/**
* 自定义结果集隐射:RowMapper
*/
public class CustomRowMapper implements RowMapper{
/**
* 实现结果集封装方法: mapRow
* 该方法每一行结果集记录就调用一次
*/
public T mapRow(ResultSet rs, int rowNumber) throws SQLException{
Object object = new Object();
object.setXXX(XXX);
return object;
}
}
SpringIOC案例实现
pom.xml
5.0.2.RELEASE
1.0.29
5.1.30
org.springframework
spring-context
${spring.version}
org.springframework
spring-jdbc
${spring.version}
com.alibaba
druid
${druid.version}
mysql
mysql-connector-java
${mysql.version}
完全xml版本
bean.xml
dao
public class Dao{
// 定义JdbcTemplate
private JdbcTemplate jdbcTemplate;
public void setJdbcTemplate(JdbcTemplate jdbcTemplate){
this.jdbcTemplate = jdbcTemplate;
}
public List findAll(){
// 定义sql
String sql = "select * from table";
// 返回执行结果
return jdbcTemplate.query(sql, new CustomRowMapper());
}
}
service
public class Service{
// 定义dao
private Dao dao;
public void setDao(Dao dao){
this.dao = dao;
}
public List findAll(){
return dao.findAll();
}
}
Controller
public class Controller {
public static void main(String[] args) {
// 1.加载spring配置文件,创建spring容器
ApplicationContext context = new ClassPathXmlApplicationContext("classpath:bean.xml");
// 2.获取客户service对象
Service Service = (Service) context.getBean("Service");
// 3.查询全部客户列表数据
List list = Service.findAll();
for(T t:list){
System.out.println(t);
}
}
}
xml与注解混合版本
bean.xml
dao
@Repository("dao")
public class Dao{
// 定义JdbcTemplate
@Autowired
private JdbcTemplate jdbcTemplate;
public List findAll(){
// 定义sql
String sql = "select * from table";
// 返回查询结果
return jdbcTemplate.query(sql, new CustomRowMapper());
}
}
service
@Service("service")
public class Service{
// 定义dao
private Dao dao;
public List findAll(){
return dao.findAll();
}
}
完全注解基础版本
Spring配置类
/**
* 注解说明
* @Configuration: 标记当前java类是一个Spring的配置类
* @ComponentScan: 配置扫描包,相当于xml配置中 标签
*/
@Configuration
@ComponentScan(value = {"com.XXX"})
public class SpringConfiguration{
// 配置JdbcTemplate
@Bean(value = "jdbcTemplate")
public JdbcTemplate createJdbcTemplate(DataSource dataSource){
// 创建JdbcTemplate对象
JdbcTemplate jdbcTemplate = new JdbcTemplate();
jdbcTemplate.setDataSource(dataSource);
return jdbcTemplate;
}
// 配置DataSource
@Bean(value = "dataSource")
public DataSource createDataSource(){
// 创建DataSource
DruidDataSource dataSource = new DruidDataSource();
// 注入属性
dataSource.setDriverClassName("com.mysql.jdbc.Driver");
dataSource.setUrl("jdbc:mysql://127.0.0.1:3306/spring");
dataSource.setUsername("root");
dataSource.setPassword("root");
dataSource.setInitialSize(6);
dataSource.setMinIdle(3);
dataSource.setMaxActive(50);
dataSource.setMaxWait(60000);
dataSource.setTimeBetweenEvictionRunsMillis(60000);
return dataSource;
}
}
Controller
public class Controller{
public static void main(String[] args){
// 1.加载Spring配置类,创建Spring容器
ApplicationContext context = new AnnotationConfigApplicationContext(SpringConfiguration.class);
// 2.获取service对象
Service service = (Service)context.getBean("service");
// 调用方法得到结果
List list = service.findAll();
for(T t : list){
System.out.println(t);
}
}
}
完全注解优化版本
建立配置类之间关系
/**
* spring配置类:
* 注解说明:
* 1.@Configuration:标记当前java类,是一个spring的配置类
* 2.@ComponentScan:配置扫描包。相当于xml配置中 标签
* 3.@Import:导入其他模块配置类
* 4.@PropertySource:导入属性资源文件
*/
@Configuration
@ComponentScan(value = {"com.XXX"})
@Import(value={DaoConfiguration.class})
@PropertySource(value={"classpath:jdbc.properties"})
jdbc.properties
jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://127.0.0.1:3306/spring
jdbc.username=root
jdbc.password=root
jdbc.initialSize=6
jdbc.minIdle=3
jdbc.maxActive=50
jdbc.maxWait=60000
jdbc.timeBetweenERM=60000
Dao
public class DaoConfiguration {
@Bean(value="jdbcTemplate")
public JdbcTemplate createJdbcTemplate(DataSource dataSource){
// 创建JdbcTemplate对象
JdbcTemplate jdbcTemplate = new JdbcTemplate();
jdbcTemplate.setDataSource(dataSource);
return jdbcTemplate;
}
// 定义连接数据库的成员变量
/**
* 使用@Value注解,进行赋值
* 使用格式:@Value("${}")
*/
@Value("${jdbc.driverClassName}")
private String driverClassName;
@Value("${jdbc.url}")
private String url;
@Value("${jdbc.username}")
private String username;
@Value("${jdbc.password}")
private String password;
@Value("${jdbc.initialSize}")
private Integer initialSize;
@Value("${jdbc.minIdle}")
private Integer minIdle;
@Value("${jdbc.maxActive}")
private Integer maxActive;
@Value("${jdbc.maxWait}")
private Integer maxWait;
@Value("${jdbc.timeBetweenERM}")
private Integer timeBetweenERM;
@Bean(value="dataSource")
public DataSource createDataSource(){
// 创建DataSource
DruidDataSource dataSource = new DruidDataSource();
// 注入属性
// 注入属性
dataSource.setDriverClassName(driverClassName);
dataSource.setUrl(url);
dataSource.setUsername(username);
dataSource.setPassword(password);
dataSource.setInitialSize(initialSize);
dataSource.setMinIdle(minIdle);
dataSource.setMaxActive(maxActive);
dataSource.setMaxWait(maxWait);
dataSource.setTimeBetweenEvictionRunsMillis(timeBetweenERM);
return dataSource;
}
}