在SSM環境下實現省市區3級聯查
下面我們就以程式碼的形式來說一下這個省市區3級聯查是如何實現的。
一.Spring的核心配置檔案
我們知道Spring的核心配置檔案applicationContext通常放在src目錄下,下面就是applicationContext.xml。
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:jee="http://www.springframework.org/schema/jee" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:p="http://www.springframework.org/schema/p" xmlns:util="http://www.springframework.org/schema/util" xmlns:tool="http://www.springframework.org/schema/tool" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd http://www.springframework.org/schema/tool http://www.springframework.org/schema/tool/spring-tool.xsd" default-lazy-init="false" default-autowire="byName"> <!-- 配置資料來源,指定要操作的資料庫 --> <bean id="basicDataSource" class="org.apache.commons.dbcp.BasicDataSource"> <!-- 資料來源的基本屬性 --> <property name="driverClassName" value="com.mysql.jdbc.Driver"></property> <property name="url" value="jdbc:mysql://localhost:3306/ssmltl"></property> <property name="username" value="root"></property> <property name="password" value="root"></property> </bean> <!-- 配置要操作資料庫的sessionFactory --> <bean id="sqlSessionFactoryBean" class="org.mybatis.spring.SqlSessionFactoryBean"> <!-- <property name="dataSource"> <ref bean="dataSource" /> </property> --> <property name="dataSource" ref="basicDataSource"></property> <property name="configLocation" value="classpath:mybatis.cfg.xml"></property> </bean> <!-- 配置事務管理器 --> <bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <!-- 指定事務要操作的資料庫 --> <property name="dataSource" ref="basicDataSource"/> </bean> <!-- 配置事務管理器所作用的方法,事務策略--> <tx:advice id="txAdvice" transaction-manager="txManager"> <tx:attributes> <tx:method name="get*" read-only="true" /> <tx:method name="find*" read-only="true" /> <tx:method name="load*" read-only="true" /> <tx:method name="select*" read-only="true" /> <tx:method name="add*" propagation="REQUIRED" /> <tx:method name="save*" propagation="REQUIRED" /> <tx:method name="update*" propagation="REQUIRED" /> <tx:method name="del*" propagation="REQUIRED" /> </tx:attributes> </tx:advice> <!-- 進行切面和切點的配置 --> <aop:config proxy-target-class="true"> <!-- 配置切點 --> <aop:pointcut id="serviceMethod" expression="execution(* service.*.*(..))"/> <!-- 配置切面 --> <aop:advisor advice-ref="txAdvice" pointcut-ref="serviceMethod" /> </aop:config> <!-- 掃描包,發揮註解的作用 ,進行屬性注入--> <context:annotation-config/> <context:component-scan base-package="com.java"/> <!-- 空地,用xml的方式來配置bean --> </beans>
在這段程式碼中,我們配置了資料來源,配置要操作資料庫的sessionFactory。並且在配置sessionFactory時,指定了sessionFactory操作的資料庫和操作資料庫的方法。
我們也在該檔案中配置了事務管理器,用來進行事務管理。配置事務管理器的時候,指定了事務要操作的資料庫。
下面我們來看一下配置事務時,<tx:advice>標籤的作用:
我們在<tx:method>標籤中,配置了name值,說明為哪一類方法實現了事務管理。 propagation="REQUIRED"代表支援當前事務,如果當前沒有事務,就新建一個事務。這是最常見的選擇。其中*為萬用字元,即代表以select為開頭的所有方法,即表示符合此命名規則的方法作為一個事務。
在配置切面的切點的過程中,切點的作用是為滿足條件的所有方法開啟事務,但是沒有是實現事務,實現事務需要用<tx:method>標籤來指明。expression="execution(* service.*.*(..))" 的作用是:service包下的作用類的作用方法(不限返回值型別和方法的引數個數)開啟事務。第一個 * 萬用字元: 任意返回值型別;第二個 * 萬用字元: 包service 下的任意class;第三個 * 萬用字元:包service下的任意class的任意方法;第四個 .. :方法可以有0個或多個引數。
當然了,我們需要在該檔案中掃描所需要的包,發揮註解的作用 ,進行屬性注入。
二.Mybatis的核心配置檔案
mybatis的核心配置檔案的位置和名稱不是固定的,因為在applicationContext.xml需要引入這個檔案,我們只需要把mybatis的核心配置檔案路徑給applicationContext.xml即可。但是我們通常將它放在src目錄下,命名為mybatis.cfg.xml。
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!-- 配置要操作資料庫的對映檔案,對映檔案中定義了操作資料庫的具體方式(方法) -->
<mappers>
<mapper resource="com/java/entity/ProvinceMapper.xml"></mapper>
</mappers>
</configuration>
在該檔案中,我們只引入了mapper.xml,這個檔案我們可以認為是操作資料庫的方法(sql語句)。
三.springMVC的核心配置檔案
springMVC的核心配置檔案的檔名和存放位置我們也可以自定義,因為這個容器是有web容器進行載入的,我們只需要在web容器中指定做需要載入的 springMVC的核心配置檔案的路徑即可。但是我們通常將它放在src目錄下,命名為springmvc-servlet.xml。
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:c="http://www.springframework.org/schema/c" xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:p="http://www.springframework.org/schema/p" xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:util="http://www.springframework.org/schema/util" xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd">
<!-- 配置handleMapping
<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"></bean>
-->
<!-- 配置HandlerAdapter
<bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"></bean>
-->
<!-- springmvc上傳圖片 -->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="defaultEncoding" value="utf-8"></property>
<property name="maxUploadSize" value="10485760000"></property>
<property name="maxInMemorySize" value="40960"></property>
</bean>
<!-- 用於將物件轉為JSON -->
<bean id="stringConverter" class="org.springframework.http.converter.StringHttpMessageConverter">
<property name="supportedMediaTypes">
<list>
<value>text/plain;charset=UTF-8</value>
</list>
</property>
</bean>
<bean id="jsonConverter" class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"></bean>
<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
<property name="messageConverters">
<list>
<ref bean="stringConverter"/>
<ref bean="jsonConverter"/>
</list>
</property>
</bean>
<!-- 對模型檢視新增前後綴
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"
p:prefix="/WEB-INF/jsp/" p:suffix=".jsp"/>
-->
<!-- 掃描包,發揮註解的作用,並把生成的bean放到springmvc容器中-->
<context:component-scan base-package="com.java.Controller"/>
</beans>
在這裡最重要的就是配置了 用於將物件轉為JSON 的功能(JSON轉換器)。我們需要匯入 jackson-annotations-*.jar , jackson-core-.jar , jackson-databind-.jar。
四.web.xml
上述的spring的核心配置檔案和springmvc的核心配置檔案之所以位置和名稱可以自定義,就是因為在web.xml中已經指定了這兩個檔案所在的位置,關於這個檔案,程式碼如下:
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<!-- 該元素用來宣告應用範圍(整個WEB專案)內的上下文初始化引數。
param-name 設定上下文的引數名稱。必須是唯一名稱
param-value 設定的引數名稱的值
-->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<servlet>
<servlet-name>DisplayChart</servlet-name>
<servlet-class>
org.jfree.chart.servlet.DisplayChart <!--這個固定不變-->
</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>DisplayChart</servlet-name>
<url-pattern>/DisplayChart</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- 指定位置載入springmvc配置檔案 -->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc-servlet.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>*.action</url-pattern>
</servlet-mapping>
<!-- 亂碼過濾器 begin -->
<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>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!-- 亂碼過濾器 end -->
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>
五.index.jsp
在配置檔案完成後,我們就可以著手功能程式碼了。我們先來介紹一下index.jsp,也就是用來顯示3級聯查的頁面。
<%@ page language="java" import="com.java.utils.*" pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
System.out.println(basePath);
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<!-- <base href="<%=basePath%>"> -->
<script type="text/javascript" src="js/jquery-1.11.0.min.js"></script>
<title>My JSP 'index.jsp' starting page</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
<script type="text/javascript">
function show_1(){
$.ajax({
url:'province/selectAll.action',
type:'post',
data:{'typeId':0},
dataType:'json',
//成功回撥函式的引數data是一個json陣列,長度是json數組裡面的物件的個數。
success:function(data){
/*
alert(data);
alert(JSON.stringify(data));
*/
console.log(JSON.stringify(data));
console.log(data.length);
var t="<option value='0'>----請選擇省----</option>";
for(var i=0;i<data.length;i++){
t+="<option value="+data[i].provinceId+">"+data[i].provinceName+"</option>";
//<option value=1>liaoning</option><option value=1>heilongjiang</option>
}
$("#p").html(t);
}
})
}
function show_2(){
var provinceId=$("#p").val();
$.ajax({
url:'province/selectAllCity.action',
type:'post',
data:{'provinceId':provinceId},
dataType:'json',
success:function(data){
var t="<option value='0'>----請選擇城市----</option>";
for(var i=0;i<data.length;i++){
t+="<option value="+data[i].cityId+">"+data[i].cityName+"</option>"
}
$("#c").html(t);
},
error:function(data){
alert("查詢城市失敗了!");
}
})
}
function show_3(){
var cityId=$("#c").val();
$.ajax({
url:'province/selectAllArea.action',
type:'post',
data:{"cityId":cityId},
dataType:'json',
success:function(data){
alert(data);
console.log(JSON.stringify(data));
var t="<option value='0'>----請選擇市區----</option>";
for(var i=0;i<data.length;i++){
t+="<option value="+data[i].areaId+">"+data[i].areaName+"</option>"
}
$("#a").html(t);
}
})
}
function text_1(){
$.ajax({
url:'TextResponseBody/text.action',
type:'post',
dataType:'json',
success:function(data){
/*
alert(data);
alert(JSON.stringify(data));
*/
console.log(JSON.stringify(data));
console.log(data.length);
var t="<option value='0'>----請選擇省----</option>";
for(var i=0;i<data.length;i++){
t+="<option value="+data[i].provinceId+">"+data[i].provinceName+"</option>";
//<option value=1>liaoning</option><option value=1>heilongjiang</option>
}
$("#p").html(t);
}
})
}
</script>
</head>
<!-- onload頁面載入之後立即執行一段 JavaScript
包含有onchange事件的標籤在發生改變時會觸發已經繫結的函式。
JSONObject.fromObject()方法。
-->
<body onload="show_1()">
<!-- 請選擇你要查詢的省份:<input type="text" name="selectProvince"/>
<br/>
-->
<select id="p" onchange="show_2()"></select>
<select id="c" onchange="show_3()"><option value='0'>----請選擇城市----</option></select>
<select id="a" ><option value='0'>----請選擇市區----</option></select>
</body>
</html>
要想使用ajax,那麼必須要匯入jquery.js檔案。裡面定義了3個show方法,這3個方法分別查詢資料庫中的省,市,區。我們通過字串的拼接(包括標籤),然後將所拼接的字串通過html方法放到所需要的標籤中來顯示資訊。
在這個檔案中,在body標籤中有一個onload="show_1()"屬性,這個屬性的作用是當頁面載入完成後,自動執行js中的函式show_1()方法,它和$(function(){ }); 的作用是相似的。
在select標籤中還有一個onchange()方法。onchange()方法的作用是當這個屬性所在的標籤發生改變時,就會執行這個方法中的js函式。例如select標籤,我們選中不同的元素時,那麼select標籤的value值發生改變,就會執行對應的函式。有如:讓input輸入框中有這個標籤時,只要輸入框中的值發生改變時,那麼就會執行onchange()方法中的js函式。
在這個檔案中,成功回撥函式接收到的是一個json陣列。我們如果直接alert(data),那麼提示的會是多個Object型別的資料,我們可以通過JSON.stringify(data)方法來將資料進行解析,然後通過console.log()方法,就可以將資料列印到前臺控制檯。 我們可以看到有這麼一行程式碼:String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
輸出basePath我們可以得到:http://localhost:8080/SSMLTL/。通過列印我們可以知道,request.getScheme()可以得到請求該頁面用到的協議。request.getServerName()可以得到請求的主機名。request.getServerPort()可以得到請求的埠號。而path就是我們已經得到的專案名。注意path得到的是 /+專案名,所以埠號和path拼接的時候,不用在拼接 “/”。
六.Controller
我們通過url 訪問指定的Controller的指定方法。
package com.java.Controller;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import com.java.service.ProvinceService;
import com.java.utils.ToJson;
@Controller
@RequestMapping("/province")
public class ProvinceController {
//將service物件注入到controller中
@Autowired
private ProvinceService provinceService;
public ProvinceService getProvinceService() {
return provinceService;
}
//通過註解注入好像有沒有set方法都可以?
public void setProvinceService(ProvinceService provinceService) {
this.provinceService = provinceService;
}
@RequestMapping("/selectAll")
@ResponseBody
//挑選全部的省份資訊
public void selectAll(HttpServletRequest request,HttpServletResponse response,
@RequestParam("typeId") int typeId) {
List<Map<String, Object>> list=new ArrayList<Map<String, Object>>();
try {
list=provinceService.selectAll(typeId);
} catch (Exception e) {
e.printStackTrace();
}
ToJson.toJson(list, request, response);
}
@RequestMapping("/selectAllCity")
@ResponseBody
//挑選全部的城市資訊
public void selectAllCity(HttpServletRequest request,HttpServletResponse response,
@RequestParam("provinceId") int provinceId) {
List<Map<String, Object>> list=new ArrayList<Map<String, Object>>();
try {
list=provinceService.selectAllCity(provinceId);
} catch (Exception e) {
e.printStackTrace();
}
ToJson.toJson(list, request, response);
}
@RequestMapping("/selectAllArea")
@ResponseBody
//挑選全部的區資訊
public void selectAllArea(HttpServletRequest request,HttpServletResponse response,
@RequestParam("cityId") int cityId) {
List<Map<String, Object>> list=new ArrayList<Map<String, Object>>();
try {
list=provinceService.selectAllArea(cityId);
} catch (Exception e) {
e.printStackTrace();
}
System.out.println(list);
ToJson.toJson(list, request, response);
}
//==============================================================================================
public static void main(String[] args) {
ProvinceController a=new ProvinceController();
a.selectAll(null, null, 3);
}
/*hou:[{areaName=和平區, areaId=1}, {areaName=鐵西區, areaId=2}, {areaName=瀋河區, areaId=3}]
qian:[{"areaId":1,"areaName":"和平區"},{"areaId":2,"areaName":"鐵西區"},{"areaId":3,"areaName":"瀋河區"}]
* */
}
@RequestMapping註解括號內的值就是我們要訪問的路徑。通過 @RequestParam 來將前臺對應的引數給方法引數。 @ResponseBody 一會我轉發一篇部落格,那麼將會有詳細介紹。
這裡用到了一個toJson工具方法,程式碼如下:
package com.java.utils;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.alibaba.fastjson.JSON;
public class ToJson {
/**
* 方法功能:將物件轉換成JSON字串,並響應回前臺
* 引數:object,request,response
* 返回值:void
* 異常:IOException
*/
public static void toJson(Object object,HttpServletRequest request,HttpServletResponse response) {
//Object 型別可以接收list集合,集合也是一個物件,物件擁有型別,Object是所有型別的父類。
Object obj=new ArrayList();
/*PrintWriter列印字元流、用於將各種java資料一字串的形式列印到底層字元輸出流中
* */
PrintWriter out = null;
try {
//JSON.toJSONStringWithDateFormat用於序列化資訊。
String json = JSON.toJSONStringWithDateFormat(object, "yyyy-MM-dd HH:mm:ss");
/*response.setContentType(MIME)的作用是使客戶端瀏覽器,區分不同種類的資料,並根據不同的MIME呼叫瀏覽
*器內不同的程式嵌入模組來處理相應的資料。例如web瀏覽器就是通過MIME型別來判斷檔案是GIF圖片。通過MIME型別來處
*理json字串。
* */
response.setContentType("text/html;charset=utf-8");
//得到一個列印字元輸出流
out = response.getWriter();
//[{"areaId":1,"areaName":"和平區"},{"areaId":2,"areaName":"鐵西區"},{"areaId":3,"areaName":"瀋河區"}]
System.out.println(json);
//要通過字元輸出流來向前臺輸出資料
out.write(json);
out.flush();
} catch (Exception e) {
e.printStackTrace();
} finally {
if (out != null) {
out.close();
}
}
}
}
這個小Demo是我從網上下的,然後自己重新寫了一遍,做了一點更改,也將自己不懂的記錄起來。這裡看到一個集合容器竟然用Object型別來接收,心想,一個容器怎麼可以用物件型別來接收呢?後來又一想:集合也是一個物件,是物件就擁有型別,而Object是所有型別的父類,所以能接收。
PrintWriter列印字元流,用於將各種java資料 —— 字串的形式列印到底層字元輸出流中。
response.setContentType(MIME)的作用是使客戶端瀏覽器,區分不同種類的資料,並根據不同的MIME呼叫瀏覽器內不同的程式嵌入模組來處理相應的資料。例如web瀏覽器就是通過MIME型別來判斷檔案是GIF圖片。通過MIME型別來處理json字串。 而MIME型別簡單來說就是文字資料的型別。
在傳資料的時候,傳進來的是一個list集合,其中是物件,但是經過:
String json = JSON.toJSONStringWithDateFormat(object, "yyyy-MM-dd HH:mm:ss");
這行程式碼,這個物件集合就變成了Json物件陣列。這裡有有點不理解,既然這能做到,那在spring中配置Json轉換器還有什麼用?沒有它同樣可以將物件集合就變成了Json物件陣列。
通過write()方法來向前臺返回資料。
七.Service
下面是service實現類部分程式碼,service介面這裡就省略不寫了。
package com.java.service;
import java.util.List;
import java.util.Map;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.java.dao.ProvinceDao;
@Service("/provinceService")
public class ProvinceServiceImpl implements ProvinceService {
@Autowired
private ProvinceDao provinceDao;
public ProvinceDao getProvinceDao() {
return provinceDao;
}
public void setProvinceDao(ProvinceDao provinceDao) {
this.provinceDao = provinceDao;
}
//挑選全部的省份資訊
@Override
public List<Map<String, Object>> selectAll(int typeId) {
List<Map<String, Object>> list=provinceDao.selectAll(typeId);
return list;
}
//挑選全部的城市資訊
@Override
public List<Map<String, Object>> selectAllCity(int provinceId) {
List<Map<String, Object>> list=provinceDao.selectAllCity(provinceId);
return list;
}
//挑選全部的地區資訊
@Override
public List<Map<String, Object>> selectAllArea(int cityId) {
List<Map<String, Object>> list=provinceDao.selectAllArea(cityId);
return list;
}
}
八.dao
這裡呢,我們不適用代理的方式,我們直接實現dao介面,編寫它的實現類。下面是dao實現類的程式碼,同樣的dao介面這裡我們也省略不貼程式碼了。
package com.java.dao;
import java.util.List;
import java.util.Map;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
@Repository("/provinceDao")
public class ProvinceDaoImpl implements ProvinceDao{
@Autowired
private SqlSessionFactory sqlSessionFactory; //因為採用mybatis所以SqlSessionFactory
public SqlSessionFactory getSqlSessionFactory() {
return sqlSessionFactory;
}
//通過sqlSessionFactory工廠來獲得操作資料庫的sqlSession物件
public SqlSession getSqlSession(){
return sqlSessionFactory.openSession();
}
public void setSqlSessionFactory(SqlSessionFactory sqlSessionFactory) {
this.sqlSessionFactory = sqlSessionFactory;
}
//挑選全部的省份資訊
@Override
public List<Map<String, Object>> selectAll(int typeId) {
SqlSession sqlSession=this.getSqlSession();
//通過sqlSession來呼叫框架自帶的方法查詢
List<Map<String, Object>> list=sqlSession.selectList("selectAll",typeId);
return list;
}
//挑選全部的城市資訊
@Override
public List<Map<String, Object>> selectAllCity(int provinceId) {
SqlSession sqlSession=this.getSqlSession();
List<Map<String, Object>> list=sqlSession.selectList("selectAllCity",provinceId);
return list;
}
//挑選全部的地區資訊
@Override
public List<Map<String, Object>> selectAllArea(int cityId) {
SqlSession sqlSession=this.getSqlSession();
List<Map<String, Object>> list=sqlSession.selectList("selectAllArea",cityId);
return list;
}
}
九.Mapper.xml
我們已經通過sqlSession呼叫方法來查詢資料庫,那麼我們就需要在mapper中定義查詢資料庫的sql語句,並且這個sql語句所在標籤的id 值要和daoImpl中的索引值一致。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!-- 這就相當於一個Dao的實現類一樣,並指定實現哪一個Dao介面
<mapper namespace="com.java.dao.ProvinceDao">
-->
<mapper namespace="com.java.entity.Province">
<!--如果引入的xml檔案中有相同的id值,就會發生異常。selectAll在對映語句集合中是含糊不清的(嘗試使用包括名稱空間在內的全名,或者重新命名其中一個條目
selectAll is ambiguous in Mapped Statements collection (try using the full name including the namespace, or rename one of the entries
-->
<!--
<resultMap id="province" type="com.java.entity.Province" >
<result column="provinceId" property="provinceId" jdbcType="INTEGER" javaType="int"/>
<result column="provinceName" property="provinceName" jdbcType="VARCHAR" javaType="string"/>
<result column="typeId" property="typeId" jdbcType="INTEGER" javaType="int"/>
</resultMap>
-->
<!-- 挑選全部的省份資訊 -->
<select id="selectAll" parameterType="int" resultType="com.java.entity.Province">
select provinceId,provinceName from t_province
</select>
<!-- 挑選全部的城市資訊 -->
<select id="selectAllCity" parameterType="int" resultType="java.util.Map">
select cityId,cityName from t_city where provinceId=#{provinceId}
</select>
<!-- 挑選全部的城市資訊 -->
<select id="selectAllArea" parameterType="int" resultType="java.util.Map" >
select areaId,areaName from t_area where cityId=#{cityId}
</select>
</mapper>
每回namespace中我們寫的都是dao介面的許可權定名,但是這次卻寫什麼都可以,因為我們已經實現了dao介面,所以namespace我們可以把它當做名稱空間。如果不同的mapper.xml檔案中,有相同的id值標籤怎麼辦?那麼在查詢的時候,就會發生異常,因為jvm不知道執行哪一個標籤的sql語句。我百度了一下,想既然你模稜兩可不知道用哪個sql語句,那我把namespace加上,通過namespace+id的形式不就可以指定執行哪一個sql了?很遺憾,我們找到書寫語法。。。。。。。。
十.資料庫
最後貼一下資料庫的截圖。
------------
-------------------------
-
------------------------
----------------------
這個資料庫建的屬實很簡單,為了測試嗎,見諒。。。。。。。
對了,還有一個實體類,也順便貼上吧:
package com.java.entity;
public class Province {
//省所需屬性
private int provinceId;
private String provinceName;
public int getProvinceId() {
return provinceId;
}
public void setProvinceId(int provinceId) {
this.provinceId = provinceId;
}
public String getProvinceName() {
return provinceName;
}
public void setProvinceName(String provinceName) {
this.provinceName = provinceName;
}
//-------------------------------------
/*市所需屬性
private int cityId;
private String cityName;
public int getCityId() {
return cityId;
}
public void setCityId(int cityId) {
this.cityId = cityId;
}
public String getCityName() {
return cityName;
}
public void setCityName(String cityName) {
this.cityName = cityName;
}
*/
//------------------------------------
/*區所需屬性
private int areaId;
private String areaName;
public int getAreaId() {
return areaId;
}
public void setAreaId(int areaId) {
this.areaId = areaId;
}
public String getAreaName() {
return areaName;
}
public void setAreaName(String areaName) {
this.areaName = areaName;
}
*/
}
Over。。。。。。。。。。。。。。。。。。。。。。。。