在 Spring 中也为我们提供了专门用来操作数据库的框架,它叫做 SpringJDBC。SpringJDBC 本身并不是一个 orm框架,与现在市场上流行的 Hibernate、MyBatis 相比弱了很多,如果我们写一个小型的系统,用 SpringJDBC 还是很灵活的。 Spring JDBC 中的 JdbcTemplate类 在小型开发中还是比较常用的,而 NamedParameterJdbcTemplate、SimpleJdbcTemplate等这些在 3.X版本中就已经标记过了,在以后的版本中也可能会被抛弃或删除。我们本篇就对 JdbcTemplate类 进行讲解。
在使用 JdbcTemplate 小工具时,我们还需要依赖一个连接池,在本篇中就选当下比较流行的 C3P0连接池。(在这里我强调一下,数据源的意思是数据的来源,也就是数据库,而连接池是对数据源进行了绑定,它保存着连接数据源的相关信息,所以说数据源和连接池并不是一回事)
本文可以分为两大部分: 一、配置 C3P0连接池 二、JdbcTemplate 小工具操作总结
一、配置 C3P0连接池 c3p0 是现在比较流行的一款开源的 JDBC连接池,它主要用来保存连接数据源的相关信息。数据源这个词理解起来也比较容易,它就是数据的来源,也就是我们常说的数据库。
我们在使用 JdbcTemplate 小工具前必须要配置好一个连接池,也就是必须要获取到一个连接对象。
那么我们接下来就带着大家在 Spring 中配置 c3p0连接池,在配置之前我们需要将 c3p0连接池 的 jar包导入。(c3p0-0.9.1.2.jar)
一般情况下,我们在配置连接池时都会将配置信息写入到外部属性文件(详情请看 在Spring中使用外部属性文件),本小节只为演示,便不写入外部属性文件中。
1、配置XML <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"> <!-- 配置url --> <property name="jdbcUrl" value="jdbc:oracle:thin:@127.0.0.1:1521:XE"></property> <!-- 配置driver --> <property name="driverClass" value="oracle.jdbc.driver.OracleDriver"></property> <!-- 配置username --> <property name="user" value="system"></property> <!-- 配置password --> <property name="password" value="system"></property> </bean> 2、测试 public static void main(String[] args) throws SQLException { ApplicationContext ioc = new ClassPathXmlApplicationContext("beans.xml"); DataSource dataSource = (DataSource) ioc.getBean("dataSource"); Connection conn = dataSource.getConnection(); System.out.println(conn); }
二、JdbcTemplate 小工具操作总结 JdbcTemplate小工具 也比较强大,在开发小型项目时运用的比较广泛。我们对数据库基本的CURD操作在本小节会作简单的总结。
注意:JdbcTemplate暂时不支持级联查询
导入 jar包 spring-jdbc-4.0.0.RELEASE.jar spring-tx-4.0.0.RELEASE.jar
c3p0-0.9.1.2.jar commons-logging-1.1.1.jar ojdbc14.jar spring-beans-4.0.0.RELEASE.jar spring-context-4.0.0.RELEASE.jar spring-core-4.0.0.RELEASE.jar spring-expression-4.0.0.RELEASE.jar
注:红字字样的是 新增 的 jar包。
jar包详解:
1)spring-jdbc-4.0.0.RELEASE.jar:(JDBC包)这个 jar 文件包含 Spring 对 JDBC 数据访问进行封装的所有类; 2)spring-tx-4.0.0.RELEASE.jar:(事务包)为 JDBC 等提供的一致的声明式和编程式事务管理(关于 事务 方面的知识,后续章节会继续讲解,大家在这里不必进行过多的了解)。
1、修改一条记录: int update(String sql, Object… args) 参数sql:sql语句 参数args:可变参,sql语句中?的实际值 返回值:影响行数 public int update(User user) { String sql = "update s_user set username = ? where id = ?"; Object[] objs = {user.getUsername(), user.getId()}; int update = jdbcTemplate.update(sql, objs); System.out.println(update); return update; } 2、添加一条记录: int update(String sql, Object… args) 参数sql:sql语句 参数args:可变参,sql语句中?的实际值 返回值:影响行数 public int insert(User user) { String sql = "insert into s_user values(?, ?, ?, ?, ?, ?, sysdate)"; Object[] objs = {user.getId(), user.getUsername(), user.getPassword(), user.getZip(), user.getPhone(), user.getEmail()}; int insert = jdbcTemplate.update(sql, objs); return insert; } 3、删除一条记录: int update(String sql, Object… args) 参数sql:sql语句 参数args:可变参,sql语句中?的实际值 返回值:影响行数 public int delete(int id) { String sql = "delete from s_user where id = ?"; Object[] objs = {id}; int delete = jdbcTemplate.update(sql, objs); return delete; } 4、查询所有: List<T> query(String sql, RowMapper<T> rowMapper) 参数sql:sql语句 参数rowMapper:可以将数据中的每一行数据封装成用户定义的类 返回值:数据列表 public List<User> showAll() { String sql = "select * from s_user"; RowMapper<User> rowMapper = ParameterizedBeanPropertyRowMapper.newInstance(User.class); List<User> list = jdbcTemplate.query(sql, rowMapper); return list; } 5、根据zip查询多条记录: List<T> query(String sql, RowMapper<T> rowMapper, Object… args) 参数sql:sql语句 参数rowMapper:可以将数据中的每一行数据封装成用户定义的类 参数args:可变参,sql语句中?的实际值 返回值:数据列表 public List<User> showByZip(String zip) { String sql = "select * from s_user where zip = ?"; RowMapper<User> rowMapper = ParameterizedBeanPropertyRowMapper.newInstance(User.class); List<User> list = jdbcTemplate.query(sql, rowMapper, zip); return list; } 6、根据id查询一条记录: T queryForObject(String sql, RowMapper<T> rowMapper, Object… args) 参数sql:sql语句 参数rowMapper:可以将数据中的每一行数据封装成用户定义的类 参数args:可变参,sql语句中?的实际值 返回值:查询得到的一条记录,并封装成用户定义的类 public User showAllById(int id) { String sql = "select id,username,password,zip,phone,email,udate from s_user where id = ?"; RowMapper<User> rowMapper = ParameterizedBeanPropertyRowMapper.newInstance(User.class); User user = jdbcTemplate.queryForObject(sql, rowMapper, id); return user; } 7、根据id查询指定字段: T queryForObject(String sql, Class<T> class, Object… args) 参数sql:sql语句 参数class:返回类型的Class对象 参数args:可变参,sql语句中?的实际值 返回值:查询得到的一条记录,并封装成用户定义的类 public String showUsernameById(int id) { String sql = "select username from s_user where id = ?"; String username = jdbcTemplate.queryForObject(sql, String.class, id); return username; }
