更多Spring开发在框架开发
1 JDBCTemplate?
已经说过,Spring是一站式开发,针对javaEE三层,每一层都有解决技术,而针对dao层的不同技术,Spring提供了以下的解决技术:
本文主要讲解JdbcTemplate,这有点类似dbUtils技术中的RunnerQuery类。
2 JDBCTemplate案例
案例目标: 对User类进行增删改查(crud)操作,
项目环境:导入jar包,导入spring相关包(ioc基本包,jdbcTemplate包),mysql相关包,日志相关包,c3p0相关包。
项目数据库创建:
create database db_springJdbcTemplate;
create table tb_user(
user_name varchar(50) primary key,
user_password varchar(50) default null
);
2.1 分析
- test类中使用ioc方式创建UserService对象,UserService里面有UserDao对象属性,所以需要注入UserDao对象。
- UserDao对象中有JdbcTemplate对象属性,所以UserDao对象中需要注入JdbcTemplate对象。
- JdbcTemplate对象中有DataSource对象,所以JdbcTemplate对象中需要注入DataSource对象
- DataSource对象中有数据库连接所需要的属性,所以DataSource对象中需要注入数据库连接所需要的属性。
2.2 service
package edu.kmust.user.service;
import edu.kmust.user.dao.UserDao;
import edu.kmust.user.entity.User;
public class UserService {
/*
* 使用ioc的方式获取UserDao对象
*/
private UserDao userDao ;
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
/**
* 添加用户
* @param user
*/
public void add(User user){
userDao.add(user);
}
/**
* 根据用户名修改其密码
* @param user
*/
public void update(User user) {
userDao.update(user);
}
/**
* 根据name删除user
* @param user
*/
public void delete(User user) {
userDao.delete(user);
}
/**
* 查询所有用户个数
*/
public void queryCount() {
userDao.queryCount();
}
/**
* 根据name查询某一对象
* @param user
*/
public void queryObject(User user) {
userDao.queryObject(user);
}
/**
* 查询所有对象
*/
public void queryList() {
userDao.queryList();
}
}
2.3 dao
package edu.kmust.user.dao;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;
import edu.kmust.user.entity.User;
public class UserDao {
/*
* 通过ioc的方式获取jdbcTemplate对象(该对象已经在配置文件中注入了数据库和c3p0的信息)
*/
private JdbcTemplate jdbcTemplate ;
public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
this.jdbcTemplate = jdbcTemplate;
}
/**
* 添加用户
* @param user
*/
public void add(User user) {
String sql = "insert into tb_user values(?,?)" ;
//使用update(String sql,Object...args):int - JdbcTemplate
System.out.println(user.getUsername());
int rows = jdbcTemplate.update(sql, user.getUsername(),user.getPassword());
System.out.println("添加成功,影响记录数="+rows);
}
/**
* 根据用户名修改其密码
* @param user
*/
public void update(User user) {
String sql = "update tb_user set user_password=? where user_name=?" ;
//使用update(String sql,Object...args)
int rows = jdbcTemplate.update(sql,user.getPassword(),user.getUsername());
System.out.println("修改成功,影响记录数="+rows);
}
/**
* 根据用户名删除该用户
* @param user
*/
public void delete(User user) {
String sql="delete from tb_user where user_name=?";
//使用update(String sql,Object...args)
int rows = jdbcTemplate.update(sql, user.getUsername());
System.out.println("删除成功,影响记录数="+rows);
}
/**
* 查询所有记录的行数
*/
public void queryCount() {
String sql = "select count(*) from tb_user";
//使用的是queryForObject(String sql,Class<T> requiredType)
int count = jdbcTemplate.queryForObject(sql,Integer.class);
System.out.println("查询成功,所有累计行数="+count);
}
/**
* 根据用户名查询该用户
* @param user
*/
public void queryObject(User user) {
String sql = "select * from tb_user where user_name=?" ;
/*
* 使用queryForObject(String sql,RowMapper<T> rowMapper,Object...args)
* 第二参数是接口RowMapper,需要自己写类实现接口,自己做数据封装
*/
User user1 = jdbcTemplate.queryForObject(sql, new MyRowMapper(), user.getUsername());
System.out.println("查询成功:"+user1);
}
/**
* 返回所有用户的集合
*/
public void queryList() {
String sql = "select * from tb_user" ;
//使用query(String sql,RowMapper<T> rowMapper,Object...args)
List<User> userList = jdbcTemplate.query(sql, new MyRowMapper());
System.out.println("查询成功:"+userList);
}
}
/**
* 自己写的接口封装
* @author zhaoyuqiang
*
*/
class MyRowMapper implements RowMapper<User>{
@Override
public User mapRow(ResultSet rs, int num) throws SQLException {
//1. 从结果集里面得到数据,注意:user_name是数据库中的字段名称
String username = rs.getString("user_name");
String userpassword = rs.getString("user_password");
//2.把得到的数据封装到对象里面
User user = new User();
user.setUsername(username);
user.setUsername(userpassword);
return user;
}
}
2.4 test
package edu.kmust.user.test;
import org.junit.jupiter.api.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import edu.kmust.user.entity.User;
import edu.kmust.user.service.UserService;
public class UserTest {
@Test
public void test01() {
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
UserService userService = (UserService) context.getBean("userService");
User user = new User();
user.setUsername("黄思");
user.setPassword("123");
/*User user1 = new User();
user1.setUsername("赵玉强");
user1.setPassword("123456");*/
/*userService.add(user1);*/
/*userService.update(user);*/
/*userService.delete(user);*/
/*userService.queryCount();*/
/*userService.queryObject(user);*/
userService.queryList();
}
}
2.5 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.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:///db_springJdbcTemplate"></property>
<property name="user" value="root"></property>
<property name="password" value="root"></property>
</bean>
<!--创建JdbcTemplate(模板对象) -->
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<!-- 将dataSource注入到模板对象中 -->
<property name="dataSource" ref="dataSource"></property>
</bean>
<!-- 创建service,在service中注入dao对象-->
<bean id="userService" class="edu.kmust.user.service.UserService">
<property name="userDao" ref="userDao"></property>
</bean>
<!-- 创建dao -->
<bean id="userDao" class="edu.kmust.user.dao.UserDao">
<!-- 在dao中注入JdbcTemplate对象 -->
<property name="jdbcTemplate" ref="jdbcTemplate"></property>
</bean>
</beans>