先看一些定义:

在Spring JDBC模块中,所有的类可以被分到四个单独的包:
1、core
即核心包,它包含了JDBC的核心功能。此包内有很多重要的类,包括:JdbcTemplate类、SimpleJdbcInsert类,SimpleJdbcCall类,以及NamedParameterJdbcTemplate类。
2、datasource
即数据源包,访问数据源的实用工具类。它有多种数据源的实现,可以在JavaEE容器外部测试JDBC代码。
3、object
即对象包,以面向对象的方式访问数据库。它允许执行查询并返回结果作为业务对象。它可以在数据表的列和业务对象的属性之间映射查询结果。
4、support
即支持包,是core包和object包的支持类。例如提供了异常转换功能的SQLException类。

Spring中的JDBC帮我们做很多事情,如定义数据库连接参数,打开数据库连接,处理异常,关闭数据库连接。

我们只需要关心SQL语句,也就是增删改查。就行

连接数据库,一般都用xml配置

     <!-- 导入资源文件 -->
<context:property-placeholder location="class:db.properties"/> <!-- 配置c3p0数据源 -->
<bean id="dataSource" class="com.mchange.v2.c3p0ComboPooledDataSource">
<property name="user" value="${jdbc.user}"></property>
<property name="password" value="${jdbc.password}"></property>
<property name="driverClass" value="${jdbc.driverClass}"></property>
<property name="jdbcUrl" value="${jdbc.jdbcUrl}"></property>
<property name="initPoolSize" value="${jdbc:initPoolSize}"></property>
<property name="maxPoolSize" value="${jdbc:maxPoolSize}"></property>
</bean>

资源文件:

1   jdbc:user=root
  jdbc:password=1230
  jdbc:driverClass=com.mysql.jdbc.Driver
  jdbc:jdbcUrl=jdbc:mysql:///spring4   jdbc:initPoolSize=5
  jdbc:maxPoolSize=10

main函数

     public void main() {
ApplicationContext ctx=new ClassPathXmlApplicationContext("jdbc.xml");
DataSource dataource = ctx.getBean(DataSource.class);
System.out.println(dataource.getConnection());
}

这样就能连接上数据库了。

处理SQL语句的是core包中的类,也要在xml中配置,这里说一下,最多是使用 jdbcTemplate

1、JdbcTemplate 

     <!-- 配置Spring的JdbcTemplate,数据源作它的属性-->
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="dataSource"></property>
</bean>
<!-- 配置NamedParameterJdbcTemplate,可以为参数命名。其没有无参构造函数,所以要指定参数 -->
<bean id="namedParameterJdbcTemplate" class="org.springframework.jdbc.core.nameparam.NamedParameterJdbcTemplate">
<constructor-arg ref="dataSource"></constructor-arg>
</bean>

获取jdbcTemplate和NamedParameterJdbcTemplate对象

 JdbcTemplate jdbcTemplate=(JdbcTemplate) ctx.getBean("jdbcTemplate");
NamedParameterJdbcTemplate namedParameterJdbcTemplate=(NamedParameterJdbcTemplate) ctx.getBean("namedParameterJdbcTemplate");
    //更新一条记录
@Test
public void testUpdate(){
String sql="UPDATE employees SET last_name = ? WHERE id = ?";
jdbcTemplate.update(sql,"jack",5);
}
    /*
* 获取单个列的总数
*/
@Test
public void testQueryForObject2(){
String sql="SELECT count(id) FROM employees";
long count=jdbcTemplate.queryForObject(sql,Long.class);
System.out.println(count);
}

如何获取一条数据?应该要把它取出放在一个对象里面吧。

为了能取出数据,必须创建一个对象专门用来存放,

 1   //用来存放数据的类,一条数据就是一个对象
