spring之jdbcTemplate操作(配合C3P0使用)
1 spring框架一站式框架
(1)针对javaee三层,每一层都有解决技术
(2)在dao层,使用 jdbcTemplate
2 spring对不同的持久化层技术都进行封装
(1)jdbcTemplate对jdbc进行封装
3 jdbcTemplate使用和dbutils使用很相似,都数据库进行crud操作
CURD操作
增加
updata();方法
1 导入jdbcTemplate使用的jar包
2 创建对象,设置数据库信息
3 创建jdbcTemplate对象,设置数据源
4 调用jdbcTemplate对象里面的方法实现操作
// 1 添加操作 @Test public void add() { // 设置数据库信息 DriverManagerDataSource dataSource = new DriverManagerDataSource(); dataSource.setDriverClassName("com.mysql.jdbc.Driver"); dataSource.setUrl("jdbc:mysql:///spring_day03"); dataSource.setUsername("root"); dataSource.setPassword("root"); // 创建jdbcTemplate对象,设置数据源 JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource); // 调用jdbcTemplate对象里面的方法实现操作 //创建sql语句 String sql = "insert into user values(?,?)"; int rows = jdbcTemplate.update(sql, "lucy","250"); System.out.println(rows); }
修改
updata();方法
//2 修改操作 @Test public void update() { //设置数据库信息 DriverManagerDataSource dataSource = new DriverManagerDataSource(); dataSource.setDriverClassName("com.mysql.jdbc.Driver"); dataSource.setUrl("jdbc:mysql:///spring_day03"); dataSource.setUsername("root"); dataSource.setPassword("root"); //创建jdbcTemplate对象 JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource); //调用jdbcTemplate里面的方法实现 update方法 String sql = "update user set password=? where username=?"; int rows = jdbcTemplate.update(sql, "1314","lucy"); System.out.println(rows); }
删除
updata();方法
//3 删除操作 @Test public void delete() { //设置数据库信息 DriverManagerDataSource dataSource = new DriverManagerDataSource(); dataSource.setDriverClassName("com.mysql.jdbc.Driver"); dataSource.setUrl("jdbc:mysql:///spring_day03"); dataSource.setUsername("root"); dataSource.setPassword("root"); //创建jdbcTemplate对象 JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource); //调用update方法实现删除 String sql = "delete from user where username=?"; int rows = jdbcTemplate.update(sql, "lucy"); System.out.println(rows); }
查询:
jdbcTemplate.queryForObject();方法
1 使用jdbcTemplate实现查询操作
/* * QueryRunner runner = new QueryRuner(datasource); * 返回对象 * runner.query(sql,new BeanHandler<User>(User.class)); * * 返回list集合 * runner.query(sql,new BeanListHander<User>(User.class)) * * 1 在dbutils时候,有接口 ResultSetHandler * dbutils提供了针对不同的结果实现类 * * 2 jdbcTemplate实现查询,有接口 RowMapper, * jdbcTemplate针对这个接口没有提供实现类,得到不同的类型数据需要自己进行数据封装 * * */
2 查询具体实现
第一个 查询返回某一个值
@Override public <T> T queryForObject(String sql, Class<T> requiredType) throws DataAccessException { return queryForObject(sql, getSingleColumnRowMapper(requiredType)); }
(1)第一个参数是sql语句
(2)第二个参数 返回类型的class
//1 查询表有多少条记录 @Test public void testCount() { //设置数据库信息 DriverManagerDataSource dataSource = new DriverManagerDataSource(); dataSource.setDriverClassName("com.mysql.jdbc.Driver"); dataSource.setUrl("jdbc:mysql:///spring_day03"); dataSource.setUsername("root"); dataSource.setPassword("root"); //创建jdbcTemplate对象 JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource); //调用方法得到记录数 String sql = "select count(*) from user"; //调用jdbcTemplate的方法 int count = jdbcTemplate.queryForObject(sql, Integer.class); System.out.println(count); }
Jdbc实现
//2 jdbc实现代码 @Test public void testJDBC() { Connection conn = null; PreparedStatement psmt = null; ResultSet rs = null; //加载驱动 try { Class.forName("com.mysql.jdbc.Driver"); //创建连接 conn = DriverManager.getConnection("jdbc:mysql:///spring_day03", "root", "root"); //编写sql语句 String sql = "select * from user where username=?"; //预编译sql psmt = conn.prepareStatement(sql); //设置参数值 psmt.setString(1, "lucy"); //执行sql rs = psmt.executeQuery(); //遍历结果集 while(rs.next()) { //得到返回结果值 String username = rs.getString("username"); String password = rs.getString("password"); //放到user对象里面 User user = new User(); user.setUsername(username); user.setPassword(password); System.out.println(user); } } catch (Exception e) { e.printStackTrace(); } finally { try { rs.close(); psmt.close(); conn.close(); } catch (SQLException e) { e.printStackTrace(); } } }
第二个 查询返回对象
第一个参数是sql语句
第二个参数是 RowMapper,是接口,类似于dbutils里面接口
第三个参数是 可变参数
//3 查询返回对象 @Test public void testObject() { //设置数据库信息 DriverManagerDataSource dataSource = new DriverManagerDataSource(); dataSource.setDriverClassName("com.mysql.jdbc.Driver"); dataSource.setUrl("jdbc:mysql:///spring_day03"); dataSource.setUsername("root"); dataSource.setPassword("root"); //创建jdbcTemplate对象 JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource); //写sql语句,根据username查询 String sql = "select * from user where username=?"; //调用jdbcTemplate的方法实现 //第二个参数是接口 RowMapper,需要自己写类实现接口,自己做数据封装 User user = jdbcTemplate.queryForObject(sql, new MyRowMapper(), "mary"); System.out.println(user); }
class MyRowMapper implements RowMapper<User> { @Override public User mapRow(ResultSet rs, int num) throws SQLException { // 1 从结果集里面把数据得到 String username = rs.getString("username"); String password = rs.getString("password"); // 2 把得到数据封装到对象里面 User user = new User(); user.setUsername(username); user.setPassword(password); return user; } }
第三个 查询返回list集合
//创建jdbcTemplate对象 JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource); //写sql语句 String sql = "select * from user"; //调用jdbcTemplate的方法实现 List<User> list = jdbcTemplate.query(sql,new MyRowMapper()); System.out.println(list);
Spring配置连接池和dao使用jdbcTemplate
1 spring配置c3p0连接池
第一步 导入jar包
第二步 创建spring配置文件,配置连接池
// ComboPooledDataSource dataSource = new ComboPooledDataSource(); // dataSource.setDriverClass("com.mysql.jdbc.Driver"); // dataSource.setJdbcUrl("jdbc:mysql:///spring_day03"); // dataSource.setUser("root"); // dataSource.setPassword("root");
<!-- 配置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:///spring_day03"></property> <property name="user" value="root"></property> <property name="password" value="root"></property> </bean>
2 dao使用jdbcTemplate
(1)创建service和dao,配置service和dao对象,在service注入dao对象
<!-- 创建service和dao对象,在service注入dao对象 --> <bean id="userService" class="cn.itcast.c3p0.UserService"> <!-- 注入dao对象 --> <property name="userDao" ref="userDao"></property> </bean> <bean id="userDao" class="cn.itcast.c3p0.UserDao"> <!-- 注入jdbcTemplate对象 --> <property name="jdbcTemplate" ref="jdbcTemplate"></property> </bean>
(2)创建jdbcTemplate对象,把模板对象注入到dao里面
<bean id="userDao" class="cn.itcast.c3p0.UserDao"> <!-- 注入jdbcTemplate对象 --> <property name="jdbcTemplate" ref="jdbcTemplate"></property> </bean> <!-- 创建jdbcTemplate对象 --> <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
public class UserDao { //得到JdbcTemplate对象 private JdbcTemplate jdbcTemplate; public void setJdbcTemplate(JdbcTemplate jdbcTemplate) { this.jdbcTemplate = jdbcTemplate; } //添加操作 public void add() { //创建jdbcTemplate对象 // JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource); String sql = "insert into user values(?,?)"; jdbcTemplate.update(sql, "李雷","520"); } }
(3)在jdbcTemplate对象里面注入dataSource
<!-- 创建jdbcTemplate对象 --> <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"> <!-- 把dataSource传递到模板对象里面 --> <property name="dataSource" ref="dataSource"></property> </bean>