配置数据源和jdbc的使用
一. 配置数据源
无论选择Spring的哪种数据访问方式,你都需要配置一个数据源的引用。Spring提供了在Spring上下文中配置数据源bean的多种方式,包括:
通过JDBC驱动程序定义的数据源
通过JNDI查找的数据源
连接池的数据源
1.1 使用JNDI数据源
使用Java配置的话,我们可以借助JndiObjectFactoryBean中查找DataSource:
@Bean
public DataSource productionDataSource(){
//使用JNDI数据源
JndiObjectFactoryBean jndiObjectFactoryBean = new JndiObjectFactoryBean();
jndiObjectFactoryBean.setJndiName("org.h2.Driver");
jndiObjectFactoryBean.setResourceRef(true);
jndiObjectFactoryBean.setProxyInterface(DataSource.class);
return (DataSource) jndiObjectFactoryBean.getObject();
}
1.2 使用数据源连接池
使用Java配置,借助BasicDataSource类的bean声明如下:
@Bean
public DataSource quDataSource(){
//数据源连接池
BasicDataSource basicDataSource = new BasicDataSource();
basicDataSource.setDriverClassName("org.h2.Driver");
basicDataSource.setUrl("jdbc:h2:tcp://localhost/~/spitter");
basicDataSource.setUsername("sa");
basicDataSource.setPassword("");
return basicDataSource;
}
1.3 基于JDBC驱动的数据源
在Spring中,通过JDBC驱动定义数据源是最简单的配置方式。Spring提供了三个这样的数据源类供选择:
DriverManagerDataSource:在每个连接请求时都会返回一个新建的连接。与JDBC的BasicDataSource不同,由DriverManagerDataSource提供的连接并没有进行池化管理。
SimpleDriverDataSource:与DriverManagerDataSource工作方式类似,但是它直接使用JDBC驱动,来解决在特定环境下的类加载问题,这样的环境包括OSGi容器。
SingleConnectionDataSource:在每个连接请求时都会返回同一个的连接。尽管SingleConnectionDataSource不是严格意义上的连接池数据源,但是可以将其视为只有一个连接的池。
注意:SingleConnectionDataSource有且只有一个数据库连接,不适于多线程,DriverManagerDataSource和SimpleDriverDataSource尽管支持多线程,但是在每次请求的时候都会创建新连接,这是以性能为代价的。
使用Java配置,借助DriverManagerDataSource类的bean声明:
//基于JDBC驱动的数据源
@Bean
public DataSource jdbcDataSource(){
DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setDriverClassName("org.h2.Driver");
dataSource.setUrl("jdbc:h2:tcp://localhost/~/spitter");
dataSource.setUsername("sa");
dataSource.setPassword("");
return dataSource;
}
1.4 使用嵌入式的数据源
使用Java配置,借助EmbeddedDatabaseBuilder类的bean声明:
@Bean
public DataSource developmentDataSource(){
//嵌入式数据原:每次重启应用或运行测试的时候,都能够重新填充测试数据
return new EmbeddedDatabaseBuilder()
.setType(EmbeddedDatabaseType.H2)
.addScript("classpath:schema.sql")
.addScript("classpath:test-data.sql")
.build();
}
使用JdbcTemplate来读取数据:
@Component
public class DbUserDaoImpl implements DbUserDao { @Autowired
private JdbcTemplate jdbcTemplate; private static final String SQL_INSERT_DBUSER = "insert into user_list (username, mobile, cardnumber) values (?, ?, ?)";
private static final String SQL_CHECK_DBUSER = "select id,username,mobile,cardnumber from user_list";
private static final String SQL_FINDBYID_DBUSER = "select id,username,mobile,cardnumber from user_list where id = ?";
private static final String SQL_UPDATE_DBUSER = "update user_list set username = ?,mobile = ?,cardnumber = ? where id = ?"; @Override
public void addDbUser(DbUser dbUser) {
jdbcTemplate.update(SQL_INSERT_DBUSER, dbUser.getUsername(), dbUser.getMobile(), dbUser.getCardnumber());
} @Override
public List<DbUser> findAll() {
return jdbcTemplate.query(SQL_CHECK_DBUSER, new DbUserRowMapper());
} @Override
public DbUser findById(int id) {
return jdbcTemplate.queryForObject(SQL_FINDBYID_DBUSER, new DbUserRowMapper(), id);
} public static final class DbUserRowMapper implements RowMapper<DbUser>{
public DbUser mapRow(ResultSet rs, int rowNum) throws SQLException {
int id = rs.getInt("id");
String username = rs.getString("username");
String mobile = rs.getString("mobile");
String cardnumber = rs.getString("cardnumber"); DbUser dbUser = new DbUser();
dbUser.setId(id);
dbUser.setUsername(username);
dbUser.setMobile(mobile);
dbUser.setCardnumber(cardnumber); return dbUser;
}
} public DbUser save(DbUser dbUser){
if(dbUser.getId() == null){
int id = insertDbUserAndReturnId(dbUser);
return jdbcTemplate.queryForObject(SQL_FINDBYID_DBUSER, new DbUserRowMapper(), id);
} jdbcTemplate.update(SQL_UPDATE_DBUSER, dbUser.getUsername(), dbUser.getMobile(), dbUser.getCardnumber(), dbUser.getId()); return dbUser;
} public int insertDbUserAndReturnId(DbUser dbUser){
SimpleJdbcInsert jdbcInsert = new SimpleJdbcInsert(jdbcTemplate).withTableName("user_list");
jdbcInsert.setGeneratedKeyName("id");
Map<String, Object> map = new HashMap<>();
map.put("username", dbUser.getUsername());
map.put("mobile", dbUser.getMobile());
map.put("cardnumber", dbUser.getCardnumber());
int id = jdbcInsert.executeAndReturnKey(map).intValue();
return id;
}
}
此文来源于:https://blog.csdn.net/qq_22314145/article/details/81562244
配置数据源和jdbc的使用的更多相关文章
- bean.xml配置数据源和读取配置文件配置数据源
一.bean.xml配置数据源 bean.xml装配bean,依赖注入其属性的时候,对应实体类中属性一定要有set方法, 二.读取配置文件配置数据源 1.配置文件 bean.xml配置: classp ...
- centos配置数据源和java环境配置
---恢复内容开始--- 一:前言 今天送走了一位同事,看着别人走勾起了我蠢蠢欲动的心啊,但是我知道,我不能那么的任性,我是men,这几天难得的清闲,所以我就弄一弄linux,昨天把网给配通了,今天配 ...
- 配置数据源和配置jpa的yml文件
spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver username: root password: root url: j ...
- JDBC五数据源和数据池(web基础学习笔记十一)
一.为什么使用数据源和连接池 现在开发的应用程序,基本上都是基于数据的,而且是需要频繁的连接数据库的.如果每次操作都连接数据库,然后关闭,这样做性能一定会受限.所以,我们一定要想办法复用数据库的连接. ...
- 如何正确的在java web配置数据池
在tomcat context.xml中配置数据 <Context reloadable="true"> <!-- Default set of monitore ...
- OLEDB数据源和目标组件
在SSIS工程的开发过程中,OLEDB 数据源和目标组件是最常用的数据流组件.从功能上讲,OLEDB 数据源组件用于从OLEDB 提供者(Provider)中获取数据,传递给下游组件,OLEDB提供者 ...
- .NET Core采用的全新配置系统[1]: 读取配置数据
提到“配置”二字,我想绝大部分.NET开发人员脑海中会立马浮现出两个特殊文件的身影,那就是我们再熟悉不过的app.config和web.config,多年以来我们已经习惯了将结构化的配置定义在这两个文 ...
- .NET Core配置文件加载与DI注入配置数据
.NET Core配置文件 在以前.NET中配置文件都是以App.config / Web.config等XML格式的配置文件,而.NET Core中建议使用以JSON为格式的配置文件,因为使用起来更 ...
- win7下IIS错误:"无法访问请求的页面,因为该页的相关配置数据无效"的解决方法(转)
今天新装win7,然后在IIS下布署了一个网站,布署完成后运行,提示如下错误:HTTP 错误 500.19 - Internal Server Error无法访问请求的页面,因为该页的相关配置数据无效 ...
随机推荐
- web性能优化--服务器端(二)
静态资源用CDN部署 添加Expires或者cache-control报文头 Gzip压缩传输文件 配置Etags 使用Get ajax请求 避免空图片src 尽早flush response 减少c ...
- 磁盘IO过高时的参考
主要命令:echo deadline > /sys/block/sda/queue/scheduler 注:以下的内容仅是提供参考,如果磁盘IO确实比较大的话,是数据库,可以进行读写分离或者分库 ...
- vue-router的路由
路由和组件是有区别的:组件一般是在同一个页面的不同模块,但是路由是直接切换到另一个页面,之前的页面销毁. App.vue中的router-view会渲染顶级路由匹配到的组件.组件内部嵌套的router ...
- 2019JAVA最新课程-React从入门到实战(新)
1.准备工作 可以在yunp.top网站看webpack,node/npm,cnpm的相关使用视频教程 react有两种使用方式,一是在现有网站中添加:二是创建一个全新的 官网创建全新一个react ...
- LeetCode - LRU怎么将书架上的旧书完美淘汰呢
你有一排书架,有空时会拿些书来看,经常性会买些新书.无奈书架容量有限,当新买的书放不下时,需要一个策略将旧书淘汰. LRU(最近最少使用)缓存淘汰机制正合适. 1)新买的书放在最左侧. 2)最近常看的 ...
- 配置文件:mainfest.xml
AndroidManifest.xml 是每个android程序中必须的文件. 它位于整个项目的根目录,描述了package中暴露的组件(activities,services, 等等),他们各自 ...
- TTTTTTTTTTTTTT POJ 3678 与或异或 2-SAT+强连通 模板题
Katu Puzzle Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 9129 Accepted: 3391 Descripti ...
- [模板][HDU]P2544[单源最短路][SPFA]
题目就不放了,主要是写一下SPFA,很少写,今天特别学了一个用STL的队列来做的. 代码: #include<iostream> #include<cstdio> #inclu ...
- 【Leetcode】位1的个数
解题方案:位操作的技巧 整数 n 和 n-1(n>0) 做与运算,从其二进制形式来看,可以消掉 n 的二进制数值中最后1个 “1” .循环进行,每次消掉1个 “1” .整数 n 的二进制数值中有 ...
- 1、安装Scrapy
一.网址:https://doc.scrapy.org/en/latest/intro/install.html 二.安装过程中出现"cl.exe"找不到的错误,解决方法:http ...