spring JDBC
来源:互联网 发布:java 字符串 == 编辑:程序博客网 时间:2024/06/08 16:34
在使用普通的 JDBC 数据库时,就会很麻烦的写不必要的代码来处理异常,打开和关闭数据库连接等。 Spring JDBC 框架可以负责所有的低层细节,从开始打开连接,准备和执行 SQL 语句,处理异常,处理事务,到最后关闭连接。
JdbcTemplate :是Spring自带的一个类可以执行SQL查询,更新语句,调用存储过程,执行迭代结果集和提取返回参数值等的操作。jdbcTemplate类的实例是线程安全的。
下面是jdbcTemplate操作数据库的一个例子 :
数据源
CREATE TABLE IF NOT EXISTS `student` ( `sno` int(11) NOT NULL, `name` varchar(255) DEFAULT NULL, `sex` varchar(255) DEFAULT NULL, PRIMARY KEY (`sno`)) ENGINE=InnoDB DEFAULT CHARSET=utf8;INSERT INTO `student` (`sno`, `name`, `sex`) VALUES (1, 'tom', 'boy'), (2, 'jack', 'boy'), (3, 'linda', 'girl'), (4, 'rose', 'girl');
导入jar包
spring jdbc 使用到的jar包有:
- mysql-connector-java.jar
- org.springframework.transaction.RELEASE.jar
- spring-jdbc-4.0.5.RELEASE.jar
创建数据库DAO类
package com.spring.dao;import java.util.Iterator;import java.util.List;import java.util.Map;import java.util.Set;import javax.sql.DataSource;import org.springframework.jdbc.core.JdbcTemplate;public class StudentDao {private JdbcTemplate jdbcTemplate;//数据源private DataSource dataSource;public void getAllStudent(){ String sql = "select * from student"; List<Map<String,Object>> results = jdbcTemplate.queryForList(sql); Iterator<Map<String,Object>> iterator = results.iterator(); while(iterator.hasNext()) { Map<String,Object> student = iterator.next(); Set<String> keys = student.keySet(); Iterator<String> iterator2 = keys.iterator(); while(iterator2.hasNext()) { Object o =student.get((String)iterator2.next()) ; System.out.print(o.toString()+" "); } System.out.println(""); }}public DataSource getDataSource() { return dataSource;}public void setDataSource(DataSource dataSource) { this.dataSource = dataSource; //为jdbcTemplate配置数据源 this.jdbcTemplate = new JdbcTemplate(dataSource);}}
在xml中配置数据源和注册StudentDao
<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd" > <!-- 配置数据源 --> <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <property name="driverClassName" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8"/> <property name="username" value="root"/> <property name="password" value="root"/> </bean> <bean id="dao" class="com.spring.dao.StudentDao"> <property name="dataSource" ref="dataSource"/> </bean></beans>
测试类
package com.spring.test;import com.spring.dao.StudentDao;import org.junit.Test;import org.springframework.context.support.ClassPathXmlApplicationContext;public class MainTest { @Test public void Test() throws Exception { ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); StudentDao dao = (StudentDao) context.getBean("dao"); dao.getAllStudent(); context.close(); }}
测试结果
1 tom boy 2 jack boy 3 linda girl 4 rose girl
DriverMangerDataSource
这个类本质上也只是一个数据库连接类而已,不过是被封装了起来,构造方法 :
public DriverManagerDataSource() { } public DriverManagerDataSource(String url) { this.setUrl(url); } public DriverManagerDataSource( String url, String username, String password) { this.setUrl(url); this.setUsername(username); this.setPassword(password); }
JdbcTemplate 类
jdbcTemplate 有三个构造函数,可以指定dataSource,也可以不指定 。如果使用无参的构造方法,可以像例子那样在配置数据源的时候初始化。
public JdbcTemplate() { } public JdbcTemplate(DataSource dataSource) { this.setDataSource(dataSource); this.afterPropertiesSet(); } public JdbcTemplate(DataSource dataSource, boolean lazyInit) { this.setDataSource(dataSource); this.setLazyInit(lazyInit); this.afterPropertiesSet(); }
jdbcTemplate 封装了很多操作数据库的方法,可以直接调用,也可以重写后使用。个人觉得jdbcTemplate 常用的方法应该有以下几个:
execute
public void execute(final String sql) throws DataAccessException {...}
直接执行sql语句,没有返回值。
query
public <T> T query(final String sql, final ResultSetExtractor<T> rse) throws DataAccessException {...}
这个方法有很多重载的方法,根据不同的参数执行不同的方法,返回的结果也不一样。
queryForObject
public <T> T queryForObject(String sql, Class<T> requiredType) t hrows DataAccessException {... } ``` 以对象的形式返回查询结果### queryForList```java public List<Map<String, Object>> queryForList(String sql) throws DataAccessException {... }<div class="se-preview-section-delimiter"></div>
以list形式返回查询结果
update
public int update(String sql, Object... args) throws DataAccessException {.. }
更新数据
0 0
- Spring JDBC
- spring+JDBC
- Spring JDBC
- spring + jdbc
- Spring JDBC
- spring+jdbc
- spring+jdbc
- Spring JDBC
- Spring JDBC
- Spring JDBC
- Spring JDBC
- spring+jdbc
- Spring JDBC
- spring+jdbc
- spring jdbc
- Spring JDBC
- spring JDBC
- spring+jdbc
- 蓝桥杯算法训练 表达式计算
- 史上最简单的 MyBatis 教程(四)
- WIN10 SDKmanager无法打开解决方法
- scrollview嵌套listview或者GridView大小不确定
- Android的开源项目总结( 一 )
- spring JDBC
- ZOJ3322-Who is Older?
- vim 常用命令
- 欢迎使用CSDN-markdown编辑器
- 不要怂,就是GAN (生成式对抗网络) (四):训练和测试 GAN
- 过滤器和拦截器的区别
- 10006---临时急需马上说-01
- MySQL中锁详解(行锁、表锁、页锁、悲观锁、乐观锁等)
- sphinx学习技巧:亿万级项目都在用的sphinx