文中出现的名词解释
1.POJO(Plain Ordinary Java Object)简单的Java对象,实际就是普通的JavaBeans。
2.IOC(Inversion Of Control)控制反转是面向对象编程中的一种设计原则,可以用来减低计算机代码之间的耦合度。
3.AOP(Aspect Oriented Programming)面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。:扩展功能不是修改原代码实现的。
4.DI(Dependency Injection)依赖注入:如:有一个类,在类里有方法(不是静态方法),传统的方法:调用类里的方法,创建类的对象,使用对象调用方法,创建对象的过程,需要 new 出来对象。Ioc 方式:对象的创建不需要使用 new,而是通过 spring 配置来实现。
MyBatis
1.原生JDBC的步骤
1)加载数据库驱动
2)创建并获取数据库链接
3)创建 jdbc statement 对象
4)设置 sql 语句
5)设置 sql 语句中的参数(使用 preparedStatement)
6)通过 statement 执行 sql 并获取结果
7)对 sql 执行结果进行解析处理
8)释放资源(resultSet、preparedstatement、connection)
2.Hibernate和MyBatis的区别
Hibernate框架是提供了全面的数据库封装机制的“全自动”ORM,即实现了 POJO 和
数据库表之间的映射,以及 SQL 的自动生成和执行。
MyBatis 只能算作是“半自动”的 ORM。其着力点,是在 POJO 类与 SQL 语
句之间映射关系。也就是说 MyBatis 并不会自动生成 SQL 语句,具体的 SQL 需要
程序员自已编写,然后通过 SQL 语句映射文件,将 SQL 所需的参数,以及返回的结果字
段映射到指定 POJO。
MyBatis执行流程
3.MyBatis引入方法
4.MyBatis映射文件(XXXMapper.xml)实例
1)根据id查询数据
#{}表示一个占位符
**#{id}:其中id表示接收输入的参数,参数名称就是id,如果输入参数是简单类型,#{ } 中的参数名可以是任意,可以value或其它名称,parameterType也可以省略不写。 **
ResultType:指定sql输出结果的所映射的java对象类型(bean实体)。
<select id="selectStuById" parameterType="int" resultType="Student">
select * from student where id=#{xxx}
</select>
2)模糊查询数据
** 表 示 拼 接 s q l 串 ∗ ∗ 通 过 {}表示拼接 sql 串** 通过 表示拼接sql串∗∗通过{}可以将 parameterType 传入的内容拼接在 sql 中且不进行 jdbc类型转换, 可 以 接 收 简 单 类 型 值 或 p o j o 属 性 值 , 如 果 p a r a m e t e r T y p e 传 输 单 个 简 单 类 型 值 , {}可以接收简单类型值或 pojo 属性值,如果 parameterType 传输单个简单类型值, 可以接收简单类型值或pojo属性值,如果parameterType传输单个简单类型值,{}括号中只能是 value。
<select id="selectGoodsLikeName" resultType="Goods">
SELECT *
FROM goods
WHERE goodsname
LIKE CONCAT(CONCAT('%', #{name}), '%');
</select>
Concat函数可以连接一个或者多个字符串,若其中一个为null,则返回null
5.Mapper动态代理
1)Mapper接口开发规范
①Mapper.xml 文件中的 namespace 与 Dao 接口的类路径相同。
②Dao 接口方法名和 Mapper.xml 中定义的每个 statement 的 id 相同
③Dao 接口方法的输入参数类型和 mapper.xml 中定义的每个 sql 的 parameterType 的类型相同
④Mapper 接口方法的输出参数类型和 mapper.xml 中定义的每个 sql 的 resultType 的类型 相同
6.动态sql实现
1)<if/>标签
对于该标签的执行,当test的值为true时,会将其包含的SQL片断拼接到其所在的 SQL语句中。
需求:查询满足用户查询条件的所有学生,用户提交的查询条件可以包含一个姓名的模糊查询,同时还可以包含一个年龄的下限。用户在提交表单时可能两个条件均做出了设定,也可能两个条件均不做设定,也可以只做其中一项设定。
<select id="selectStuByIf" resultType="Student">
select id,name,age,score
from student
where 1=1
<if test="name !=null and name!=''">
and name like '%' #{name} '%'
</if>
<if test="age>0">
and age > #{age}
</if>
</select>
2)<where/>标签
<if/>标签中存在一个比较麻烦的地方:需要在where后手工添加1=1的子句,不加的话会出错,但当数据量很大时,会严重影响查询效率。
<select id="selectStuByWhere" resultType="Student">
select id,name,age,score
from student
<where>
<if test="name !=null and name!=''">
name like '%' #{name} '%'
</if>
<if test="age>0">
and age >
#{age}
</if>
</where>
</select>
3)<choose/>标签
该标标签只可以包含<when/><otherwise/>,可以包含多个<when/>与一个 <otherwise/>,与switch…case的功能类似。
功能需求:若姓名不为空,则按照姓名查询;若姓名为空,则按照年龄查询;若没有查询
条件,则没有查询结果
<select id="selectStuByChoose" resultType="Student">
select id,name,age,score
from student
<where>
<choose>
<when test="name !=null and name!=''">
and name like '%' #{name} '%'
</when>
<when test="age>0">
and age > #{age}
</when>
<otherwise>
</otherwise>
</choose>
</where>
</select>
4.<foreach/>标签
用于实现对数组与集合的遍历
功能需求:查询出id为 4,6的学生信息
select id="selectStuByForeach" resultType="Student">
<!-- select id,name,age,score from student where id in (4,5,6) -->
select id,name,age,score
from student
<if test="array.length>0">
Where id in
<foreach collection="array" item="myid" open="(" close=")" separator=",">
#{myid}
</foreach>
</if>
</select>
5.<sql/>标签
用于定义sql片断,以便其它sql标签复用,其它标签使用该sql片断,需要使用<include/>标签。
<!--定义sql片断 -->
<sql id="sqlHead">
select *
from student
</sql>
<!--sql片断 -->
<select id="selectStuBySqlFragment" resultType="Student">
<!--使用SQL片断 -->
<include refid="sqlHead"/>
<iftest="array!=null and array.length>0">
where id in
<foreach collection="array" open="("item="myid" separator="," close=")">
#{myid}
</foreach>
</if>
</select>
7.关联查询
1)一对一
id:指定查询列中的唯一标识,用户信息的中的唯一标识,如果有多个列组成唯 一标识,配置多个id
column:用户信息表中的唯一标识列
property:用户信息表中的唯一标识列所映射到Person对象中的哪个属性
result 为查询列中的普通列,
association:用于映射关联查询单个对象的信息
javaType:映射到Card对象
2)一对多
collection:对关联查询到多条记录映射到集合对象中
property:将关联查询到多条记录映射com.neu.bean.Country哪个属性
ofType:指定映射到list集合属性中pojo的类型
3)多对多
8.延迟加载(需要再深入了解)
Mybatis 根据关联对象的查询的 select 语句的执行时机,分为三种类型:直接加载、侵入式延迟加载与深度延迟加载。
1)直接加载:执行完对主加载对象的 select 语句,马上执行对关联对象的 select 查询。
2)侵入式延迟加载:执行完对主加载对象的查询时,不会执行对关联对象的查询,当要访问主加载对象的详情时,就会执行关联对象的 select 查询。
3)深度延迟加载:执行完对主加载对象的查询时,不会执行对关联对象的查询,访问主加载对象的详情时,也不会执行关联对象的 select 查询,只有当真正访问关联对象的详情时,才会执行对关联对象的 select 查询。
延迟加载的应用要求:关联对象的查询与主加载对象的查询必须是分别进行的select 语句,不能是使用多表连接所进行的 select 查询。因为多表连接查询,会一次性将多张表的所有信息查询出来。
9.查询缓存(需要再深入了解)
查询缓存的使用,主要是为了提高查询访问速度。将用户对同一数据的重复查询过程简化,不再每次都从数据库查询获取结果数据,从而提高访问速度。
MyBatis 的查询缓存机制,根据缓存区的作用域可划分为两种:一级查询缓存与二级查询缓存。
10.逆向工程(需要再深入了解)
mybatis 官方提供逆向工程可以针对单表自动生成mybatis 执行所需要的代码(mapper.java,mapper.xml、po…)
企业实际开发中,常用的逆向工程方式:由于数据库的表生成 java 代码。
Spring框架(需要再深入了解)
Spring 核心是控制反转(IOC)和面向切面的编程(AOP), 简单来说,Spring 是一个分层的 JavaSE/EEfull-stack(一站 式) 轻量级开源框架。 降低组件之间的耦合度,实现软件各层之间的解耦。
SpringMVC框架技术
Spring Web MVC 是一种基于 Java 的实现了 Web MVC 设计模式的请求驱动类型的轻量级Web 框架,即使用了 MVC 架构模式的思想,将 web 层进行职责解耦,基于请求驱动指的就是使用请求-响应模型,框架的目的就是帮助我们简化开发,Spring Web MVC 也是要简化我们日常 Web 开发的。
1.SpringMVC中常用注解含义及用法
- @Controller:在 SpringMVC 中只需要使用这个标记一个类是 Controller,然后使用@RequestMapping 和@RequestParam 等一些注解用以定义 URL 请求和 Controller 方法之间的映射,这样的Controller 就能被外界访问到。此外,Controller 不会直接依赖于 HttpServletRequest 和HttpServletResponse 等 HttpServlet 对象,他们可以通过 Controller 的方法参数灵活的获取到。
- @RequestMapping:使用 @RequestMapping 来映射 Request 请求与处理器,通过这个注解可以定义不同的处理器映射规则,即为控制器指定可以处理哪些 URL 请求。用@RequestMapping 来映射 URL 到控制器类,或者是到 Controller 控制器的处理方法上。
- @RequestBody:用于读取 http 请求的内容(字符串),通过 springMVC 提供的 HttpMessageConverter 接口将读取到的内容转换为 json、xml 等格式的数据,再转换为 java 对象绑定到 Controller 类方法的参数上。
简单点来说,就是把 json 格式的数据转换为 java 对象。 - @ResponseBody:用于将 Controller 中方法返回的对象通过适当的 HttpMessageConverter 转换为指定格式的数据,如:json、xml 等,然后写入到 response 对象的 body 区,通过 Response 响应给客户端。需要注意的是,在使用此注解之后不会再走试图处理器,而是直接将数据写入到输入流中,他的效果等同于通过 response 对象输出指定格式的数据。返回的数据不是 html 标签的页面,而是其他某种格式的数据时(如 json、xml 等)使用。
- @ModelAttribute:在方法定义上使用该注解: SpringMVC 在调用目标处理方法前, 会先逐个调用在方法级上标注了@ModelAttribute 的方法;在方法的入参前使用该注解:可以从隐含对象中获取隐含的模型数据中获取对象,再将请求参数–绑定到对象中,再传入入参将方法入参对象添加到模型中。
- @RequestParam:处理简单类型的绑定,用 @RequestParam 绑定 HttpServletRequest 请求参数到控制器方法参数,即在处理方法入参处使用该注解,可以把请求参数传递给请求方法。
- @RequestVariable:绑定url占位符到入参。
- @ExceptionHandler:注解到方法上,出现异常时会执行该方法。
- @ControllerAdvice:使一个 Controller 成为全局的异常处理类, 类中用 ExceptinHandler方法注解的方法可以处理所有 Controller 发生的异常。
- @Autowired:它可以对类成员变量、方法以及构造函数进行标注,完成自动装配的工作。通过@Autowired 的使用来消除代码 Java 代码里面的 getter/setter 与 bean 属性中的property。当然,getter 看个人需求,如果私有属性需要对外提供的话,应当予以保留。
- @Transactional:对数据库的数据进行批量或连表操作时,为了保证数据的一致性和正确性,则需要添加事 务管理机制进行管理;当对数据库的数据操作失败时,事务管理可以很好保证所有的数据 回滚 到原来的数据,如 果操作成功,则保证所有的需要更新的数据持久化。
2.处理器方法的参数
处理方法可以包含以下五类参数,这些参数会在系统调用时由系统自动赋值,程序员可以
在方法内直接使用。
- HttpServletRequest:通过 request 对象获取请求信息
- HttpServletResponse:通过 response 处理响应信息
- HttpSession:通过 session 对象得到 session 中存放的对象
- Model/ModelMap:ModelMap 是 Model 接口的实现类,通过 Model 或 ModelMap 向页面传递数据
1)试用HttpServletRequest接受参数
@RequestMapping("/query")
public String doRequest(HttpServletRequest request, Model model) {
String data = request.getParameter("name");
model.addAttribute("msg", data);
return "/show.jsp";
}
2)使用@ModelAttribute 注解获取 POST 请求的 FORM 表单数据
@RequestMapping("/attribute")
public ModelAndView doAttribute(@ModelAttribute("stu")Student stu) {
ModelAndView mv = new ModelAndView();
mv.addObject("stu", stu);
mv.setViewName("/show.jsp");
return mv;
}
3)使用HttpSession携带参数
@Controller
@RequestMapping("/test")
public class MyController{
@RequestMapping("/register.do")
public ModelAndView register(Student student, HttpSession session){
session.setAttribute("myStudent",student);
return new ModelAndView("redirect:/show.jsp")
}
}
Jsp页面
<body>
student = $(sessionScope.myStudent)
</body>
4)利用注解RequestBody**(!!前后端分离!!)**
@RequestMapping("/request.do")
@ResponseBody
public Map<String, Object> query3(@RequestBody Student stu) {
Map<String, Object> map = new HashMap<String, Object>();
map.put("type", "RequestBody 参数");
map.put("data", stu);
return map;
}
5)HttpServletRequest之Json入参方式
通过JsonObject一个个取值
@ResponseBody
public Map<String, Object> query5(HttpServletRequest request) {
String jsonString=request.getParameter("jsonString");
JSONObject form=JSONObject. parseObject (jsonString);
Student stu=new Student();
stu.setName(form.getString("name"));
stu.setAge(form.getInteger("age"));
Map<String, Object> map = new HashMap<String, Object>();
map.put("type", "RequestBody 参数");
map.put("data", stu);
return map;
}
3.处理方法的返回值
使用@Controller 注解的处理器的处理方法,其返回值常用的四种类型:
- ModelAndView
- String
- 无返回值void
- 返回自定义类型对象
1)返回ModelAndView
若**处理器方法处理完后,需要跳转到其它资源,且又要在跳转的资源间传递数据,**此时处理方法返回 ModelAndView 比较好。当然,若要返回 ModelAndView,则处理器方法中需要定义 ModelAndView 对象。若只跳转而不传递数据,或只传递数据不向任何资源跳转(如对页面的 Ajax 请求),此时用 ModelAndView 就不太好。
2)返回String
-
返回内部资源逻辑视图名(return “admin.jsp”;)
-
返回View对象名
若要跳转的资源为外部资源,则视图解析器可以使用 BeanNameViewResolver,然后在配置文件中再定义一些外部资源视图 View 对象,此时处理器方法返回的字符串就是要跳转资源视图 View 的名称。这些视图 View 对象,可以是内部资源视图 View 对象。
3)返回void
-
通过ServletAPI传递数据并跳转
请求转发:request.getRequestDispatcher(“目标页面”).forward(request,response);
重定向:response.sendRedirect(“目标页面”); -
AJAX响应
4)返回Object
处理器方法也可以返回 Object 对象,但返回的 Object 对象不是作为逻辑视图出现,而是作为直接在页面显示的数据出现的。返回 Object 对象,需要使用@ResponseBody 注解,将转换后的 Json 数据放入到响应体中。
4.SpringMVC核心技术
1)请求转发与重定向
-
返回ModelAndView请求转发
当通过请求转发跳转到目标资源时,可以通过使用 request、session 和 ModelAndView 中的 Model 传递数据,在目标页面可以通过 EL 表达式直接访问该数据。
return new ModelAndView(“forward:/WEB-INF/jsp/show.jsp”😉 -
返回ModelAndView重定向
重定向之后,拿到不是request中的数据。
return new ModelAndView(“redirect:/show.jsp”); -
返回String的请求转发
-
返回String的重定向
前后端分离
一体式WEB架构:
前后端分离架构:
前后端分离的理解:交互形式,代码组织方式、开发模式、数据接口规范流程。
SpringMVC前后端分离
-
@RequestBody注解
@RequestBody 注解用于读取 http 请求的内容(字符串),通过 SpringMVC 提供的 HttpMessageConverter 接口将读到的内容转换为 json、xml 等格式的数据并绑定到 Controller 类方法的参数上。
-
@RequestBody注解
@ResponseBody 注解用于将 Controller 类的方法返回的对象,通过 HttpMessageConvert er 接口转换为指定格式的数据如:json、xml 等,通过 Response 响应给客户端。
SSM整合
1.定义实体bean
2.定义对应的jsp页面
3.定义dao接口
4.定义映射文件mapper.xml
5.定义service接口
6.定义service实现类impl
7.定义spring.xml
8.创建springmvc.xml
9.定义controller
踩过的坑
1.错误500
这种情况一般是jsp里的name属性跟controller或者bean里的name不是对应的。
2.上传文件
1)上传文件时要添加文件解析器,否则会出现不可预估的错误。
2)前端要在form表单里添加**enctype=“multipart/form-data”**不对字符编码。
er 类的方法返回的对象,通过 HttpMessageConvert er 接口转换为指定格式的数据如:json、xml 等,通过 Response 响应给客户端。
SSM整合
1.定义实体bean
2.定义对应的jsp页面
3.定义dao接口
4.定义映射文件mapper.xml
5.定义service接口
6.定义service实现类impl
7.定义spring.xml
8.创建springmvc.xml
9.定义controller
踩过的坑
1.错误500
这种情况一般是jsp里的name属性跟controller或者bean里的name不是对应的。
2.上传文件
1)上传文件时要添加文件解析器,否则会出现不可预估的错误。
2)前端要在form表单里添加**enctype=“multipart/form-data”**不对字符编码。