Spring中的JDBC操作
来源:互联网 发布:w7本地连接未识别网络 编辑:程序博客网 时间:2024/06/08 05:33
一、Spring模板JdbcTemplate
为了使 JDBC 更加易于使用, Spring 在 JDBC API 上定义了一个抽象层, 以此建立一个 JDBC 存取框架JdbcTemplate。
作为 Spring JDBC 框架的核心, JDBC 模板JdbcTemplate的设计目的是为不同类型的 JDBC 操作提供模板方法。每个模板方法都能控制整个过程, 并允许覆盖过程中的特定任务。通过这种方式, 可以在尽可能保留灵活性的情况下, 将数据库存取的工作量降到最低。
二、在Spring中配置使用JdbcTemplate
1、在XML中配置JdbcTemplate
使用JdbcTemplate需要结合C3P0数据源,这里采用引用外部属性文件的方式配置数据源。
2、在程序中获取JdbcTemplate
与获取其他bean对象类似
三、JdbcTemplate操作数据库
1、update方法:更新数据库
调用形式:
update方法可以执行INSERT, UPDATE, DELETE的数据库操作。
例如:
INSERT操作
DELETE操作
2、batchUpdate方法:批量更新数据库
调用形式:
batchUpdate的第二个参数batchArgs是 Object[] 的 List 类型: 因为修改一条记录需要一个 Object 的数组, 那么多条就需要一个Object[]的集合。
batchUpdate方法可以批量执行INSERT, UPDATE, DELETE的数据库操作,具体实现方法与上述方法类似,不做详述。
3、queryForObject方法:查询单行和统计查询
---查询单行的调用形式:
queryForObject方法从数据库中获取一条记录, 实际得到对应的一个对象。
这里需要调用 queryForObject(String sql, RowMapper<Employee> rowMapper, Object... args)方法。
其中的 RowMapper 指定如何去映射结果集的行, 常用的实现类为 BeanPropertyRowMapper,传入对应的类即可完成映射。
而在SQL语句中,需要使用SQL中列的别名完成列名和类的属性名的映射. 例如 last_name lastName和dept_id deptId。需要注意的是指定的别名(lastName和deptId)必须和类中的属性名保持一致。
---统计查询的调用形式:
4、query方法:查询多行
调用形式:
query查到的是实体类的集合。注意调用的不是 queryForList 方法。
其他实现细节与queryForObject方法类似。
5、JdbcTemplate的使用简化
每次使用都创建一个 JdbcTemplate 的新实例, 这种做法效率很低下。而JdbcTemplate 类被设计成为线程安全的, 所以可以在 IOC 容器中声明它的单个实例, 并将这个实例注入到所有的 DAO 实例中。同时JdbcTemplate 也利用了 Java 1.5 的特定(自动装箱, 泛型, 可变长度等)来简化开发。
四、使用具名参数
1、为什么使用具名参数
在经典的 JDBC 用法中, SQL 参数是用占位符 ? 表示,并且受到位置的限制。定位参数的问题在于, 一旦参数的顺序发生变化, 就必须改变参数绑定。
在 Spring JDBC 框架中, 绑定 SQL 参数的另一种选择是使用具名参数(named parameter)。
具名参数是指SQL 按名称(以冒号开头)而不是按位置进行指定。具名参数更易于维护, 也提升了可读性。具名参数由框架类在运行时用占位符取代。
注意:具名参数只在 NamedParameterJdbcTemplate 中得到支持
2、配置XML启用具名参数
3、使用NamedParameterJdbcTemplate操作数据库
使用方法:
可以看到使用具名参数时,必须使用Map结构来对具名参数和实际值进行一一映射,并将其传入相关方法中。批量更新时可以提供Map型的数组。
其他操作数据库的方法与之前一致,只是需要传入map来完成映射。
为了使 JDBC 更加易于使用, Spring 在 JDBC API 上定义了一个抽象层, 以此建立一个 JDBC 存取框架JdbcTemplate。
作为 Spring JDBC 框架的核心, JDBC 模板JdbcTemplate的设计目的是为不同类型的 JDBC 操作提供模板方法。每个模板方法都能控制整个过程, 并允许覆盖过程中的特定任务。通过这种方式, 可以在尽可能保留灵活性的情况下, 将数据库存取的工作量降到最低。
二、在Spring中配置使用JdbcTemplate
1、在XML中配置JdbcTemplate
使用JdbcTemplate需要结合C3P0数据源,这里采用引用外部属性文件的方式配置数据源。
<!-- 导入资源文件 --><context:property-placeholder location="classpath:db.properties"/><!-- 配置 C3P0 数据源 --><bean id="dataSource"class="com.mchange.v2.c3p0.ComboPooledDataSource"><property name="user" value="${jdbc.user}"></property><property name="password" value="${jdbc.password}"></property><property name="jdbcUrl" value="${jdbc.jdbcUrl}"></property><property name="driverClass" value="${jdbc.driverClass}"></property><property name="initialPoolSize" value="${jdbc.initPoolSize}"></property><property name="maxPoolSize" value="${jdbc.maxPoolSize}"></property></bean><!-- 配置 Spirng 的 JdbcTemplate --><bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"><property name="dataSource" ref="dataSource"></property></bean>
2、在程序中获取JdbcTemplate
与获取其他bean对象类似
private ApplicationContext ctx=null;private JdbcTemplate jdbcTemplate;{ ctx=new ClassPathXmlApplicationContext("applicationContext.xml");//初始化IOC容器 jdbcTemplate=(JdbcTemplate) ctx.getBean("jdbcTemplate");//通过IOC容器获取JdbcTemplate对象}
三、JdbcTemplate操作数据库
1、update方法:更新数据库
调用形式:
jdbcTemplate=(JdbcTemplate) ctx.getBean("jdbcTemplate"); //通过IOC容器获取JdbcTemplate对象String sql="UPDATE employees SET last_name= ? WHERE id= ?"; //定义执行的SQL语句jdbcTemplate.update(sql, "Kang",1);//传递参数
update方法可以执行INSERT, UPDATE, DELETE的数据库操作。
例如:
INSERT操作
String sql="INSERT INTO employees(last_name, email, dept_id) VALUES(?,?,?)";jdbcTemplate.update(sql, "Kang","Kang@qq.com",1);
DELETE操作
String sql="DELETE FROM employees WHERE id= ?";jdbcTemplate.update(sql,1);
2、batchUpdate方法:批量更新数据库
调用形式:
String sql="INSERT INTO employees(last_name,email,dept_id) VALUES(?,?,?)";List<Object[]> batchArgs=new ArrayList<>();batchArgs.add(new Object[]{"AA","aa@qq.com",2});batchArgs.add(new Object[]{"BB","bb@qq.com",3});batchArgs.add(new Object[]{"CC","cc@qq.com",1});batchArgs.add(new Object[]{"DD","dd@qq.com",4});jdbcTemplate.batchUpdate(sql, batchArgs);
batchUpdate的第二个参数batchArgs是 Object[] 的 List 类型: 因为修改一条记录需要一个 Object 的数组, 那么多条就需要一个Object[]的集合。
batchUpdate方法可以批量执行INSERT, UPDATE, DELETE的数据库操作,具体实现方法与上述方法类似,不做详述。
3、queryForObject方法:查询单行和统计查询
---查询单行的调用形式:
//已经定义好了Employee类为一个POJO类,并提供了相应的get/set方法String sql = "SELECT id, last_name lastName, email, dept_id deptId FROM employees WHERE id = ?";RowMapper<Employee> rowMapper = new BeanPropertyRowMapper<>(Employee.class);Employee employee = jdbcTemplate.queryForObject(sql, rowMapper, 1);//直接返回一个相应的对象System.out.println(employee);
queryForObject方法从数据库中获取一条记录, 实际得到对应的一个对象。
这里需要调用 queryForObject(String sql, RowMapper<Employee> rowMapper, Object... args)方法。
其中的 RowMapper 指定如何去映射结果集的行, 常用的实现类为 BeanPropertyRowMapper,传入对应的类即可完成映射。
而在SQL语句中,需要使用SQL中列的别名完成列名和类的属性名的映射. 例如 last_name lastName和dept_id deptId。需要注意的是指定的别名(lastName和deptId)必须和类中的属性名保持一致。
---统计查询的调用形式:
String sql = "SELECT count(id) FROM employees";//查询数据表的总记录数long count = jdbcTemplate.queryForObject(sql, Long.class);//第二个参数表示返回值的类型System.out.println(count);
4、query方法:查询多行
调用形式:
String sql = "SELECT id, last_name lastName, email, dept_id deptId FROM employees WHERE id > ?";RowMapper<Employee> rowMapper = new BeanPropertyRowMapper<>(Employee.class);List<Employee> employees = jdbcTemplate.query(sql, rowMapper,2);//查询id>2的结果集合System.out.println(employees);
query查到的是实体类的集合。注意调用的不是 queryForList 方法。
其他实现细节与queryForObject方法类似。
5、JdbcTemplate的使用简化
每次使用都创建一个 JdbcTemplate 的新实例, 这种做法效率很低下。而JdbcTemplate 类被设计成为线程安全的, 所以可以在 IOC 容器中声明它的单个实例, 并将这个实例注入到所有的 DAO 实例中。同时JdbcTemplate 也利用了 Java 1.5 的特定(自动装箱, 泛型, 可变长度等)来简化开发。
四、使用具名参数
1、为什么使用具名参数
在经典的 JDBC 用法中, SQL 参数是用占位符 ? 表示,并且受到位置的限制。定位参数的问题在于, 一旦参数的顺序发生变化, 就必须改变参数绑定。
在 Spring JDBC 框架中, 绑定 SQL 参数的另一种选择是使用具名参数(named parameter)。
具名参数是指SQL 按名称(以冒号开头)而不是按位置进行指定。具名参数更易于维护, 也提升了可读性。具名参数由框架类在运行时用占位符取代。
注意:具名参数只在 NamedParameterJdbcTemplate 中得到支持
2、配置XML启用具名参数
<!-- 配置 NamedParameterJdbcTemplate, 该对象可以使用具名参数, 其没有无参数的构造器, 所以必须为其构造器指定参数--><bean id="namedParameterJdbcTemplate"class="org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate"><constructor-arg ref="dataSource"></constructor-arg></bean>
3、使用NamedParameterJdbcTemplate操作数据库
使用方法:
//使用具名参数String sql = "INSERT INTO employees(last_name, email, dept_id) VALUES(:lastName,:email,:deptid)";Map<String, Object> paramMap = new HashMap<>();paramMap.put("lastName", "kang");paramMap.put("email", "kang@qq.com");paramMap.put("deptid", 2);namedParameterJdbcTemplate.update(sql, paramMap);//第二个参数是具名参数和实际值得映射Map。
可以看到使用具名参数时,必须使用Map结构来对具名参数和实际值进行一一映射,并将其传入相关方法中。批量更新时可以提供Map型的数组。
其他操作数据库的方法与之前一致,只是需要传入map来完成映射。
0 0
- Spring中的JDBC操作
- Spring学习-26:Spring中的JDBC Template(JDBC模板):完成增删改的操作
- Spring学习-27:Spring中的JDBC Template(JDBC模板):完成查询的操作
- Spring中的数据库操作 使用JDBC模板 :经典
- Spring Jdbc常规操作
- Spring Jdbc常规操作
- spring JDBC批量操作
- spring的jdbc操作
- spring-JDBC模板操作
- Spring jdbc操作
- 《Spring JDBC 操作数据库》
- Spring中的Jdbc
- JDBC中的事务操作
- spring--jdbc的批量操作
- Spring JDBC数据库操作类
- Spring使用JDBC操作数据库
- Spring JDBC 面向对象操作
- spring与Jdbc的操作
- 策略模式学习
- RCNN学习笔记(0):rcnn简介
- W88 Online Casino Earn Highest 1.1% Rebate Bonus(Earn Highest 1.1%, Rebate Bonus, w88, W88 Online Ca
- Presentation 常用的承接句——技术分享、学术报告串联全场不尴尬
- thinkphp 自动完成在自动验证unique时失效的解决方法
- Spring中的JDBC操作
-  |"|&|<|>等html字符转义
- Android Https请求调用
- Mybatis环境配置
- 设计模式---迭代器模式(C++实现)
- Codeforces Round #401 (Div. 2) C Alyona and Spreadsheet —— 打表
- 从kubernetes看如何设计超大规模资源调度系统
- linux同时启动两个Tomcat
- python 入门级问题