一. 配置数据源
无论选择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

最新文章

  1. 将jsp页面转化为图片或pdf(一)
  2. store前台数据过滤
  3. Python学习笔记1——Python基础
  4. js012-DO2和DOM3
  5. 不用安装语言包,教你将PS界面语言修改成默认语言(英语)
  6. C#基础(一)——C#中反斜杠/n与/r的区别
  7. Implement Insert and Delete of Tri-nay Tree
  8. dot.js教程文档api
  9. C# 点击窗口任意位置拖动
  10. 【百度地图API】多家地图API文件大小对比
  11. matlab图像显示程序模板
  12. Bear and Three Balls
  13. 1455:An Easy Problem
  14. 什么是A记录  域名
  15. dpkg用管道批量删除deb
  16. APP动态加载轮播图片
  17. 机器学习技术点----apachecn的github地址
  18. structs2.8创建拦截器
  19. 20155227《网络对抗》Exp8 Web基础
  20. Git Client 管理:项目文件的获取和提交(实用篇)

热门文章

  1. MegaPixImage插件代码(new MegaPixImage)
  2. Linux系统中的硬件问题如何排查?(1)
  3. Hadoop2.7.4 yarn(HA)集群搭建步骤(CentOS7)
  4. 什么是工作流java Activity
  5. docker小知识
  6. luogu P1083 借教室 x
  7. HOG行人目标检测
  8. 【转】C语言中数组名和指针的区别
  9. 01 MySQL入门了解
  10. 搜索引擎算法研究专题七:Hilltop算法