4-Spring-jdbc

Spring架构

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iTafIj0S-1618320072236)(http://m.qpic.cn/psb?/V13x1ZYF1dFQtq/dlZPNZVzJ5P57a8A6diScF1G7cmptSUK7huWggA8wSs!/b/dL4AAAAAAAAA&bo=EQOhAQAAAAADB5A!&rf=viewer_4)]

Spring DAO(JDBC模版)

简介

Spring的JDBC模板 为了避免直接使用JDBC而带来的复杂且冗长的代码,Spring提供了一个强有力的模板类—JdbcTemplate来简化JDBC操作。并且,数据源DataSource对象与模板JdbcTemplate对象均可通过Bean的形式定义在配置文件中,充分发挥了依赖注入的威力

需要依赖的JAR:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VeZup6in-1618320072238)(http://m.qpic.cn/psb?/V13x1ZYF1dFQtq/aut1kqDA8bMiiW9FRi5BevPcT.dDCdvzijDBe8IULlc!/b/dFMBAAAAAAAA&bo=DwFNAAAAAAADB2E!&rf=viewer_4)]

数据源的配置

使用JDBC模板,首先需要配置好数据源,数据源直接以Bean的形式配置在Spring配置文件中。

由于建立数据库连接是一个非常耗时耗资源的行为,所以通过连接池预先同数据库建立一些连接,放在内存中,应用程序需要建立数据库连接时直接到连接池中申请一个就行,用完后再放回去。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Sp4blWrc-1618320072240)(http://m.qpic.cn/psb?/V13x1ZYF1dFQtq/WDa9amvwB6f9CRcH9IFT.lZsuQF4nQF2BMpBOqYCIU!/b/dL8AAAAAAAAA&bo=GwPJAAAAAAADBM!&rf=viewer_4)]

数据源连接池Druid

Druid 是阿里巴巴开源平台上的一个项目,整个项目由数据库连接池、插件框架和 SQL 解析器组成。该项目主要是为了扩展 JDBC 的一些限制,可以让程序员实现一些特殊的需求,比如向密钥服务请求凭证、统计
SQL 信息、SQL 性能收集、SQL 注入检查、SQL 翻译等,程序员可以通过定制来实现自己需要的功能。

导入jar

mysql-connector-java-5.1.42.jar
druid-1.1.10.jar
//如下是JdbcTemplate需要的jar
spring-instrument-4.3.8.RELEASE.jar
spring-jdbc-4.3.8.RELEASE.jar
spring-tx-4.3.8.RELEASE.jar

配置Spring 数据源连接池信息

<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close"><property name="driverClassName" value="com.mysql.jdbc.Driver" /><property name="url" value="jdbc:mysql://localhost:3306/db_name" /><property name="username" value="root" /><property name="password" value="root" /><property name="initialSize" value="1" /><property name="minIdle" value="1" /><property name="maxActive" value="10" /><property name="maxWait" value="10000" /><property name="timeBetweenEvictionRunsMillis" value="60000" /><property name="minEvictableIdleTimeMillis" value="300000" /><property name="testWhileIdle" value="true" /><property name="testOnBorrow" value="true" /><property name="testOnReturn" value="false" /><property name="poolPreparedStatements" value="true" /><property name="maxPoolPreparedStatementPerConnectionSize"value="20" /><property name="defaultAutoCommit" value="true" /><property name="validationQuery" value="select 1 " /><property name="filters" value="stat" />bean>

JDBC从属性文件读取数据库连接信息

为了便于维护,可以将数据库连接信息写入到属性文件中,使Spring配置文件从中读取数据。

属性文件名称随意,但一般都是放在src下
如下:jdbc.properties / db.properties

#### key=value
jdbc_url=jdbc:mysql://localhost:3306/db_name
jdbc_driver=com.mysql.jdbc.Driver
jdbc_user=root
jdbc_password=root

JDBC从属性文件读取数据库连接信息

该属性文件jdbc.properties若要被Spring配置文件读取,其必须在配置文件中进行注册。
注册方式有两种:
(1)方式

(2) context:property-placeholder/方式
该方式要求在Spring配置文件头部加入context的约束,即修改配置文件头

<context:property-placeholder  location="classpath:jdbc.properties"/>

Spring配置文件从属性文件中读取数据时,需要在的value属性中使用${ },

将在属性文件中定义的key括起来,以引用指定属性的值

<property name="driverClassName" value="${jdbc_driver}" />
<property name="url" value="${jdbc_url}" />
<property name="username" value="${jdbc_user}" />
<property name="password" value="${jdbc_password}" />

引入JdbcTemplate:

	<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"><property name="dataSource" ref="dataSource">property>bean>

完整的application.xml:

	<context:component-scan base-package="com.qfjy">context:component-scan><context:property-placeholder  location="classpath:jdbc.properties"/><bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close"><property name="driverClassName" value="${jdbc_driver}" /><property name="url" value="${jdbc_url}" /><property name="username" value="${jdbc_user}" /><property name="password" value="${jdbc_password}" /><property name="initialSize" value="1" /><property name="minIdle" value="1" /><property name="maxActive" value="10" /><property name="maxWait" value="10000" /><property name="timeBetweenEvictionRunsMillis" value="60000" /><property name="minEvictableIdleTimeMillis" value="300000" /><property name="testWhileIdle" value="true" /><property name="testOnBorrow" value="true" /><property name="testOnReturn" value="false" /><property name="poolPreparedStatements" value="true" /><property name="maxPoolPreparedStatementPerConnectionSize"value="20" /><property name="defaultAutoCommit" value="true" /><property name="validationQuery" value="select 1 " /><property name="filters" value="stat" />bean><bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"><property name="dataSource" ref="dataSource">property>bean>

JdbcTemplate 示例

Spring对数据库的操作在jdbc上面做了深层次的封装,使用spring的注入功能,可以把DataSource注册到JdbcTemplate之中。

JdbcTemplate主要提供以下五类方法:

  1. query方法及queryForXXX方法:用于执行查询相关语句;
  2. update方法及batchUpdate方法:update方法用于执行新增、修改、删除等语句;batchUpdate方法用于执行批处理相关语句;
  3. call方法:用于执行存储过程、函数相关语句。
  4. execute方法:可以用于执行任何SQL语句,一般用于执行DDL语句;

查询功能

query方法及queryForXXX方法:用于执行查询相关语句

读取单个对象

//查询单个对象
public User selectById(int id){String sql="select * from user where id=?";RowMapper<User> rowMapper=new BeanPropertyRowMapper(User.class);User u=jdbcTemplate.queryForObject(sql, rowMapper, id);return u;
}

读取多个对象

public List<User> selectList() {String sql="select * from user";RowMapper<User> rowMapper=new BeanPropertyRowMapper<>(User.class);return jdbcTemplate.query(sql, rowMapper);
}

获取某个记录某列 count、max、min、avg、sum等函数返回唯一值

public int count() {String sql="select count(*) from user";return jdbcTemplate.queryForObject(sql,Integer.class);
}

【注意】:使用BeanProperytRowMapper要求sql数据查询出来的列和实体属性需要一一对应。如果数据中列名和属性名不一致,在sql语句中需要用as重新取一个别名

修改功能

update方法用于执行新增、修改、删除等语句

新增

@Overridepublic int insert(User u) {String sql="insert into user(uname,upass) values(?,?)";return jdbcTemplate.update(sql, u.getUname(),u.getUpass());}

修改

public int update(User u) {String sql="update user set uname=? where id=?";Object[] objs=new Object[2];objs[0]=u.getUname();objs[1]=u.getId();return jdbcTemplate.update(sql, objs);}

删除

public int deleteById(int id) {String sql="delete from user where id=?";return 	jdbcTemplate.update(sql,id);
}

批量插入、更新和删除方法

batchUpdate()

public int[] insertBatch(List<User> list) {String sql="insert into user(uname,upass) values(?,?)";List<Object[]> lists=new ArrayList<Object[]>();lists.add(new Object[]{"a","a"});lists.add(new Object[]{"b","a"});lists.add(new Object[]{"b","a"});int[] nums=jdbcTemplate.batchUpdate(sql,lists);return nums;}

{
String sql=“insert into user(uname,upass) values(?,?)”;
List lists=new ArrayList();
lists.add(new Object[]{“a”,“a”});
lists.add(new Object[]{“b”,“a”});
lists.add(new Object[]{“b”,“a”});
int[] nums=jdbcTemplate.batchUpdate(sql,lists);
return nums;
}



本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部