基于mybatis实现省市县三级联动

需求:省市县首先只展示出来省,用户选择省份后,出现对应的市,选择城市后,展示对应的县/区

分析:

1.界面上首先展示出省,可以用监听器初始化数据就获得对应的省份

2.点击省份获得市对应的可以用异步传输即ajax

3.只有当用户选择才会将数据传回后端调用数据,否则不发出申请

初始化数据:InitializeListener

import java.util.List;

import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener;

import com.oracle.pojo.Provinces;
import com.oracle.service.ProvincesService;

import jdk.nashorn.internal.ir.RuntimeNode.Request;
@WebListener
public class InitializeListener  implements ServletContextListener{
    @Override
    public void contextInitialized(ServletContextEvent sce) {
        ServletContext servletContext = sce.getServletContext();
        servletContext.setAttribute("root",servletContext.getContextPath());
        servletContext.setAttribute("js",servletContext.getContextPath()+"/js");
        //调用所有的
        ProvincesService ps=new ProvincesService();
        List<Provinces> proList = ps.findAllProvinces();
        //数据保存在servletContext中
        servletContext.setAttribute("proList",proList);
       
    }

    @Override
    public void contextDestroyed(ServletContextEvent sce) {
       
    }
}

index.jsp界面

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>  
<!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>三级联动</title>
<script type="text/javascript" src="${js}/jquery.min.js"></script>
<script type="text/javascript">

	
	$(function () {
		$("#city").change(function () {
			var cityid=$("#city").val();
			if(cityid==0){
				return;
			}else{
				alert(cityid);
				
				var url="${root}/addressCity";
				$.ajax({
					type:'get',
					url:url,
					data:{"cityid":cityid},
					dataType:"json",
					success:function (data){
						console.log(data.length)
						var result = "<option >请选择县/区</option>";
	                   
	                    for(var i=0;i<data.length;i++){
	                    	result +="<option value='"+data[i].areaid+"'>"+data[i].area+"</option>";
	              
	                    }
	                    $("#areas").html('');
	                    $("#areas").append(result);

					},
					
				})
			}
			
		})
	
	
	$("#provinces").change(function () {
			var provinceid=$("#provinces").val();
			if(provinceid==0){
				return;
			}else{
				alert(provinceid);
				var url="${root}/address";
				$.ajax({
					type:"get",
					url:url,
					data:{"provinceid":provinceid},
					dataType:"json",
					success:function (data){
						//console.log(data.length);
						var result = "<option value='0'>请选择城市</option>";
	                   for(var i=0;i<data.length;i++){
	                    	result +="<option value='"+data[i].cityid+"'>"+data[i].city+"</option>"; 
	                    	
	                    } 
	                    $("#city").html('');
	                    $("#city").append(result);

					},
					
			})
			}
			
	})
	})
</script>
</head>
<body>
<form action="${root}/address" method="post">

省份:<select name="provinces" id="provinces" >
	<option value="0">请选择省份</option>
	<c:forEach items="${proList}" var="pro">
	<option value="${pro.provinceid}">${pro.province}</option>
	</c:forEach>
</select>

城市<select id="city" name="city">
<option value="0">请选择城市</option>

</select>
县/区<select id="areas" name="areas">
<option value="0">请选择县/区</option>

</select>
</form>
</body>
</html>

AddressCityServlet.java

@WebServlet(urlPatterns="/address")
public class AddressServlet extends HttpServlet{

	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		doGet(req, resp);
	}
	
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		//获得前端页面的provinceid
		String provinceid = req.getParameter("provinceid");
		//调用方法
		CitiesService cs=new CitiesService();
		List<Cities> citiesList = cs.findCitiesByProvinceid(provinceid);
		System.out.println("citiesList"+citiesList);
		JSONArray jsonArray=JSONArray.fromObject(citiesList);
		resp.setCharacterEncoding("utf-8");
		PrintWriter out=resp.getWriter();
		out.print(jsonArray);
		out.flush();
		out.close();
	}

AddressCityServlet.java

@WebServlet(urlPatterns="/addressCity")
public class AddressCityServlet extends HttpServlet{

	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		doGet(req, resp);
	}
	
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		//获得城市Id
		String cityid = req.getParameter("cityid");
		//调用方法
		AreasService as=new AreasService();
		List<Areas> areaList = as.findAreaAllBycityid(cityid);
		System.out.println("areaList"+areaList);
		JSONArray jsonArray = JSONArray.fromObject(areaList);
		//以响应的形式传递给前端页面
        PrintWriter out = resp.getWriter();
        out.println( jsonArray );
        out.flush();
        out.close();
	}
}

service层和mapper层代码就不写啦,是很常见的方法,希望会有所帮助,如果发现错误的地方欢迎指出

MyBatis可以很方便地实现省市三级查询。首先,你需要在数据库中创建相应的表,包括省份表、城市表和区表,它们之间通过外键关联。然后,你可以使用MyBatis提供的映射文件和动态SQL来实现查询操作。 以下是一个简单的示例: 1. 创建省份表(province): ```sql CREATE TABLE province ( id INT PRIMARY KEY, name VARCHAR(50) ); ``` 2. 创建城市表(city): ```sql CREATE TABLE city ( id INT PRIMARY KEY, name VARCHAR(50), province_id INT, FOREIGN KEY (province_id) REFERENCES province(id) ); ``` 3. 创建区表(district): ```sql CREATE TABLE district ( id INT PRIMARY KEY, name VARCHAR(50), city_id INT, FOREIGN KEY (city_id) REFERENCES city(id) ); ``` 4. 在MyBatis的映射文件中定义查询语句,例如`mapper.xml`: ```xml <!-- 查询所有省份 --> <select id="getAllProvinces" resultType="Province"> SELECT * FROM province </select> <!-- 根据省份ID查询城市 --> <select id="getCitiesByProvinceId" resultType="City"> SELECT * FROM city WHERE province_id = #{provinceId} </select> <!-- 根据城市ID查询区 --> <select id="getDistrictsByCityId" resultType="District"> SELECT * FROM district WHERE city_id = #{cityId} </select> ``` 5. 创建对应的Java实体类(Province、City、District),并在MyBatis的映射文件中配置它们的映射关系。 6. 在Java代码中调用MyBatis进行查询操作,例如: ```java List<Province> provinces = sqlSession.selectList("getAllProvinces"); for (Province province : provinces) { List<City> cities = sqlSession.selectList("getCitiesByProvinceId", province.getId()); for (City city : cities) { List<District> districts = sqlSession.selectList("getDistrictsByCityId", city.getId()); // 处理区数据 } } ``` 这样就可以通过MyBatis实现省市三级查询了。当然,这只是一个简单的示例,实际使用中还需要根据具体业务需求进行适当的调整和优化。希望对你有所帮助!如有其他问题,请继续提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值