传统JDBC代码的弊端
在传统的jdbc代码中,即使是执行一条简单的SQL语句,其实现的整个流程也是极为繁琐的,先打开数据库连接执行sql,然后组装结果,最后关闭数据库资源,这中间还有大量的try...catch...finally语句,造成了代码的泛滥,导致我们的代码可读性和可维护性急剧下降,从而引发信任问题,为了解决这些“疑难杂症”。Spring提供了自己的解决方案,那就是JdbcTemplate模板。

实现步骤:

1.以c3p0连接mysql为例,使用c3p0需要导入两个相关jar包:
c3p0-0.9.1.2.jar
以及数据库jar: mysql-connector-java-5.1.7-bin.jar
以及事物相关jar:spring-tx-4.2.4.RELEASE.jar spring-jdbc-4.2.4.RELEASE.jar

2、书写资源文件jdbc.properties

<!-- 注意这里有坑,者四个键值对的键要么固定这么写,要么就以jdbc.***的方式,切记用以下方式写,却把user写成username,这是因为spring加载时username这个键被其他地方使用了 -->
url=jdbc:mysql://localhost:3306/test?characterEncoding=utf-8
user=root
password=123456
driver=com.mysql.jdbc.Driver

3.书写配置文件

<context:property-placeholder
location="classpath:jdbc.properties" />
<bean id="dataSource"
class="com.mchange.v2.c3p0.ComboPooledDataSource"
destroy-method="close">
<property name="driverClass" value="${driver}"></property>
<property name="jdbcUrl" value="${url}"></property>
<property name="user" value="${user}"></property>
<property name="password" value="${password}"></property>
<!-- 这里还可以配置其他参数,比如initialPoolSize等等 -->
</bean>
<bean class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="dataSource"></property>
</bean>
<context:component-scan base-package="com.eric.jdbc"></context:component-scan>
</beans>

4.创建实体类:

//创建一个实体类,很简单,这里省略
public class BankUser {……}

5.创建一个实体类的映射类(用于指定数据库到实体类的字段映射关系):
通过RowMapper接口的实现,将每行数据映射到实例对象。但不必担心异常处理。调用JdbcTemplate将捕获并处理SQLExceptions。

public class BankUserMapper implements RowMapper<BankUser> {
public BankUser mapRow(ResultSet resultSet, int i) throws SQLException {
BankUser bankUser=new BankUser();
bankUser.setId(resultSet.getString("id"));
bankUser.setUserName(resultSet.getString("user_name"));
bankUser.setPassword(resultSet.getString("password"));
return bankUser;
}
}

6.书写DAO:

@Repository
public class UserDAOImpl {
@Autowired
private JdbcTemplate template;//必须注入JdbcTemplate模板
// 查询单个数据:
public BankUser findUserByname(String userName){
//在JdbcTemplate 都是使用?作为占位符
String sql ="select * from bank where id=?";
Object[] params = {userName};
RowMapper<BankUser> mapper = new BankUserMapper();
BankUser bankUser=template.queryForObject(sql, params,mapper);
return bankUser;
}
}
//查询多个数据:
public List<BankUser> findAllUser(){
String sql ="select * from bank";
RowMapper<BankUser> mapper = new BankUserMapper();
List<BankUser> list=template.query(sql,mapper);
return list;
}
//插入一条数据:
public void save(BankUser bankUser) {
String sql = "insert into bank(id,user_name,password,money) values (?,?,?,?)";
Object[] params = { bankUser.getId(),bankUser.getPassword(),
bankUser.getUserName(), bankUser.getMoney() };
template.update(sql, params);
}
//修改数据:
public void update(BankUser bankUser){
String sql = "update bank set password=? where id=?";
Object[] params ={bankUser.getPassword(),bankUser.getId()};
template.update(sql, params);
}
//删除数据:
public void deleteUser(String id){
String sql = "delete from emp where id=?";
Object[] params = {id};
template.update(sql, params);
}

最新文章

  1. js 键盘记录实现(兼容FireFox和IE)(转)
  2. online_jf.lua --累计在线时间领取物品(积分)的lua脚本
  3. 工程BUG记录
  4. 使用Adobe Edge Inspect在各种设备中轻松测试同一页面
  5. Mysql的float类型造成的困扰总结
  6. Java Map 按Key排序和按Value排序
  7. IE11登陆交行网银崩溃
  8. HTTP Status 500 - An exception occurred processing JSP page /WEB-INF
  9. smarty 自定义函数
  10. 软件开发常用的linux命令心得(ubuntu为例)
  11. Python函数化编程整理
  12. 数据库学习二三事儿(不打代码永远get不到的东西)
  13. 一、.NET Core MVC 项目结构模板
  14. Qt程序继承QApplication发生崩溃的原因
  15. 微软BI 之SSIS 系列 - 通过 ROW_NUMBER 或 Script Component 为数据流输出添加行号的方法
  16. 设计模式(八)Proxy Parttern 代理模式
  17. GreenDao在列中的单词之间自动加_
  18. Storm 安装部署
  19. Blocks POJ - 1390 多维dp
  20. 响应式设计的思考:媒体查询(media query)

热门文章

  1. Spring Cloud系列之使用Feign进行服务调用
  2. Skill Virtuoso IC6.1.7 的所有View Type
  3. 【JZOJ4726】种花 题解(贪心+堆)
  4. 实验02——java两个数交换的三种解决方案
  5. java_流程控制语句、权限修饰符
  6. 方法解析之Method与ConstMethod介绍
  7. .NET Core 微服务—API网关(Ocelot) 教程 [四]
  8. CheckList:ACL 2020 Best Paper
  9. HTML基础-01
  10. 编写有提示的listbox控件 2008-06-29 17:13