Spring整合JDBC连接数据库

Posted yongh701

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring整合JDBC连接数据库相关的知识,希望对你有一定的参考价值。

Spring其实无须Hibernate和Mybatis等组件,自己就能够借助JDBC连接数据库的。毕竟,在《【Spring】value和ref》(点击打开链接)我早就指出Spring只是一个将Java的各类初始化语句写在xml里面之中而已。Spring可以在Javaee设置数据库的原因,实际上,它是将一些诸如数据库用户名、密码等东西在xml中初始化,让各类数据库组件避免一系列繁琐的XX xx=new XX();xx.setusername("xx");等语句而已。下面,则使用一个Spring整合JDBC连接mysql数据库的例子说明这个问题。


一、程序目标

数据库中有张已经被举了无数次个栗子废表User里面的数据:

我们能将它的内容在Java中打印出来,如下图所示,也能在Java中修改它的数据。而连接这个数据库的地址、用户名、密码等通通写在xml文件中好管理。



二、程序所需的jar包

由2部分组成,一个是非常常见的JDBC连接Mysql的核心jar,一个是我在《【Spring】Spring3.x的下载与配置》(点击打开链接)提到过的Spring3.x组成的核心包。这里不再赘述了,将这些jar添加到你的Java工程之中。



三、程序制作

首先贴上程序的工程结构


1、首先User.java作为数据库的实体Java,也就是上面那张废表在Java的表现方式,相信大家见到这个private+setter+getter已经屡见不鲜了,输入完一系列私有变量,利用alt+shift+s让eclipse自动生成setter和getter,估计大家已经非常熟络。

public class User 

	private Integer id;
	private String username;
	private String password;

	public Integer getId() 
		return id;
	

	public void setId(Integer id) 
		this.id = id;
	

	public String getUsername() 
		return username;
	

	public void setUsername(String username) 
		this.username = username;
	

	public String getPassword() 
		return password;
	

	public void setPassword(String password) 
		this.password = password;
	



2、接下来是UserMapper.java这个是Spring直接整合JDBC的指定动作,告诉Spring,数据库和Java是如何匹配的,你照着上面的User.java改就行。这就是为何这么多Java应用,尤其是Javaee应用,常常数据库组件不直接用Spring,除了Spring之外,还要多一个Mybatis和Hibernate支持,毕竟这些组件能将这部分Mapper写到xml或者用注解的形式完成之后,Spring再写个xml整合下就好,无须写这个充满xx.setXX("")的Java这么不好维护了。要知道,在业内一大堆+=,=赋值语句是一件很羞耻的事情-_-!我也不知道什么时候形成这种风气的!

import java.sql.ResultSet;
import java.sql.SQLException;
import org.springframework.jdbc.core.RowMapper;

public class UserMapper implements RowMapper<User> 

	@Override
	public User mapRow(ResultSet rs, int rownum) throws SQLException 
		User user = new User();
		user.setId(rs.getInt("id"));
		user.setUsername(rs.getString("username"));
		user.setPassword(rs.getString("password"));
		return user;
	



3、然后是UserDao.java,关于数据库接口Java,实质上是一系列Java和数据库真正打交道的操作,你要Java怎么和数据库都应该写在这里,其它的Java类直接调用就好。我这里定义了查询整张表的数据、修改password字段两个方法。

这里,jdbcTemplate通过query(sql.mapper)方法,将sql查询到东西放到刚才定义的实体mapper中,返回值就是大家非常熟悉的Java List容器。而通过execute(sql)方法,直接对数据库进行修改,无返回值。这也和你平时在处理数据库一样的,查询是返回一个表给你,User代表其中一行,List则是这么多行的结合,而执行则无返回,只提示有几行被修改。

import java.util.List;

import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;

