Spring整合JDBC
使用DRUID,是阿里巴巴开源平台上一个数据库连接池实现,它结合了C3P0、DBCP等DB池的优点,同时加入了监控。
整合步骤
第一步:创建web项目,导入依赖
image.png image.png image.png
第二步:开发表对应的实体类
public class User {
private Integer id;
private String name;
private Integer age;
public User() {
}
public void setId(Integer id) {
this.id = id;
}
public void setName(String name) {
this.name = name;
}
public void setAge(Integer age) {
this.age = age;
}
public Integer getId() {
return id;
}
public String getName() {
return name;
}
public Integer getAge() {
return age;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", name='" + name + '\'' +
", age=" + age +
'}';
}
}
第三步:开发DAO接口和实现类
@Repository("UserDaoImpl")
public class UserDaoImpl extends JdbcDaoSupport implements UserDao {
@Override
public void addUser(User user) {
String sql="INSERT INTO testinstall (name,age) VALUES (?,?)";
getJdbcTemplate().update(sql,user.getName(),user.getAge());
}
@Override
public void deleteUser(User user) {
String sql="DELETE FROM testinstall WHERE id =?";
getJdbcTemplate().update(sql,user.getId());
}
@Override
public void updateUser(User user) {
String sql="UPDATE testinstall SET name = ? ,age=? WHERE id =?";
getJdbcTemplate().update(sql,user.getName(),user.getAge(),user.getId());
}
@Override
public User queryUser(final User user) {
String sql="SELECT * FROM testinstall WHERE id=? ";
User user1 = getJdbcTemplate().queryForObject(sql, new RowMapper<User>() {
@Override
public User mapRow(ResultSet rs, int rowNum) throws SQLException {
User user1 = new User();
String name = rs.getString("name");
int age = rs.getInt("age");
user1.setId(user.getId());
user1.setName(name);
user1.setAge(age);
return user1;
}
}, user.getId());
return user1;
}
@Override
public List<User> queryAll() {
String sql="SELECT * FROM testinstall ";
List<User> query = getJdbcTemplate().query(sql, new RowMapper<User>() {
@Override
public User mapRow(ResultSet rs, int rowNum) throws SQLException {
User user = new User();
int id = rs.getInt("id");
String name = rs.getString("name");
int age = rs.getInt("age");
user.setId(id);
user.setName(name);
user.setAge(age);
return user;
}
});
return query;
}
}
开发DAO实现类:
继承JdbcDaoSupport
getJdbcTemplate()得到JdbcTemplate(需要注入)
第四步:配置整合
需要把模板类对象赋值给持久层的DAO
<context:component-scan base-package="com.zyh.*"></context:component-scan>
<context:property-placeholder location="classpath:db.properties"></context:property-placeholder>
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
<property name="driverClassName" value="${myDriverClass}" ></property>
<property name="url" value="${myUrl}"></property>
<property name="username" value="${myUsername}"></property>
<property name="password" value="${myPassword}"></property>
<property name="maxWait" value="3000"></property>
<property name="maxActive" value="100"></property>
<!--Druid监控-->
<property name="filters" value="wall,stat"/>
</bean>
<!--创建 JDBCTemplate对象 -->
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="dataSource"></property>
</bean>
<bean id="UserDaoImpl" class="com.zyh.dao.impl.UserDaoImpl">
<property name="jdbcTemplate" ref="jdbcTemplate"></property>
</bean>
测试方法如下所示:
public class TestUserService {
@Qualifier("UserServiceImpl")
@Autowired
private UserServiceImpl userService;
@Test
public void testUserServiceImplQueryAll(){
List<User> users = userService.queryAll();
for (User user : users) {
Log.info(user);
}
}
}
观察输出如下所示:
image.png
修改配置文件如下所示:
<bean id="UserDaoImpl" class="com.zyh.dao.impl.UserDaoImpl">
<property name="dataSource" ref="dataSource"></property>
</bean>
我们修改了数据库的配置文件 直接抽取出来了db.properties 文件
image.png
这个是 DruidDatasource的源码 :
第一个配置文件就是依赖下面的源码进行配置的
image.png
第二个配置文件就是依赖下面的源码进行配置的
image.png
注意点: 注意此属性 设置最大等待时间 3000毫秒
<property name="maxWait" value="3000"></property>
如果获取失败,可以快速抛异常,避免占用。
开发环境建议设置maxWait=3000(开发环境原因链接本来就慢)
我们在线上配置的时候 ,此属性可以设置的低一些 比如 300毫秒, 可以对于高并发起到一定的作用。