SSM学习笔记 自己整理了超久的

文中出现的名词解释

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 传输单个简单类型值, pojoparameterType{}括号中只能是 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”**不对字符编码。

  • 1
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Java SSM(Spring+SpringMVC+MyBatis)是一种基于Java语言的Web开发框架。学习这个框架的过程中,我深刻体会到它的强大和灵活性。 首先,Spring框架为开发者提供了一个强大的IOC(Inversion of Control)容器,它能够管理和注入对象,减少了代码之间的耦合性。通过配置文件或注解,我们可以轻松地定义和获取各种对象,提高了代码的可维护性和可扩展性。 其次,SpringMVC框架是一种MVC(Model-View-Controller)设计模式的实现,它用于处理Web请求和响应。通过配置一个请求映射表和处理器,我们可以将请求分发给相应的控制器进行处理,并将处理结果返回给客户端。SpringMVC还提供了一些便捷的注解和标签,用于简化页面的渲染和参数的绑定。 最后,MyBatis是一种优秀的持久化框架,它能够将数据库操作与Java对象之间的映射简化为简单的配置。通过编写SQL映射文件和定义POJO(Plain Old Java Object)类,我们可以方便地进行数据库的增删改查操作,而无需编写冗长的SQL语句。 在学习Java SSM框架的过程中,我深入理解了软件开发过程中的MVC思想,并学会了如何利用Spring、SpringMVC和MyBatis来实现一个完整的Web应用程序。通过不断的实践和调试,我逐渐培养了自己解决问题和调试代码的能力。 总结起来,学习Java SSM框架使我深入理解了软件开发的各个环节,并提升了我的编码能力和开发效率。我相信这些知识和经验将对我的职业发展和项目实施起到积极的促进作用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值