1. 数据库连接参数资源配置db.properties
driverClass=com.mysql.jdbc.DriverjdbcUrl=jdbc:mysql:///day33
user=root
password=root
initialPoolSize=3
maxPoolSize=6
2.bean.xml配置
<!-- 开启注解 -->
<context:component-scan base-package="cn.aop.h_jdbc"></context:component-scan>
<!-- 加载properties配置文件 -->
<context:property-placeholder location="classpath:cn/aop/h_jdbc/db.properties"/>
<!-- 1. 创建连接池实例 -->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass" value="${driverClass}"></property>
<property name="jdbcUrl" value="${jdbcUrl}"></property>
<property name="user" value="${user}"></property>
<property name="password" value="${password}"></property>
<property name="initialPoolSize" value="${initialPoolSize}"></property>
<property name="maxPoolSize" value="${maxPoolSize}"></property>
</bean>
<!-- 2. JdbcTemplate实例加入容器 -->
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="dataSource"></property>
</bean>
<!-- dao实例 -->
<bean id="userDao" class="cn.aop.h_jdbc.UserDao">
<property name="jdbcTemplate" ref="jdbcTemplate"></property>
</bean>
3.实体与dao
//1. 实体类(属性略),数据库略(数据表的字段与实体类的成员名一致)
public class User {
private int id;
private String name;
private int age;
private char sex;
}
//2. 对象dao接口
public interface IUserDao {
void save(User user);
void delete(Serializable id);
// 测试方法
User findById(Serializable id);
List<User> findAll();
}
//3. dao实现类
public class UserDao implements IUserDao {
/*
// 优化1: 连接管理交给连接池!
private DataSource dataSource;
public void setDataSource(DataSource dataSource) {
this.dataSource = dataSource;
}
// Spring对jdbc操作支持的工具类
JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
*/
//由IOC容器注入!
private JdbcTemplate jdbcTemplate;
public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
this.jdbcTemplate = jdbcTemplate;
}
/*
* 1. 传统的jdbc操作
* 2. 优化重复代码
*/
public void save(User user) {
String sql = "insert into t_user(name,age,sex)values(?,?,?)";
// 支持更新操作
jdbcTemplate.update(sql,user.getName(),user.getAge(),user.getSex()+"");
}
// 删除
public void delete(Serializable id) {
String sql = "delete from t_user where id=?";
jdbcTemplate.update(sql,id);
}
public User findById(Serializable id) {
// 测试1: list的元素是一个map,map就是每一行数据!
//List<Map<String, Object>> list1 = jdbcTemplate.queryForList("select * from t_user");
// 测试2: 只能查询返回一列,需要指定该列的类型
//List<String> list2 = jdbcTemplate.queryForList("select name from t_user", String.class);
// 测试3: 注意:传入的类型是查询列的类型!
//Integer i = jdbcTemplate.queryForObject("select id from t_user where id=? ", Integer.class,id);
// 查询返回一个List集合
//List<User> list = jdbcTemplate.query(sql, rowMapper);
// 查询封装对象,必须要手动处理!Spring不会帮你自动封装!
User user = jdbcTemplate.queryForObject("select * from t_user where id=?", new RowMapper<User>(){
// 告诉Spring,如何转换一行
// 参数1: 结果集
// 参数2: 当前是结果集的第几行
@Override
public User mapRow(ResultSet rs, int index) throws SQLException {
User user = new User();
user.setId(rs.getInt("id"));
user.setName(rs.getString("name"));
user.setAge(rs.getInt("age"));
user.setSex(rs.getString("sex").charAt(0));
return user;
}
}, id);
return user;
}
@Override
public List<User> findAll() {
List<User> list = jdbcTemplate.query("select * from t_user", new RowMapper<User>(){
// 告诉Spring,如何转换一行
// 参数1: 结果集
// 参数2: 当前是结果集的第几行
@Override
public User mapRow(ResultSet rs, int index) throws SQLException {
User user = new User();
user.setId(rs.getInt("id"));
user.setName(rs.getString("name"));
user.setAge(rs.getInt("age"));
user.setSex(rs.getString("sex").charAt(0));
return user;
}
});
return list;
}
}
5.测试
//测试
public class App {
private ApplicationContext ac =
new ClassPathXmlApplicationContext("bean.xml",App.class);
@Test
public void testApp() throws Exception {
User user = new User();
user.setName("JK");
user.setSex('男');
user.setAge(18);
// 保存
IUserDao userDao = (IUserDao) ac.getBean("userDao");
//userDao.save(user);
//userDao.delete(2);
// 主键查询
//userDao.findById(1);
// 查询全部
System.out.println(userDao.findAll());
}
}