版权所有,如需转载,注明出处
-----张汉东
Spring提供的JDBC抽象框架core、datasource、object和support四个不同的包组成.
org.springframework.jdbc.core包里定义了提供核心功能的类,其中包含了一个用语JdbcTemplate的DAO基础类.我就是用这个基础类来实战连接Mysql数据库的.
对于没有Spring的日子的代码,这样的代码用来把记录集存储到一个对象中:
Object vo = new Object();
vo.setXX(rs.getXType(fieldName1));
vo.setYY(rs.getYType(fieldName2));
在Spring里,提供了这样一个接口RowMapper,其方法是public Object mapRow(ResultSet rs,int index),来完成这样的工作.
对于:
while(rs.next()) {
Object vo = new Object();
vo.setXX(rs.getXType(fieldName1)); vo.setYY(rs.getYType(fieldName2));
……
results.add(vo);
}
Spring中用new RowMapperResultReader(new RowMapper())来取代.
这样,JDBC中的查询过程,就被如下一句话所取代:
JdbcTemplate.query(sql,params,new RowMapperResultReader(new RowMapper()));
这个JdbcTemplate的query()方法封装了对JDBC底层API的调用,以及一些回调方法. 回调方法也是Spring框架的一种基本方法.
程序中使用了DAO来封装了对数据库的操作……JdbcTemplate的使用需要有一个DataSource的支持,所以在配置文件中,我们首先要配置一个Spring的DriverManagerDataSource,然后将这个DataSource配置到JdbcTemplate里.接着将JdbcTemplate配置到DAO层.最后将DAO配置到Model层:
具体的代码如下:(连接数据库为Mysql)
一.cn.zhd.DAO层
UserDAO接口:
package cn.zhd.DAO; import cn.zhd.Model.User; import java.util.List; public interface UserDAO { public void selectWithTemp(); public List select(String where); public void update(String how); public void insert(User u); public User selectById(String id); public void insertBatchData(final List<User> user); } |
DAO接口实现类
package cn.zhd.DAO.Imp;
import cn.zhd.DAO.UserDAO; import cn.zhd.Model.User; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.util.List;
import org.springframework.jdbc.core.BatchPreparedStatementSetter; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.jdbc.core.RowCallbackHandler; import org.springframework.jdbc.core.RowMapper; import org.springframework.jdbc.core.RowMapperResultReader;
public class UserDAOImp implements UserDAO{ private JdbcTemplate jt;
public JdbcTemplate getJt() { return jt; }
public void setJt(JdbcTemplate jt) { this.jt = jt; }
//Inner Class提供一个RresultSet中的row的映射对象 class UserRowMapper implements RowMapper{ public Object mapRow(ResultSet rs,int index) throws SQLException{ User u=new User(); u.setId(rs.getString("Id")); u.setName(rs.getString("Name")); u.setPassword(rs.getString("Password")); return u; } } public void selectWithTemp(){ String sql="select * from admin"; System.out.println("Id"+"/t"+"Name"+"/t"+"Password"); jt.query(sql,new RowCallbackHandler(){//一个实现了回调接口的类 //此方法为回调方法,每读取一行ResultSet被调用一次,它采用的是Statement, not a PreparedStatement public void processRow(ResultSet rs) throws SQLException{
System.out.println(rs.getString("Id")+"/t"+rs.getString("Name")+"/t"+rs.getString("Password")); }
});
} //多行查询 public List select(String where){ List list=null; String sql="select * from admin"+”/t”+where;//这里不能少”/t”,教训 list=jt.query(sql,new RowMapperResultReader(new UserRowMapper())); return list; }
public User selectById(String id){ String sql="select * from admin where id=?"; final User u=new User(); final Object[] params=new Object[]{id}; jt.query(sql,params,new RowCallbackHandler(){ public void processRow(ResultSet rs)throws SQLException{ u.setId(rs.getString("ID")); u.setName(rs.getString("Name")); u.setPassword(rs.getString("Password")); System.out.println(rs.getString("Name")+"/t"+rs.getString("Password")); } }); return u; } public void update(String how){ String sql=how; jt.update(sql); } //将插入数据封装为一个对象作为参数传递给JdbcTemplate public void insert(User u){ String sql="insert into admin(id,name,password) values(null,?,?)"; Object[] params=new Object[]{u.getName(),u.getPassword()}; jt.update(sql,params); } //批量插入数据 public void insertBatchData(final List<User> user){ String sql="insert into admin(id,name,password) values(null,?,?)"; BatchPreparedStatementSetter setter=new BatchPreparedStatementSetter(){ public int getBatchSize(){ return user.size(); } // 给PreparedStatement 设置value public void setValues(PreparedStatement ps,int index){ User u= user.get(index); try{ ps.setString(1,u.getName()); ps.setString(2,u.getPassword());
}catch(SQLException e){ e.printStackTrace(); } } }; jt.batchUpdate(sql, setter); } } |
二Model层
cn.zhd.Model.User.java
package cn.zhd.Model; import java.util.List; import cn.zhd.DAO.UserDAO;
public class User { private String name; private String id; private String password; private UserDAO dao; public User(){
} public User(String name, String password){ this.name = name; this.password = password; }
public void setDao(UserDAO dao){ this.dao=dao; }
public String getId(){ return id; }
public void setId(String id){ this.id=id; }
public String getName(){ return name; }
public void setName(String name){ this.name=name; }
public String getPassword() { return password; }
public void setPassword(String password) { this.password = password; }
public void getInfo(String id){ List list=dao.select("where id="+id);
User u=(User)list.get(0);
this.id=id; this.name=u.getName(); this.password=u.getPassword();
}
public void insert(){ dao.insert(this); }
public void update(String how){ dao.update(how); }
public void update(){ dao.update("update admin set name='"+name+"',password='"+password+"'where id="+id); }
public List selectWithTemp(String where) { return dao.select(where); } //得到查询结果 public void selectWithTemp(){ dao.selectWithTemp(); } //按id查询 public User selectById(String id){ return dao.selectById(id); } //批量插入数据 public void insertBatchData(final List<User> user){ dao.insertBatchData(user); } |
三.xml配置文件beans.xml
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans> <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <property name="driverClassName"> <value>com.mysql.jdbc.Driver</value> </property>
<property name="url"> <value>jdbc:mysql:///students</value> </property>
<property name="username"> <value>root</value> </property>
<property name="password"> <value></value> </property> </bean>
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"> <property name="dataSource"> <ref bean="dataSource"/> </property> </bean>
<bean id="userDAO" class="cn.zhd.DAO.Imp.UserDAOImp"> <property name="jt"> <ref bean="jdbcTemplate" /> </property> </bean>
<bean id="user" class="cn.zhd.Model.User"> <property name="dao"> <ref bean="userDAO"/> </property> <property name="name"> <value>zjd</value> </property> <property name="password"> <value>888</value> </property> </bean> </beans> |
四.测试类 JavaTest.java
package cn.zhd.Model;
import java.util.ArrayList; import java.util.List;
import org.springframework.beans.factory.BeanFactory; import org.springframework.beans.factory.xml.XmlBeanFactory; import org.springframework.core.io.ClassPathResource; import org.springframework.core.io.Resource;
public class UserTest { public static void main(String []args){ // User u=new User("zjd","888"); //批量插入数据 List<User> u = new ArrayList<User>(); u.add(new User("haha","123")); u.add(new User("hoho","234")); u.add(new User("zhansan","345")); u.add(new User("lisi","456")); u.add(new User("maqi","577")); u.add(new User("wo","899")); u.add(new User("admin","haha")); u.add(new User("fdsdf","675")); u.add(new User("werwr","89")); Resource resource=new ClassPathResource("beans.xml"); BeanFactory factory = new XmlBeanFactory(resource); User user = (User) factory.getBean("user"); // user.insert(); // user.update("update admin set name='zbj' where id=2"); user.insertBatchData(u); // user.selectWithTemp(); // user.selectById("2"); // user.getInfo("2"); } } |
虽然做完了,但是感觉对Spring的理解还是不够深入,慢慢学习吧…