spring是一站式框架,就是在javaee三层中,每一层都有解决技术
而jdbcTemplate技术用在dao层
jdbcTemplate实现crud操作
-
增加
首先导入数据库操作所需的jar包
创建类,测试用JdbcTemplate技术操作数据库
(1)设置数据库信息,相当于配置连接池
(2)创建JdbcTemplate对象,把配置好的数据库信息传到JdbcTemplate对象中
(3)利用update方法进行添加
package xidian.lili.anno;
import org.junit.Test;
import org.springframework.context.annotation.EnableLoadTimeWeaving;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.datasource.DriverManagerDataSource;
public class JdbcTemplateDemo01 {
/**
* 增加
*/
@Test
public void add() {
//设置数据库信息
DriverManagerDataSource dataSource=new DriverManagerDataSource();
dataSource.setDriverClassName("com.mysql.jdbc.Driver");
dataSource.setUrl("jdbc:mysql:///employees");
dataSource.setUsername("root");
dataSource.setPassword("123456");
//创建jdbcTemplate模板对象,设置数据源
JdbcTemplate jdbcTemplate=new JdbcTemplate(dataSource);
//调用jdbcTemplate里的方法进行添加操作
String sql="insert into departments values(?,?)";
int i=jdbcTemplate.update(sql, "d010","Hr");
System.out.println(i);
}
}
-
修改
与增加方法一样,修改sql语句即可
/**
* 修改
*/
@Test
public void update() {
// 设置数据库信息
DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setDriverClassName("com.mysql.jdbc.Driver");
dataSource.setUrl("jdbc:mysql:///employees");
dataSource.setUsername("root");
dataSource.setPassword("123456");
// 创建jdbcTemplate模板对象,设置数据源
JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
// 调用jdbcTemplate里的方法进行添加操作
String sql = "update departments set dept_name=? where dept_no=?";
int i = jdbcTemplate.update(sql, "dev", "d010");
System.out.println(i);
}
-
删除
同理,修改sql语句
@Test
public void delete() {
// 设置数据库信息
DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setDriverClassName("com.mysql.jdbc.Driver");
dataSource.setUrl("jdbc:mysql:///employees");
dataSource.setUsername("root");
dataSource.setPassword("123456");
// 创建jdbcTemplate模板对象,设置数据源
JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
// 调用jdbcTemplate里的方法进行添加操作
// String sql="insert into departments values(?,?)";
String sql = "delete from departments where dept_no=?";
int i = jdbcTemplate.update(sql, "d010");
System.out.println(i);
}
-
查询
(1)查询返回条目数int i = jdbcTemplate.queryForObject(sql, Integer.class);
/**
* 查詢返回条目数
*/
@Test
public void testCount() {
// 设置数据库信息
DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setDriverClassName("com.mysql.jdbc.Driver");
dataSource.setUrl("jdbc:mysql:///employees");
dataSource.setUsername("root");
dataSource.setPassword("123456");
// 创建jdbcTemplate模板对象,设置数据源
JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
// 调用jdbcTemplate里的方法进行添加操作
String sql = "select count(*) from departments";
int i = jdbcTemplate.queryForObject(sql, Integer.class);
System.out.println(i);
}
(2)查询返回对象
类似于jdbc,查询返回结果集存储到ResultSet中,在java jdbc框架中封装了ResultSet接口的实现类,但是在这里需要自己创建rowMapper接口的实现类。
/**
* 查詢返回对象
*/
@Test
public void testObject() {
// 设置数据库信息
DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setDriverClassName("com.mysql.jdbc.Driver");
dataSource.setUrl("jdbc:mysql:///employees");
dataSource.setUsername("root");
dataSource.setPassword("123456");
// 创建jdbcTemplate模板对象,设置数据源
JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
// 调用jdbcTemplate里的方法进行添加操作
String sql = "select * from departments where dept_no=?";
User user =jdbcTemplate.queryForObject(sql, new MyrowMapper(), "d006");
System.out.println(user);
}
class MyrowMapper implements RowMapper<User>{
@Override
public User mapRow(ResultSet rs, int rowNum) throws SQLException {
String deptname=rs.getString("dept_name");
String deptno=rs.getString("dept_no");
User user=new User();
user.setDeptno(deptno);
user.setDeptname(deptname);
return user;
}
}
(3)查询返回结果集
调用JdbcTemplate中的<User> List<User> query(String sql, RowMapper<User> rowMapper)方法,MyrowMapper类与上述一致
/**
* 查詢返回list结果集
*/
@Test
public void testList() {
// 设置数据库信息
DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setDriverClassName("com.mysql.jdbc.Driver");
dataSource.setUrl("jdbc:mysql:///employees");
dataSource.setUsername("root");
dataSource.setPassword("123456");
// 创建jdbcTemplate模板对象,设置数据源
JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
// 调用jdbcTemplate里的方法进行添加操作
String sql = "select * from departments";
List<User> list = jdbcTemplate.query(sql, new MyrowMapper());
for (User user : list) {
System.out.println(user);
}
}
}
上述测试是应用JdbcTemplate类实现curd操作,但是在spring框架中,当然是借助spring配置文件来实现上述功能
也就是在dao层使用jdbcTemplate实现方法,在service层调用dao
-
导入jar包
要是c3p0的jar版本太高会出现问题,所以导入第一个
-
spring配置c3p0连接池
在代码中我们会按照下面这么写,所以在配置文件中,根据ComboPooledDataSource类的路径创建bean对象,根据类中的set方法注入属性,这样就创建了连接池对象
ComboPooledDataSource dataSource=new ComboPooledDataSource();
dataSource.setDriverClass("com.mysql.jdbc.Driver");
dataSource.setUrl("jdbc:mysql:///employees");
dataSource.setUsername("root");
dataSource.setPassword("123456");
-
配置service对象
在service中调用dao,注入dao属性
-
配置dao对象
在dao类中要使用jdbctemplate对象的方法,注入 jdbctemplate属性
-
配置jdbctemplate对象
要传入dataSource对象
综上,spring配置文件如下:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd">
<!-- 配置c3p0连接池 -->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass" value="com.mysql.jdbc.Driver"></property>
<property name="jdbcUrl" value="jdbc:mysql:///employees"></property>
<property name="user" value="root"></property>
<property name="password" value="123456"></property>
</bean>
<!-- 配置dao类 -->
<bean id="user" class="xidian.lili.anno.User">
<!-- 向dao类中注入jdbcTemplate属性 -->
<property name="jdbcTemplate" ref="jdbcTemplate"></property>
</bean>
<!-- 配置service类 -->
<bean id="userService" class="xidian.lili.anno.UserService">
<!-- 向service类中注入dao属性 -->
<property name="user" ref="user"></property>
</bean>
<!-- 创建jdbcTemplate对象 -->
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<!-- 向service类中注入连接池属性 -->
<property name="dataSource" ref="dataSource"></property>
</bean>
</beans>
dao层User类如下:
package xidian.lili.anno;
import org.springframework.jdbc.core.JdbcTemplate;
public class User {
private String deptno;
public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
this.jdbcTemplate = jdbcTemplate;
}
private String deptname;
private JdbcTemplate jdbcTemplate;
public void add() {
String sql="insert into departments values(?,?)";
int row=jdbcTemplate.update(sql, "d010","hr");
System.out.println(row);
}
public String getDeptno() {
return deptno;
}
public void setDeptno(String deptno) {
this.deptno = deptno;
}
public String getDeptname() {
return deptname;
}
public void setDeptname(String deptname) {
this.deptname = deptname;
}
@Override
public String toString() {
return "User [deptno=" + deptno + ", deptname=" + deptname + "]";
}
}
service层UserService类如下:
package xidian.lili.anno;
public class UserService {
private User user;
public void setUser(User user) {
this.user = user;
}
public void add(){
user.add();
}
}
测试:
package xidian.lili.anno;
import java.security.Provider.Service;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class TestTemplate {
@Test
public void test(){
ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml");
UserService servcie=(UserService) context.getBean("userService");
servcie.add();
}
}