前面写完了SpringMVC实现文件上传,今天来说说SpringJDBC吧,SpringJDBC Template是一个可以帮助咱们开发者解决许多连接的细节化操作的类,开发者只需要考虑如何编写sql语句,剩下的工作去交给JDBC Template,可以完成CRUD操作,接下来来看看吧。
第一步,自然需要配置一下SpringJDBC了,这是一个外源包,需要自己加入,这里我们依然采用Maven来进行配置
org.springframework
spring-jdbc
4.2.1.RELEASE
mysql
mysql-connector-java
5.0.5
useUnicode=true&characterEncoding=utf-8">
这里的dataSource中指明了连接你的数据库的各种信息,数据库驱动,登录名,密码,localhost:最后面需要指定你的数据库,在spring后还可以指定编码方式jdbc:mysql://localhost:3306/spring?useUnicode=true&characterEncoding=utf-8,中间用";"隔开,这里一定注意。这里的spring是你想要使用的目标数据库。这样就配置好啦,来看看使用吧。
第二部,在DAO层使用JDBC Template,代码如下
@Repository("jdbcDataDAO")
public class JdbcDataDAOImpl implements JdbcDataDAO{
@Resource
private JdbcTemplate jdbcTemplate;
public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
this.jdbcTemplate = jdbcTemplate;
}
@Override
public void deleteUser(String name) {
// TODO Auto-generated method stub
String sql="delete from user where name = ?";
Object[] params = {name};
int[] types = {Types.VARCHAR};
jdbcTemplate.update(sql,params,types);
}
@Override
public void addUser(User user) {
// TODO Auto-generated method stub
String sql = "insert into user(name,age,lengOfDick,sex) "
+ "values (?,?,?,?)";
Object[] params = {user.getName(),user.getAge(),
user.getLengthOfDick(),user.getSex()};
int[] types = {Types.VARCHAR,Types.VARCHAR,Types.VARCHAR,Types.VARCHAR};
jdbcTemplate.update(sql, params, types);
}
//写这个来测试一下查询返回一个List列表
public List QueryAllUser(){
String sql = "select * from user";
return jdbcTemplate.query(sql, new RowMapperResultSetExtractor(new UserMapper()));
}
@Override
public void modifyUser(User user) {
// TODO Auto-generated method stub
String sql = "update user set age = ?, lengOfDick = ?, sex = ? where name = ?";
Object[] params = {user.getAge(), user.getLengthOfDick(), user.getSex(), user.getName()};
int[] types = {Types.VARCHAR,Types.VARCHAR,Types.VARCHAR,Types.VARCHAR};
jdbcTemplate.update(sql, params, types);
}
@Override
public User queryForUser(String name) {
// TODO Auto-generated method stub
String sql = "select * from user where name = ?";
Object[] params = new Object[]{name};
int[] types = new int[]{Types.VARCHAR};
return jdbcTemplate.queryForObject(sql, params, types, new UserMapper());
}
protected class UserMapper implements RowMapper,Serializable{
@Override
public Object mapRow(ResultSet arg0, int arg1) throws SQLException {
// TODO Auto-generated method stub
User user = new User();
user.setUser_id(arg0.getInt("user_id"));
user.setName(arg0.getString("name"));
user.setAge(arg0.getString("age"));
user.setLengthOfDick(arg0.getString("lengOfDick"));
user.setSex(arg0.getString("sex"));
return user;
}
}
}
这里可以处理各种类型的请求,增删改查,由于数据是我们收到之后才做处理,所以自然要使用动态sql,也就是使用?或者显式占位符来写,这里我都使用?来处理,大部分大家应该都可以看明白,有一个地方,在查询某一个特定的user时,我又传入了一个自己写的rowMapper类对象,如果这里不这样来写的话,你还想要返回一个对象的话,后台会报一个错误,说是(用中文表述)你想要一列,然而你查出了四列信息,查了百度后,需要加入一个重写RowMapper方法的类,这里大家参考
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
Insert title here
这里是前台提交的代码。有一个自己写好的entity类User,所以如果完整提交User的各个成员变量,SPring是可以自动封装的。
@Controller
public class JsonTestController {
@Resource
private JdbcDataDAOImpl jdbcDataDAO;
public void setJdbcDataDAO(JdbcDataDAOImpl jdbcDataDAO) {
this.jdbcDataDAO = jdbcDataDAO;
}
/*
* @responsebody返回json测试
*/
@RequestMapping(value="/queryUser")
public String returnJson(@RequestParam("name")String name) throws JsonGenerationException, JsonMappingException, IOException{
FileOutputStream out = new FileOutputStream(new File("F:"+File.separator+"json.json"));
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.writeValue(out,jdbcDataDAO.queryForUser(name));
System.out.println("success");
List users = jdbcDataDAO.QueryAllUser();
Iterator it = users.iterator();
while(it.hasNext()){
User user = (User)it.next();
System.out.println(user.getName());
}
return "JsonOutput";
}
@RequestMapping("/addUser")
public String addUser(User user){
jdbcDataDAO.addUser(user);
System.out.println(user.getName());
return "JsonOutput";
}
@RequestMapping("/deleteUser")
public String deleteUser(@RequestParam("name")String name){
jdbcDataDAO.deleteUser(name);
return "JsonOutput";
}
@RequestMapping("/modifyUser")
public String modifyUser(User user){
jdbcDataDAO.modifyUser(user);
return "JsonOutput";
}
}
这里是控制器的代码部分,非常简单。在查询时自己没事写了个转化为Json数据做个练习,为之后使用ajax铺垫一下这里。
在转化JSon之后写了一个测试查询返回List的
public class User implements Serializable{
private int user_id;
private String name;
private String age;
private String lengthOfDick;
private String sex;
省略set..get..方法
}
那么就写好了,大家在测试过程中可能会发生数据的确插入进去,但是却无法正常显示中文的问题,这里的话,可能为以下两种情形,第一种是穿给后台的数据已经乱码,这个问题好解决,在web.xml中加入一个编码过滤器,配置如下
encodingFilter
org.springframework.web.filter.CharacterEncodingFilter
encoding
UTF-8
forceEncoding
true
第二个问题可能发生在你的mysql安装时选择的编码格式不对,进入mysql数据库后,输入status;然后查看自己的编码格式,我这里全都一致使用utf8,如果都没问题,只是在mysql的命令行中无法看中文,这个问题请参照我前面的文章
很多同学问我要源码,可是真的没有了,删掉了,如果说SpringMvc的话,有一个之前写的项目,可以给大家借鉴,https://github.com/DrJian/news