简介:
Spring对数据库的操作在jdbc上面做了深层次的封装,使用spring的注入功能,可以把DataSource注册到JdbcTemplate之中。
JdbcTemplate位于 spring-jdbc-4.3.5.RELEASE.jar 中。其全限定命名为org.springframework.jdbc.core.JdbcTemplate。要使用JdbcTemlate还需一个 spring-tx-4.3.5.RELEASE.jar 这个包包含了一下事务和异常控制。
除此以外,在lib文件夹里还应该包括 mysql-connector-java-8.0.16.jar (我就是没有这个jar报错)。
jdbcTemplate更新数据库常用方法
- update (更新数据)
- batchUpdate (批量更新数据)
- queryForObject (查询单行)
- queryForObject (查询某行某列或聚集函数返回的,单值)
- query (查询多行)
数据库连接池
1、普通的JDBC连接数据库每次向数据库建立连接的时候都将connection加载到内存,再验证用户名等信息,这样会消耗一定的时间,每次的数据库连接,使用完后再断开,这样的方式会消耗大量的资源和时间。同时上千人访问的话将占用很多系统资源,导致服务器崩溃。
2、数据库连接池其实就是一个为数据库连接建立的一个“缓存池”,预先在数据库连接池中放入一定数量的连接。当需要数据库连接时,从连接池中拿就是了,用完再放回。数据库连接池负责分配、管理、释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是重新建立。
3、数据库连接池在初始化时将创建一定数量的数据库连接放到连接池中(initialPoolSize).无论这些数据库连接是否被使用,连接池都将一直保证至少拥有这么多的连接数量。
4、连接池的最大数据库连接数量限定了这个连接池占有的最大连接数(maxPoolSize)。当应用程序向连接池请求的连接数超过最大连接数时,这些请求将加入到等待队列中。
5、数据库连接池相对于无连接池的优点
- 资源重用,避免频繁创建
- 更快的系统反应速度
- 实现某一应用最大可用数据库连接数的限制避免某一应用独占所有的数据库资源
- 统一的连接管理,避免数据库连接泄露
6、常用的数据库连接池
- c3p0(C3P0是一个开源的JDBC连接池,它实现了数据源和JNDI绑定,支持JDBC3规范和JDBC2的标准扩展。目前使用它的开源项目有Hibernate,Spring等。)
- dbcp(DBCP(DataBase connection pool)数据库连接池。是 Apache 上的一个 Java 连接池项目,也是 tomcat 使用的连接池组件。单独使用DBCP需要2个包:commons-dbcp.jar和commons-pool.jar。)
- proxool(Proxool是一种Java数据库连接池技术。sourceforge下的一个开源项目,这个项目提供一个健壮、易用的连接池,最为关键的是这个连接池提供监控的功能,方便易用,便于发现连接泄漏的情况。)
7、c3p0和dbcp有啥区别,参考:
https://blog.youkuaiyun.com/weixin_40896352/article/details/80940646
SpringMVC中实现jdbcTemplate对数据库的操作
1、src下创建属性配置文件db.properties(jdbc.properties)
- 基本信息配置
jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/cards?characterEncoding=utf8 /*cards为数据库名称*/
jdbc.username=root
jdbc.password=123456
(其实文件里 jdbc. 也有些 db. 的,应该都是可行的。)
- 其他信息配置
initialPoolSize:初始化连接数量
minPoolSize:最小连接数量
maxPoolSize:最大连接数量
acquireIncrement: 当连接池用完之后一次性获取的连接数量
idleConnectionTestPeriod:根据一定的时间间隔检查连接池的连接数量 单位为秒
maxIdleTime:最大空闲时间 单位为秒
maxStatements:最大的maxStatements连接数量
maxStatementsPerConnection:最大语句缓存
2、配置springmvc-servlet.xml配置文件
在配置文件里加入:
<!-- 导入资源文件,读取db.properties文件中的数据 -->
<context:property-placeholder location="classpath:db.properties"/>
<!-- 配置数据源,这里采用tomcat自带的dbcp数据源 -->
<bean id="dataSource"
class="org.apache.tomcat.dbcp.dbcp2.BasicDataSource">
<property name="driverClassName" value="${jdbc.driverClassName}" />
<property name="url" value="${jdbc.url}" />
<property name="username" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
</bean>
<!-- 配置Spring的jdbcTemplate,并注入一个dataSource数据源-->
<bean id="jdbcTemplate"
class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="dataSource"></property>
</bean>
3、在程序里导入jar
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;
4、@Autowired依赖注入JdbcTemplate
@Autowired
private JdbcTemplate jdbcTemplate;
5、进行一系列数据库操作
- update更新数据(增删改),返回值是更新的数据元组数。
//查询语句,?与第二个参数数组里的元素一一对应
String sql="insert into usertable values(?,?)"
//填入第一个参数里的?变量
Object obj[] = {
u.getUsername(),
u.getPassword()
};
jdbcTemplate.update(sql,obj);
- batchUpdate()批量更新(增删改)
String sql="insert into user (name,deptid) values (?,?)";
//Object数组类型的List
List<Object[]> batchArgs=new ArrayList<Object[]>();
batchArgs.add(new Object[]{"caoyc",6});
batchArgs.add(new Object[]{"zhh",8});
batchArgs.add(new Object[]{"cjx",8});
jdbcTemplate.batchUpdate(sql, batchArgs);
- queryForObject查询单条记录,并将其赋给User实体类对象。
String sql="select id,name,deptid from user where id=?";
RowMapper<User> rowMapper=new BeanPropertyRowMapper<User>(User.class);
User user= jdbcTemplate.queryForObject(sql, rowMapper,52);
System.out.println(user);
使用BeanProperytRowMapper要求sql数据查询出来的列和实体属性需要一一对应。如果数据中列明和属性名不一致,在sql语句中需要用as重新取一个别名。
- queryForObject获取某个记录某列或count、sum等聚集函数返回的唯一值。
String sql="select count(*) from user";
int count= jdbcTemplate.queryForObject(sql, Integer.class);
System.out.println(count);
- query查询多条记录
String sql="select id,name,deptid from user";
RowMapper<User> rowMapper=new BeanPropertyRowMapper<User>(User.class);
List<User> users= jdbcTemplate.query(sql, rowMapper);
for (User user : users) {
System.out.println(user);
}