MyBatis 持久层框架 + SpringMVC 分离了控制器、模型对象视图框架总结 一. MyBatis 环境的搭建 创建 MyBatis 的主配置文件(mybatis-config.xml):环境,事务管理,数据源 给类取别名 typeAliasespa
-
创建 MyBatis 的主配置文件(mybatis-config.xml):环境,事务管理,数据源
-
给类取别名
<typeAliases> <package name="com.ztkj.entity"/> </typeAliases>
-
配置支持懒加载
<settings> <!-- 开启或关闭延迟加载 --> <setting name="lazyLoadingEnabled" value="true"/> <!-- 支持延迟加载,在需要时加载外表,为 true 加载本表也会加载外表 --> <setting name="aggressiveLazyLoading" value="false"/> </settings>
-
创建接口以及接口的映射文件(UserMapper,UserMapper.xml)
-
接口的全路径和映射文件中 mapper 标签的 namespace 属性保持一致
-
接口的方法名和映射文件中具体的标签名(insert,select,update,delete) ID 值保持一致
-
读取
new SqlSessionFactoryBuilder().build(is)
配置文件创建 SqlSessionFactory,从而创建SqlSession.openSession()
方法 -
通过 SqlSession 来调用具体的方法
-
sqlSession.getMapper(UserMapper.class).addUser();
-
提交事务,关闭 sqlSession
- 多对一:association
- 一对多:collection
- 一对一:association
- 多对多:collection
-
正常关联查询:
<resultMap type="Student" id="studentMap"> <id property="studentId" column="student_id"/> <result property="studentName" column="student_name"/> <!-- 采用延迟加载 --> <association property="classes" column="classes_id" resultMap="classesMap"></association> </resultMap> <!-- classes 结果集映射 --> <resultMap type="Classes" id="classesMap"> <id property="classesId" column="classes_id"/> <result property="classesName" column="classes_name"/> </resultMap>
-
懒加载
<resultMap type="Student" id="studentMap"> <id property="studentId" column="student_id"/> <result property="studentName" column="student_name"/> <!-- 采用延迟加载 --> <association property="classes" column="classes_id" select="searchClassesById"></association> </resultMap>
-
只有一条 SQL 查询语句
<select id="searchStudentById" parameterType="int" resultMap="studentMap"> select * from t_student t1, t_classes t2 where t1.classes_id = t2.classes_id and student_id = #{id} </select>
-
查询学生时,有两条 SQL 语句
<select id="searchStudentById" parameterType="int" resultMap="studentMap"> select * from t_student where student_id = #{id} </select> <select id="searchClassesById" parameterType="int" resultMap="classesMap"> select * from t_classes where classes_id = #{classes.classesId} </select>
-
动态 SQL
if、where、set、forEach、trim
-
在
web.xml中
配置 SpringMVC 的中央控制器 dispatcherServlet 拦截所有匹配的请求路径,配置读取 SpringMVC 核心配置文件的路径 -
配置 SpringMVC 核心配置文件
<!-- 支持Resource autowired注解 --> <context:annotation-config/> <!--配置扫描器--> <context:component-scan base-package="com.ztkj"/> <!--配置视图解析器--> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <!--配置前缀--> <property name="prefix"> <value>/</value> </property> <!--配置后缀--> <property name="suffix"> <value>.jsp</value> </property> <!--支持 JSTL 标签--> <property name="viewClass"> <value>org.springframework.web.servlet.view.JstlView</value> </property> </bean> <!-- 配置 SpringMVC 支持 JSON 数据格式的注解 --> <mvc:annotation-driven/> <!-- 配置 SpringMVC 的拦截器 --> <mvc:interceptors> <mvc:interceptor> <!-- 代表哪些路径需要被拦截 --> <mvc:mapping path="/index/*"/> <mvc:mapping path="/login/*"/> <!-- 引用的拦截器的类 --> <bean class="com.ztkj.interceptor.MyInterceptor"></bean> </mvc:interceptor> </mvc:interceptors> <!-- 上传下载 --> <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> <!-- 上传文件大小上限,单位为字节(10MB) --> <property name="maxUploadSize"> <value>10485760</value> </property> <!-- 请求的编码格式,必须和 jSP 的 pageEncoding 属性一致,以便正确读取表单的内容,默认为ISO-8859-1 --> <property name="defaultEncoding"> <value>UTF-8</value> </property> </bean>
-
创建 Controller,UserController(创建方法method,addUser)
@Controller、@RequestMapping、@RequestParam、@ResponseBody
- DispatcherServlet:中央控制器
- HandleMapping:映射处理器
- Controller:控制器
- ViewResolver:视图解析器
- ModelAndView:模型和视图对象
- Tomcat 启动时会读取
web.xml
,加载 DispatcherServlet,并实例化中央控制器 - 客户端发送一个请求到服务器,Tomcat 会接收这个请求
- 判断请求是否符合 DispatcherServlet 的请求路径
- 若符合,则 DispatcherServlet 会调用 HandleMapping 把请求交给对应的 Controller 处理
- Controller 处理完请求之后,会返回一个 ModelAndView 对象给 DispatcherServlet
- DispatcherServlet 调用 ViewResolver 把 ModelAndView 解析成视图页面