1. 程式人生 > >SpringJDBC+SpringMVC+MySQL的簡單入門級用法

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