public class Employee {
private int id;
private String lastName;
private String email;
private Template template;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
     /*从数据库获取一条记录,实际得到对应一个对象
* 注意不是调用queryForObject(String sql, Class<Employee> requiredType,..)
* 而是调用queryForObject(String sql, RowMapper<Employee> rowMapper)
* 1.其中的RowMapper指定如何去映射结果集的行,常用的实现类为BeanPropertyRowMapper
* 2.使用sql中列的别名完成列名和类的属性名的映射,last_name lastName
* 3.不支持级联映射,Employee类一个属性是一个对象,那这个对象不能被级联映射获取
*/
@Test
public void testQueryForObject(){
String sql="SELECT id,last_name lastName,email FROM employees WHERE id = ?";
RowMapper<Employee> rowMapper=new BeanPropertyRowMapper<>(Employee.class);//完成一条数据和一个对象属性的映射
Employee employee=jdbcTemplate.queryForObject(sql, rowMapper,1); //1是参数,就是id的参数
}

获取id大于5的所有数据

     /*
* 查到实体类的集合
*/
public void testQueryForList(){
String sql="SELECT id,last_name lastName,email FROM employees WHERE id > ?";
RowMapper<Employee> rowMapper=new BeanPropertyRowMapper<>(Employee.class);
List<Employee> employee=jdbcTemplate.query(sql, rowMapper,5);
System.out.println(employee);
}
     //批量处理
//最后一个参数是Object[]的List类型,因为修改一条记录需要一个Object的数组,那么多条就需要多个Object的数组
@Test
public void testBatchUpdate(){
String sql="INSERT INTO employees(last_name,email,dept_id) VALUES(?,?,?)";
//使用数组集合
List<Object[]> batchArgs=new ArrayList<>();
batchArgs.add(new Object[]{"AA","aa@atguigu.com",1});//一条数据就是一个对象数组
batchArgs.add(new Object[]{"BB","bb@atguigu.com",2});
batchArgs.add(new Object[]{"CC","cc@atguigu.com",3});
batchArgs.add(new Object[]{"DD","dd@atguigu.com",3});
batchArgs.add(new Object[]{"EE","ee@atguigu.com",2});
jdbcTemplate.update(sql,batchArgs);
}

2、NamedParameterJdbcTemplate--具名参数 ,可以给参数命名,不用像上面一样都是问号 "?"作参数。参数多了的话,更便于维护

     /*
* 参数名要对应一个值,就要使用键值对。用HashMap
*/
@Test
public void testNamedParameterJdbcTemplate(){
String sql="INSERT INTO employees(lase_name,email,dept_id) VALUES(:lastName,:email,:deptId)";
Map<String,Object> paramMap=new HashMap<>();
paramMap.put("lastName", "FF");
paramMap.put("email", "FF@aa.com");
paramMap.put("deptId", 2);
namedParameterJdbcTemplate.update(sql, paramMap);
}

再看这个,也可以用对象存入。

     /*
* 可以对参数命名,用对象传入
*/
@Test
public void testNamedParameterJdbcTemplate2(){
String sql="INSERT INTO employees(lase_name,email,dept_id) VALUES(:lastName,:email,:deptId)";
Employee employee=new Employee();
employee.setLastName("SYZ");
employee.setEmail("ee@e.com");
employee.setId(3);
SqlParameterSource paramSource=new BeanPropertySqlParameterSource(employee);//完成一条数据和一个对象属性的映射
namedParameterJdbcTemplate.update(sql, paramSource);
}

Spring学习记录(十四)---JDBC基本操作的更多相关文章

  1. 我的Spring学习记录(四)

    虽然Spring管理这我们的Bean很方便,但是,我们需要使用xml配置大量的Bean信息,告诉Spring我们要干嘛,这还是挺烦的,毕竟当我们的Bean随之增多的话,xml的各种配置会让人很头疼. ...

  2. Spring学习记录(十二)---AOP理解和基于注解配置

    Spring核心之二:AOP(Aspect Oriented Programming) --- 面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术.AOP是OOP的延续,是软 ...

  3. Spring学习记录(十)---使用FactoryBean配置Bean

    之前学了,配置bean可以用普通全类名配置.用工厂方法配置,FactoryBean又是什么呢 有时候配置bean要用到,IOC其他Bean,这时,用FactoryBean配置最合适. FactoryB ...

  4. 我的Spring学习记录(五)

    在我的Spring学习记录(四)中使用了注解的方式对前面三篇做了总结.而这次,使用了用户登录及注册来对于本人前面四篇做一个应用案例,希望通过这个来对于我们的Spring的使用有一定的了解. 1. 程序 ...

