Spring学习笔记(五)—— Spring整合JDBC
一、Spring对JDBC的支持
Spring提供了很多模板整合Dao技术
与JDBC的整合中,Spring中提供了一个可以操作数据库的对象——JdbcTemplate,该对象封装了JDBC技术,与DBUtils中的QueryRunner非常相似。
二、传统的Jdbc实现
如下为传统的Jdbc实现,该实现有两个明显的缺点就是(1)需要自己管理连接 (2)Jdbc操作重复代码封装与编写
public void save(){ try { Class.forName("com.mysql.jdbc.Driver"); // 连接对象 Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/crm", "root", "root"); // 通过Connection得到Statement对象 Statement stmt = con.createStatement(); // 使用Statement发送sql语句 String sql = "insert into cst_user(user_id,user_name) values(2,'lisi');"; stmt.execute(sql); // 关闭 stmt.close(); con.close(); } catch (Exception e) { e.printStackTrace(); } }
三、Spring+Jdbc实现
相比于传统的Jdbc实现,在Jdbc API的基础上封装了一套实现JdbcTemplate,JdbcTemplate的优点如下:
(1)配置基于模板设置
(2)完成了资源的创建和释放的工作
(3)完成了对JDBC的核心流程的工作,包括SQL语句的创建和执行,简化了对JDBC的操作
(4)仅需要传递DataSource就可以把它实例化
(5)JdbcTemplate只需要创建一次,减少了代码复用的烦恼
(6)JdbcTemplate是线程安全类
JdbcTemplate的使用步骤如下:
第一步:导包
第二步:书写DAO
- 增删改
// JdbcDaoSupport:根据连接池创建JDBC模板 public class UserDaoImpl extends JdbcDaoSupport implements UserDao { // 增 public void save(User user) { String sql = "insert into cst_user(user_id,user_name) value(null,?)"; super.getJdbcTemplate().update(sql,user.getName()); } // 删 public void delete(Integer id) { String sql = "delete from cst_user where user_id=?"; super.getJdbcTemplate().update(sql, id); } // 改 public void update(User user) { String sql = "update cst_user set user_name=? where user_id=?"; super.getJdbcTemplate().update(sql, user.getName(),user.getId()); } }
- 查询单个对象
// 查询单个对象 public User getById(Integer id){ String sql = "select * from cst_user where user_id=?"; return super.getJdbcTemplate().queryForObject(sql, new RowMapper<User>(){ @Override public User mapRow(ResultSet rs, int arg1) throws SQLException { User user = new User(); user.setId(rs.getInt("user_id")); user.setName(rs.getString("user_name")); return user; } },id); }
- 查询值类型
// 查询值类型 public int getTotalCount() { String sql = "select count(*) from cst_user"; Integer count = super.getJdbcTemplate().queryForObject(sql, Integer.class); return count; }
- 查询list集合类型
// 查询list集合类型 public List<User> getAll() { String sql = "select * from cst_user"; List<User> list = super.getJdbcTemplate().query(sql, new RowMapper<User>() { @Override public User mapRow(ResultSet rs, int arg1) throws SQLException { User user = new User(); user.setId(rs.getInt("user_id")); user.setName(rs.getString("user_name")); return user; } }); return list; }
第三步:准备db.properties
jdbc.jdbcUrl=jdbc:mysql:///crm jdbc.driverClass=com.mysql.jdbc.Driver jdbc.user=root jdbc.password=root
第四步:配置applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.2.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.2.xsd "> <!-- 指定spring读取db.properties --> <context:property-placeholder location="classpath:db.properties"/> <!-- 1.将连接池放入spring容器 --> <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" > <property name="jdbcUrl" value="${jdbc.jdbcUrl}"></property> <property name="driverClass" value="${jdbc.driverClass}"></property> <property name="user" value="${jdbc.user}"></property> <property name="password" value="${jdbc.password}"/> </bean> <!-- 2.将JDBCTemplate放入spring容器 --> <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"> <property name="dataSource" ref="dataSource"></property> </bean> <!-- 3.将UserDao放入spring容器 --> <bean id="userDao" class="cn.itcast.dao.impl.UserDaoImpl"> <property name="dataSource" ref="dataSource"></property> </bean> </beans>
第五步:测试
@RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration("classpath:applicationContext.xml") public class Demo { @Resource(name="userDao") private UserDao userDao; @Test public void fun1() throws Exception { User user = new User(); user.setName("tom"); userDao.save(user); } }
参考资料:https://www.cnblogs.com/jiyukai/p/9386183.html