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;
}
}
import java.sql.ResultSet;
import java.sql.SQLException;
import org.springframework.jdbc.core.RowMapper;
public class UserMapper implements RowMapper {
@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;
}
}
这里,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 findAllUser() {
String sql = "select * from user";
RowMapper rowMapper = new BeanPropertyRowMapper(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;
}
}
(1)首先,直接在org.springframework.jdbc.datasource.DriverManagerDataSource这个系统自带的数据库连接源(其本质就是拥一个类class),初始化各个连接数据库必须的类变量driverClassName、url等,这里,&应该写成&,所有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的架构师看不惯的话省去了。
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_list = new ArrayList();
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避免警告
}
}