SpringJDBC+SpringMVC+MySQL的简单入门级用法


前面写完了SpringMVC实现文件上传,今天来说说SpringJDBC吧,SpringJDBC Template是一个可以帮助咱们开发者解决许多连接的细节化操作的类,开发者只需要考虑如何编写sql语句,剩下的工作去交给JDBC Template,可以完成CRUD操作,接下来来看看吧。

第一步,自然需要配置一下SpringJDBC了,这是一个外源包,需要自己加入,这里我们依然采用Maven来进行配置

 <!-- Spring JDBC and MySQL Driver -->        
	 	<dependency>
         	<groupId>org.springframework</groupId>
    		<artifactId>spring-jdbc</artifactId>
    		<version>4.2.1.RELEASE</version>         
     	</dependency>         
    	<dependency>             
     		<groupId>mysql</groupId>             
     		<artifactId>mysql-connector-java</artifactId>             
     		<version>5.0.5</version>         
   		</dependency> 

这里写好Maven配置后就Maven会帮助大家自行下载好的,不懂怎么配置的,请自己看下我前面用sts建立Maven工程的方法,这里下面的是配置mysql驱动的,推荐一下MavenRepository,这个网站有Maven下各种jar包的中央库,里面有配置,大家自行查看。下载好jar包自动导入后,自然是要给spring中注册这个类啦,注册的配置文件如下
<!-- dataSource 数据库连接池-->
	<beans:bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
  		<beans:property name="driverClassName" value="com.mysql.jdbc.Driver"></beans:property>
  		<beans:property name="password" value="xxxxx"></beans:property>
  		<beans:property name="url" value="jdbc:mysql://localhost:3306/spring<span style="font-size:18px;">useUnicode=true&amp;characterEncoding=utf-8</span>"></beans:property>
  		<beans:property name="username" value="root"></beans:property>
 	</beans:bean>
<!-- 配置jdbcTemplate -->
	<beans:bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
  		<beans:property name="dataSource" ref="dataSource"></beans:property>
 	</beans:bean>

这里的dataSource中指明了连接你的数据库的各种信息,数据库驱动,登录名,密码,localhost:最后面需要指定你的数据库,在spring后还可以指定编码方式jdbc:mysql://localhost:3306/spring?useUnicode=true&amp;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<User>(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"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<form action="queryUser" method="get">
	<input type="text" name="name"/>你想要查询的用户<br/>
	<input type="submit" value="色鬼"/></br>
</form>
<form action="deleteUser" method="get">
	<input type="text" name="name"/>你想要删除的用户<br/>
	<input type="submit" value="去死"/></br>
</form>
<form action="addUser" method="post">
	请添加一个新用户</br>
	<input type="text" name="name"/><br/>
	<input type="text" name="age"/><br/>
	<input type="text" name="lengthOfDick"/><br/>
	<input type="text" name="sex"/><br/>
	<input type="submit" value="来吧"/></br>
</form>
<form action="modifyUser" method="post">
	请更改一个账户</br>
	<input type="text" name="name"/><br/>
	<input type="text" name="age"/><br/>
	<input type="text" name="lengthOfDick"/><br/>
	<input type="text" name="sex"/><br/>
	<input type="submit" value="修改"/></br>
</form>

</body>
</html>
这里是前台提交的代码。有一个自己写好的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中加入一个编码过滤器,配置如下

<!-- 增加编码过滤器,这里需要设置forceEncoding参数值为true -->
	    <filter>  
        <filter-name>encodingFilter</filter-name>  
        <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>  
        <init-param>  
            <param-name>encoding</param-name>  
            <param-value>UTF-8</param-value>  
        </init-param>  
        <init-param>  
            <param-name>forceEncoding</param-name>  
            <param-value>true</param-value>  
        </init-param>  
    </filter>
第二个问题可能发生在你的mysql安装时选择的编码格式不对,进入mysql数据库后,输入status;然后查看自己的编码格式,我这里全都一致使用utf8,如果都没问题,只是在mysql的命令行中无法看中文,这个问题请参照我前面的文章

很多同学问我要源码,可是真的没有了,删掉了,如果说SpringMvc的话,有一个之前写的项目,可以给大家借鉴,https://github.com/DrJian/news



  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值