public class UserDao 
	
	private JdbcTemplate jdbcTemplate;//利用applicationContext.xml让它初始化,不用每个类都出现jdbcTemplate= new JdbcTemplate(xx)这些玩意!

	/*查询整张表的数据*/
	public List<User> findAllUser() 
		String sql = "select * from user";
		RowMapper<User> rowMapper = new BeanPropertyRowMapper<User>(User.class);
		return this.jdbcTemplate.query(sql, rowMapper);
	
	
	/*修改password字段*/
	public void updatePassword(int id,String password)
		String sql = "update user set password='"+password+"' where id="+id;
		jdbcTemplate.execute(sql);		
	

	/*JdbcTemplate jdbcTemplate的getter setter必须有,不然spring读不到这个变量。由于不太重要,习惯性放在最后*/
	public JdbcTemplate getJdbcTemplate() 
		return jdbcTemplate;
	

	public void setJdbcTemplate(JdbcTemplate jdbcTemplate) 
		this.jdbcTemplate = jdbcTemplate;
	
	


4、最后完成applicationContext.xml这个spring的核心文件。

(1)首先,直接在org.springframework.jdbc.datasource.DriverManagerDataSource这个系统自带的数据库连接源(其本质就是拥一个类class),初始化各个连接数据库必须的类变量driverClassName、url等,这里,&应该写成&amp;,所有xml中的&都应该这样转义,不然由于&是xml文件的关键字就像<>一样,直接写&是无法被处理。

(2)然后,在org.springframework.jdbc.core.JdbcTemplate这个系统自带的类,赋予刚才的数据库连接类让其初始化,也就是几乎可以完全等同JdbcTemplate jdbcTemplate=new JdbcTemplate(dataSource);这个意思了。这里的ref="dataSource"就是将上面的bean id="dataSource"里面成功初始化的数据库连接源,赋予给JdbcTemplate的意思。

(3)最后,将我们刚刚在自己写的UserDao.java中的jdbcTemplate初始化了,然后给个userDao的id,一会儿,在测试类Client.java中的UserDao userDao=new UserDao();让业内大部分装X的程序猿、大部分装X的架构师看不惯的话省去了。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://www.springframework.org/schema/beans  
    http://www.springframework.org/schema/beans/spring-beans-4.1.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=utf8&useOldAliasMetadataBehavior=true" />
		<property name="username" value="root" />
		<property name="password" value="root" />
	</bean>
	<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
		<property name="dataSource" ref="dataSource" />
	</bean>
	<bean id="userDao" class="UserDao">
		<property name="jdbcTemplate" ref="jdbcTemplate" />
	</bean>
</beans> 

5、完成client.java直接可以看到效果了。

import java.util.*;//打印数据库表的时候,用到容器List、ArrayList不得不应用

/*用于初始化Spring*/
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import org.springframework.context.ConfigurableApplicationContext;//用于关闭Spring

public class Client 

	public static void main(String[] args) 
		ApplicationContext applicationContext = new ClassPathXmlApplicationContext(
				"applicationContext.xml");// 初始化spring
		UserDao userDao = (UserDao) applicationContext.getBean("userDao");// 初始化userDao这个数据库接口类

		// userDao.updatePassword(1, "cc");这样就能修改id=1的password字段,让其变成cc,这里不作展示

		/* 查询整张表的内容将其打印出来 */
		List<User> user_list = new ArrayList<User>();
		user_list = userDao.findAllUser();
		for (User user : user_list) // jdk1.5+的foreach打印,省事,不用写这么多代码了
			System.out.println(user.getId() + "\\t" + user.getUsername() + "\\t"
					+ user.getPassword());
		

		((ConfigurableApplicationContext) applicationContext).close();// 关闭Spring避免警告
	




以上是关于Spring整合JDBC连接数据库的主要内容,如果未能解决你的问题,请参考以下文章

spring整合JDBC

JAVAEE——spring03:spring整合JDBC和aop事务

----------------------------------------spring 整合jdbc---------------------

Spring+MybatisSpring整合Mybatis

Spring+MybatisSpring整合Mybatis

Spring 与 Mybatis整合