  5. spring boot / cloud (十四) 微服务间远程服务调用的认证和鉴权的思考和设计,以及restFul风格的url匹配拦截方法

    spring boot / cloud (十四) 微服务间远程服务调用的认证和鉴权的思考和设计,以及restFul风格的url匹配拦截方法 前言 本篇接着<spring boot / cloud ...

  6. Spring 学习记录3 ConversionService

    ConversionService与Environment的关系 通过之前的学习(Spring 学习记录2 Environment),我已经Environment主要是负责解析properties和p ...

  7. Spring 学习记录8 初识XmlWebApplicationContext(2)

    主题 接上文Spring 学习记录7 初识XmlWebApplicationContext refresh方法 refresh方法是定义在父类AbstractApplicationContext中的. ...

  8. python3.4学习笔记(十四) 网络爬虫实例代码,抓取新浪爱彩双色球开奖数据实例

    python3.4学习笔记(十四) 网络爬虫实例代码,抓取新浪爱彩双色球开奖数据实例 新浪爱彩双色球开奖数据URL:http://zst.aicai.com/ssq/openInfo/ 最终输出结果格 ...

  9. Linux学习之十四、管线命令

    Linux学习之十四.管线命令 地址:http://vbird.dic.ksu.edu.tw/linux_basic/0320bash_6.php

随机推荐

  1. DBImport V3.7版本发布及软件稳定性(自动退出问题)解决过程分享

    DBImport V3.7介绍: 1:先上图,再介绍亮点功能: 主要的升级功能为: 1:增加(Truncate Table)清表再插入功能: 清掉再插,可以保证两个库的数据一致,自己很喜欢这个功能. ...

  2. .NET Core的日志[4]:将日志写入EventLog

    面向Windows的编程人员应该不会对Event Log感到陌生,以至于很多人提到日志,首先想到的就是EventLog.EventLog不仅仅记录了Windows系统自身针对各种事件的日志,我们的应用 ...

  3. app引导页(背景图片切换加各个页面动画效果)

    前言:不知不觉中又加班到了10点半,整个启动页面做了一天多的时间,一共有三个页面,每个页面都有动画效果,动画效果调试起来麻烦,既要跟ios统一,又要匹配各种不同的手机,然后产品经理还有可能在中途改需求 ...

  4. Adaboost提升算法从原理到实践

    1.基本思想: 综合某些专家的判断,往往要比一个专家单独的判断要好.在"强可学习"和"弱科学习"的概念上来说就是我们通过对多个弱可学习的算法进行"组合 ...

  5. ZKWeb网页框架1.2正式发布

    发行日志 https://github.com/zkweb-framework/ZKWeb/blob/master/ReleaseNotes/ReleaseNote.1.2.md 主要改动 更新 ZK ...

  6. 开源免费且稳定实用的.NET PDF打印组件itextSharp(.NET组件介绍之八)

    在这个.NET组件的介绍系列中,受到了很多园友的支持,一些园友(如:数据之巅. [秦时明月]等等这些大神 )也给我提出了对应的建议,我正在努力去改正,有不足之处还望大家多多包涵.在传播一些简单的知识的 ...

  7. 一行代码实现java list去重

    1.不带类型写法: 1 List listWithoutDup = new ArrayList(new HashSet(listWithDup)); 2.带类型写法(以String类型为例):1)Ja ...

  8. FILE文件流的中fopen、fread、fseek、fclose的使用

    FILE文件流用于对文件的快速操作,主要的操作函数有fopen.fseek.fread.fclose,在对文件结构比较清楚时使用这几个函数会比较快捷的得到文件中具体位置的数据,提取对我们有用的信息,满 ...

  9. CentOS7之按时间段截取指定的Tomcat日志到指定文件的方法

    CentOS7之按时间段截取指定的Tomcat日志到指定文件的方法 sed -n '/2016-11-02 15:00:/,/2016-11-02 15:05:/p' catalina.out > ...

  10. 解决开启服务器防火墙导致ftp不能连接的问题

    在防火墙设置的"高级"选项卡中的"网络连接设置"--"本地连接"--"设置"中添加了"FTP服务器" ...