目录
Spring中使用JdbcTemplate操作数据库
DataSource配置
1.database.properties属性文件
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/my?useUnicode=true&characterEncoding=utf-8
jdbc.username=root
jdbc.password=root
2.创建连接池对象(ComboPoolDataSource,dataSource数据源)
<!-- 加载配置文件 -->
<context:property-placeholder location="classpath:database.properties" />
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass" value="${jdbc.driver}"></property>
<property name="driverClass" value="com.mysql.jdbc.Driver" />
<property name="jdbcUrl" value="${jdbc.url}"></property>
<property name="user" value="${jdbc.username}"></property>
<property name="password" value="${jdbc.password}"></property>
</bean>
3.创建JdbcTemplate对象,并注入连接池(数据源)
<bean id="jdbctemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="dataSource"></property>
</bean>
4.创建UserDao对象,并注入JdbcTemplate对象
<bean id="userDao" class="cn.my.UserDao">
<property name="jdbcTemplate" ref="jdbctemplate"></property>
</bean>
5.创建UserService对象,并注入UserDao对象
<bean id="userService" class="cn.my.UserService">
<property name="userDao" ref="userDao"></property>
</bean>
XML配置
要使用Jdbctemplate对象来完成jdbc操作。通常有三种种方式得到JdbcTemplate对象。
DataSource --> JdbcTemplate --> DaoImpl
在自己定义的DAO实现类中注入一个DataSource引用来完成JdbcTemplate的实例化。也就是它是从外部“注入”DataSource到DAO中,然后自己实例化JdbcTemplate,然后将DataSource设置到JdbcTemplate对象中。
1.数据访问层实现类(UserDaoImpl.java)
public class UserDaoImpl implements UserDao {
private JdbcTemplate jdbcTemplate;
//set注入
public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
this.jdbcTemplate= jdbcTemplate;
}
//省略方法jdbcTemplate.?
}
2.业务逻辑层实现类(UserServiceImpl.java)
public class UserServiceImpl implements UserService {
private UserDao userDao;
//set注入
public void setUserDao(UserDao userDao) {
this.userDao= userDao;
}
//其他方法省略...
}
3.XML配置IoC容器
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="dataSource">
</bean>
<bean id="userDaoImpl" class="com.my.dao.impl.UserDaoImpl">
<property name="jdbcTemplate" ref="jdbcTemplate"/>
</bean>
<bean id="userServiceImpl" class="com.my.dao.impl.UserDaoImpl">
<property name="userDao" ref="userDaoImpl"/>
</bean>
DataSource --> new JdbcTemplate(dataSource)
在Spring的IoC容器中配置一个JdbcTemplate的Bean,将DataSource注入进来,然后再把JdbcTemplate注入到自定义DAO中
1.数据访问层实现类(UserDaoImpl.java)
public class UserDaoImpl implements UserDao {
private JdbcTemplate jdbcTemplate;
//set注入
public void setDataSource(DataSource dataSource) {
this.jdbcTemplate = new JdbcTemplate(dataSource);
}
//省略方法jdbcTemplate.?
}
2.业务逻辑层实现类(UserServiceImpl.java)
public class UserServiceImpl implements UserService {
private UserDao userDao;
//set注入
public void setUserDao(UserDao userDao) {
this.userDao= userDao;
}
//其他方法省略...
}
3.XML配置IoC容器
<bean id="userDaoImpl" class="com.my.dao.impl.UserDaoImpl">
<property name="dataSource" ref="dataSource"/>
</bean>
<bean id="userServiceImpl" class="com.my.service.impl.UserServiceImpl">
<property name="userDao" ref="userDaoImpl"/>
</bean>
继承JdbcDaoSupport(推荐)
继承JdbcDaoSupport,其内部有个JdbcTemplate,需要注入DataSource属性来实例化。
Spring提供了org.springframework.jdbc.core.support.JdbcDaoSupport类,这个类中定义了JdbcTemplate属性,也定义了DataSource属性,当设置DataSource属性的时候,会创建jdbcTemplate的实例,所以自己编写的DAO只需要继承JdbcDaoSupport类,然后注入DataSource即可。提倡采用第三种方法。虽然下面的用法中采用了前两种方法。
1.数据访问层实现类继承JdbcDaoSupport(UserDaoImpl.java)
public class UserDaoImpl extends JdbcDaoSupport implements UserDao {
@Override
public void save(User user) {
String sql = null;
this.getJdbcTemplate().update(sql);
}
//其它方法省略……
}
2.业务逻辑层实现类(UserServiceImpl.java)
public class UserServiceImpl implements UserService {
private UserDao userDao;
//set注入
public void setUserDao(UserDao userDao) {
this.userDao= userDao;
}
//其他方法省略...
}
XML配置IoC容器
<bean id="userDaoImpl" class="com.my.dao.impl.UserDaoImpl>
<property name="dataSource" ref="dataSource"/>
</bean>
<bean id="userServiceImpl" class="com.my.service.impl.UserServiceImpl">
<property name="userDao" ref="userDaoImpl"/>
</bean>
注解
1.数据访问层实现类(UserDaoImpl.java)
@Repository
public class UserDaoImpl implements UserDao {
@AutoWired //自动注入
private JdbcTemplate jdbc;
//省略jdbc.?()等方法
}
2.业务逻辑层实现类(UserServiceImpl.java)
public class UserServiceImpl implements UserService {
@AutoWired
private UserDao userDao;
//其他方法省略...
}
3.XML配置
<!-- 1.配置包扫描 -->
<context:component-scan base-package="cn.my"></context:component-scan>
<!-- 2.创建连接池对象,dataSource的名字不能改变 -->
<context:property-placeholder location="classpath:db.properties" />
<bean id="dataSource"
class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass" value="${jdbc.driver}"></property>
<property name="jdbcUrl" value="${jdbc.url}"></property>
<property name="user" value="${jdbc.username}"></property>
<property name="password" value="${jdbc.password}"></property>
</bean>
<!-- 3.创建jdbcTemplate对象,并注入连接池对象 -->
<bean id="jdbctemplate"
class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="dataSource"></property>
</bean>
JdbcTemplate
jdbcTemplate对于查询来说,如果对sql比较精通,使用起来非常方便,灵活。
Spring对数据库的操作在jdbc上面做了深层次的封装,使用spring的注入功能,可以把DataSource注册到JdbcTemplate之中。
JdbcTemplate位于spring-jdbc-4.3.0.RELEASE.jar中。其全限定命名为org.springframework.jdbc.core.JdbcTemplate。要使用JdbcTemlate还需一个spring-tx-4.3.0.RELEASE.jar,这个包包含了一下事务和异常控制。
JdbcTemplate主要提供以下五类方法
private JdbcTemplate jdbcTemplate;
@Before // 此方法会在所有@Test方法之前运行
public void isBefore() {
ApplicationContext app = new ClassPathXmlApplicationContext("applicationContext.xml");
// 获得数据源
DataSource dataSource = (DataSource) app.getBean("dataSource");
// 操纵数据库对象
jdbcTemplate = (JdbcTemplate) app.getBean("jdbcTemplate");
}
(1)执行任何SQL语句(execute())
一般用于执行DDL语句
(2)执行新增、修改、删除等语句(update())
String sql = "insert into user values(default,'49846','吕奉先','abc123','男')";
jdbcTemplate.update(sql);
String sql = "update user set password=? where id=?";
jdbcTemplate.update(sql, "打哈党", 1);
String sql = "delete from user where id=?";
jdbcTemplate.update(sql,1);
(3)执行批处理相关语句(batchUpdate())
String sql = "insert into user(uusername,u_name,upassword,usex) values(?,?,?,?)";
List<Object[]> list = new ArrayList<Object[]>();
list.add(new Object[] { "ada465", "貂蝉", "123466", "女" });
list.add(new Object[] { "afe498", "刘玄德", "789456", "男" });
jdbcTemplate.batchUpdate(sql, list);
(4)执行查询相关语句(query()、queryForXXX())
String sql = "select * from user where id=?";
User user = jdbcTemplate.queryForObject(sql, new BeanPropertyRowMapper<>(User.class),1);
String sql = "select * from user where id>?";
List<User> list = jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(User.class),1);
String sql = "select count(1) from user";
Integer num = jdbcTemplate.queryForObject(sql, int.class);
第一个参数:SQL语句。第二个参数:查询的结果的返回值类型。第三个参数是:传入的参数
String sql = "select * from user where id=?";
Map<String, Object> map = jdbcTemplate.queryForMap(sql,1);