Java中的MVC

M是指模型层,C则是控制器,V是指视图;一个完整的请求过程是,客户端发送请求到控制器,控制器调用业务层处理请求,并返回处理结果给视图,其中业务层是调用Dao层去完成业务逻辑的;

Model层分为:

Entity层:实体层,每一个JavaBean类对应数据库中的一张表,实体类包含私有属性、getter和setter方法;

DAO层:数据访问层(也叫数据持久层),封装了表的增删改查操作;

Controler层(Servlet):控制层 ,前台的请求会发送到这里,控制层调用Service层处理客户请求,并返回处理结果(Html页面、JSON等);

Service层:业务逻辑层,调用各个DAO层,完成所需的业务逻辑,该层可以理解为把控制层中的业务处理过程拿出来,作为一个独立的部分;

View层: 视图层,负责前台页面的展示;

Mybatis框架(DAO层):

开发步骤:创建:Bean实体类  =>  创建:Dao接口  =>  创建:Mapper 映射文件

映射文件:
1)、sql中插入变量使用:#{变量名};

2)、mapper元素:
resultMap(标签):描述SQL查询结果集与Bean对象的映射关系,一般用于解决Bean属性名与表列名不一致的情况;参考
cache:配置给定命名空间的缓存;
insert、delete、update、select:增、删、改、查

3)、mapper属性:
resultType:SQL查询返回的类型 - Bean类型;
resultMap(属性):SQL查询返回的类型 - 标签resultMap的id值,当Bean属性名与表列名不一致、或者一对一、一对多时,需要启用resultMap;
parameterType:给映射器传递参数,有三种方式:使用Map传递参数、使用注解传递参数、使用JavaBean传递参数(常用); 参考
表列名的类型(jdbcType) 跟 实体类属性的类型(javaType)之间的 对应关系:参考 - 类型处理器

<mapper namespace="cn.mybatis.mapper.UserMapper"> //namespace:指定命名空间,跟Dao接口类一致

<resultMap id="UserResultMap" type="User"> //type:指定对应的Bean类
<id column="user_id" jdbcType="INTEGER" property="id" /> //id:用于表示哪个列是主键; column:对应表列名; jdbcType:数据库类型;  
<result column="user_name" jdbcType="VARCHAR" property="name" /> //result:描述Bean属性名 和 表列名的对应关系;
<result column="user_pass" jdbcType="VARCHAR" property="password" javaType="String"/> //property:Bean的属性名; javaType:Bean属性的java类型,通常不配置,mybatis能自动识别;
</resultMap>

<!--查询-->
<select id="getUserByName" resultType="User"> //id:跟Dao接口类的方法名一致; resultType:省略了完整包名,如果application.yml中type-aliases-package指定了包,则resultType就不用写完整包名;
select * from user where user_name = #{userName}
</select>   <!-- 添加 -->
  <insert id="addUser" parameterType="User">  //使用JavaBean传递参数   </insert> </mapper>

关联查询:
步骤1:在<select>标签中建立联合查询语句;
步骤2:在<resultMap>标签中使用 <association>(一对一)和 <collection>(一对多)标签;

//一对一 示例:
<mapper namespace="cn.mybatis.mapper.UserMapper"> <resultMap id="UserResultMap-one" type="User">
   <id column="user_id" jdbcType="INTEGER" property="id" />
   <result column="user_name" jdbcType="VARCHAR" property="name" />
   <result column="user_password" jdbcType="VARCHAR" property="password"/> <!-- 建立一对一关系:user和userinfo是一对一关系 -->
<association property="userInfo" javaType="cn.mybatis.beans.UserInfo">
<id column="userinfo_id" property="id" />
<result column="user_age" property="age" />
       <result colum="user_weight" property="weight" />
</association> </resultMap> <!-- 一对一关联查询 -->
<select id="getUserInfo" resultMap="UserResultMap-one"> //此时使用resultMap,而不是resultType
select user.*,  userinfo.id as userinfo_id,  userinfo.user_age
     from user, userinfo
     where user.id=userinfo.user_id and user.id = #{id}
</select> </mapper>
//一对多 示例:
<mapper namespace="cn.mybatis.mapper.UserMapper"> <resultMap id="UserResultMap-more" type="User">
   <id column="user_id" jdbcType="INTEGER" property="id" />
   <result column="user_name" jdbcType="VARCHAR" property="name" />
   <result column="user_password" jdbcType="VARCHAR" property="password"/> <!-- 建立一对多关系:user和order(订单)是一对多关系 -->
<collection property="orderlist" javaType="ArrayList" ofType="cn.mybatis.beans.Order"> //ofType:用于一对多查询中,表示集合中的元素类型
<id column="id" property="id" />
<result column="order_num" property="odernum" />
</collection> </resultMap> <!-- 一对多关联查询 -->
<select id="getOrders" resultMap="UserResultMap-more"> //此时使用resultMap,而不是resultType
select user.*, order.ordernum
     from user, order
     where user.id=order.user_id and user.id = #{id}
</select> </mapper>

Spring框架(Controler层):

要点:

1、控制反转IoC和依赖注入DI来管理 javabean

什么是Bean?

  一个可重用的组件,满足要求:所有属性为private、私有属性提供public的getter和setter方法、有一个无参构造;

什么是控制反转IoC?

  原本是我们new一个对象,现在交给Spring的IoC容器创建和管理;

什么是依赖注入DI?

  在编程思想为控制反转IoC的前提下,对象所依赖的关系,是通过外部注入的方式实现:setter注入、构造注入

定义Bean的配置文件:xxx.xml

<!-- setter注入 -->
<bean id = "" class = "" lazy-init = "true" init-method = "初始化方法" destroy-method = "销毁方法" scope = "作用域" autowire = "自动装配" factory-method = "使用一个工厂方法获取自己的类对象">
  <!-- 属性 -->
  <property name = "name" value = "hello" />

  <!-- 内部bean -->
  <property name = "name">
  <bean id = "name" class = "com.Name"/>
  </property>

  <!-- 注入集合 list -->
  <property name = "name">
  <list>
    <value>Jack</value>
    <value>Tom</value>
    <ref bean = "age" /> //注入Bean引用
  </list>
  </property>

  <!-- 注入集合 map -->
  <property name = "name">
  <map>
    <entry key = "1" value = "Jack"/>
    <entry key = "2" value = "Tom"/>
    <entry key = "3"  value-ref = "age"/> //注入Bean引用
  </map>
  </property>

</bean>

  <!-- 构造注入 -->
  <bean id = "" class = "">
    <constructor-arg ref = "age" />
    <constructor-arg value = "hello"/>
  </bean>
  <bean id = "age" class = "come.Age"> </bean>

 

scope作用域:singleton(默认)、prototype(每次都new)、request、session、global-session

自动装配:no(默认)、byName(由属性名称自动装配,通过setter注入)、byType(由属性类型自动装配,通过setter注入)、constructor(由属性类型自动装配,使用参数最多的构造函数)

代码获取bean:

      ApplicationContext context = new ClassPathXmlApplicationContext("xxx.xml"); //加载配置文件
MyClass obj = (MyClass) context.getBean("myclass"); //获取bean

2、面向切面编程AOP参考1
说明:切面=通知+切点,使用切面编程,首先定义一个切面类,然后在切面类中定义通知和切点;
常用注解:
@Aspect:声明一个类是一个切面类;
@Pointcut:定义切点
通知:
@Before:在目标方法调用之前调用通知
@After:在目标方法完成之后调用通知
@Around:在被通知的方法调用之前和调用之后执行自定义的方法;
@AfterReturning:在目标方法成功执行之后调用通知;
@AfterThrowing:在目标方法抛出异常之后调用通知

3、SpringMVC框架 解决Web开发

SpringBoot整合框架

定义:它是一个快速开发框架,通过用Maven管理依赖关系,帮助我们快速整合第三方常用框架(Spring+SpringMVC+Mybatis或Hibernate或JDBC ),完全采用注解化,简化XML配置,内置HTTP服务器(Tomcat,Jetty),最终以Java应用程序进行执行。

常用注解:

@SpringBootApplication:
@Controller:标记为控制器,返回视图名
@RestController:标记为控制器,只能返回json数据
@Service:标记为service类
@Mapper:标记为映射组件
@MapperScan("com.example.mapper"):标注哪个包为映射
@Repository:标记为数据访问组件,即DAO组件
@Component:泛指各种组件 @RequestMapping("/hello"); @RequestMapping( value="/hello/{id}", method = RequestMethod.GET );// 匹配url
@GetMapping("/hello");@PostMapping("/hello"); //匹配get和post请求url的简写
@Autowired:自动装配,默认按类型byType装配
@Resource:自动装配,默认按名称byName装配
@PostConstruct:标记为bean的初始化方法
@PreDestroy:标记为bean的销毁方法
@Slf4j:在类的开头加入该注解,可在代码中log.info()打印日志;除此之外,常用的日志注解还有:@Log、@CommonsLog;参考
@Override:重载方法
@Transactional(rollbackFor=Exception.class) //标注在类或方法上,遇到异常Exception时回滚。 @Param:给参数重新命名,给Mapper.xml的sql获取,egg:public void test(@Param("userName") String name);
@PathVariable:从url里获取参数,比如获取www.abc.com?name=111的name,一般配合@RequestMapping("item/{name}")使用
@RequestParam:将请求参数映射到方法的参数上,语法:@RequestParam(value="参数名",required="是否必传:true/false",defaultValue="默认值")
@CookieValue:绑定Cookie数据值(将Cookie数据映射到方法的参数上);
@RequestHeader:绑定请求头数据(将请求头的数据映射到方法的参数上);
@ModelAttribute:绑定请求参数到命令对象;
@ResponseBody:将方法的返回值以json或xml格式返回给客户端。 实体类:
@Data:标记为实体类,从而无需再写get,set,toString方法
@Entity(name="表名称") :标记为实体类,可指定表名,一般跟@Data一起使用;
@Id :主键
@GeneratedValue:主键生成策略
@Column : 映射表对应的字段名
@Transient : 表示该属性不是表字段的映射
@Enumerated: 直接映射枚举类型的字段 @EqualsAndHashCode:标注在实体类上,自动实现equals方法和hashcode方法

Apache Shiro框架的权限注解:
@RequiresPermissions("权限标识");@RequiresPermissions({"权限标识一","权限标识二"}):验证权限,只有拥有该权限标识才能调用方法;
@RequiresRoles("角色名"):验证角色,只有拥有该角色才能调用方法;
@RequiresAuthentication:验证登录,只有登录的用户才能调用方法;

案例:

SpringBoot+MyBatis:

https://blog.csdn.net/iku5200/article/details/82856621/

https://blog.csdn.net/CaBCo/article/details/121952023

SpringCloud:
说明:它是一款微服务管理系统,什么是微服务,在传统的单体架构中,我们把所有的功能都写在一起,随着业务的增长,耦合度越来越高,整个单体架构越来越臃肿,而微服务就是把单体架构做一个拆分,形成一种分布式架构,而SpringCloud就是对各个微服务进行统一管理。
举例:我们开发一个商城,采用单体架构,会把所有功能都写在一起,如果采用微服务开发,会把注册、商品、订单、用户中心等,做成一个个单独的微服务,所有微服务之间采用SpringCloud进行统一管理。

Spring Cloud 提供了几个常用组件,帮助我们管理微服务:
1)Eureka:服务治理组件,包含服务注册与发现;
2)Hystrix:容错管理组件,实现了熔断器;
3)Ribbon:负责服务调用时的负载均衡;
4)Feign:基于Ribbon和Hystrix的声明式服务调用组件;
5)Zuul:网关组件,提供智能路由、访问过滤等功能;
6)Config:对服务配置文件统一管理;

java安全框架 - Apache Shiro:认证(登录)、授权(权限管理)、加密、会话管理     参考
核心组件: Subject、SecurityManage、Realm 

swagger框架:通过注解方式,自动生成接口文档  参考1  参考2

若依系统
1、安装(使用idea 2021.2):

1)、下载Ruoyi(弹性布局)版本,解压到Ruoyi目录,使用idea打开该目录;
2)、找到ruoyi-admin下的application.yml,修改Http端口port为8001;
3)、新建数据库ruoyi,把Ruoyi\sql目录下的quartz.sql、ry_20210924.sql数据库文件导入,找到ruoyi-admin下的application-druid.yml,修改数据库、账号、密码;
4)、点击idea的Run,成功后,打开http://localhost:8001/login 登录后台;

2、生成代码的部署:
1)、在数据库新建表Test,在后台系统管理-菜单管理中,新建菜单“测试”,菜单类型选择“目录”;
2)、在后台系统工具-代码生成中,导入Test表,点击编辑,修改生成信息:包路径:com.ruoyi.Test、模块名:Test、上级菜单:测试,保存并生成代码;
3)、把生成的代码解压出来,把解压的main目录,直接复制到ruoyi-admin\src下,跟ruoyi-admin\src下的main目录合并;把解压的sql文件,导入到ruoyi数据库中;
4)、重启运行,在后台的测试菜单中,就能看到Test的增删改查了;
备注,代码的部署有俩种方式,第一种最简单的就是,把生成的代码直接复制到ruoyi-admin模块下(同上),参考;第二种方式,是作为一个独立的模块,部署起来有点复杂,还有,当把代码复制到新模块时,还要重启一次idea,否则提示很多包找不到,参考

JAVA框架知识的更多相关文章

  1. 一点记忆—— Java框架知识的学习有感

    一点记忆—— Java框架知识的学习有感         说一下自己学习的框架知识的历程吧:好久了,应该是一年前,也就是大三上的时候,我对于基本的 Java编程就已经达到所谓的“熟练”,认为自己可以在 ...

  2. Java基础知识强化之集合框架笔记76:ConcurrentHashMap之 ConcurrentHashMap简介

    1. ConcurrentHashMap简介: ConcurrentHashMap是一个线程安全的Hash Table,它的主要功能是提供了一组和Hashtable功能相同但是线程安全的方法.Conc ...

  3. 学习Spring必学的Java基础知识(1)----反射(转)

    引述要学习Spring框架的技术内幕,必须事先掌握一些基本的Java知识,正所谓"登高必自卑,涉远必自迩".以下几项Java知识和Spring框架息息相关,不可不学(我将通过一个系 ...

  4. 学习Spring必学的Java基础知识(1)----反射

    引述要学习Spring框架的技术内幕,必须事先掌握一些基本的Java知识,正所谓"登高必自卑,涉远必自迩".以下几项Java知识和Spring框架息息相关,不可不学(我将通过一个系 ...

  5. Java基础知识回顾之七 ----- 总结篇

    前言 在之前Java基础知识回顾中,我们回顾了基础数据类型.修饰符和String.三大特性.集合.多线程和IO.本篇文章则对之前学过的知识进行总结.除了简单的复习之外,还会增加一些相应的理解. 基础数 ...

  6. Java基础知识总结(超级经典)

    Java基础知识总结(超级经典) 写代码: 1,明确需求.我要做什么? 2,分析思路.我要怎么做?1,2,3. 3,确定步骤.每一个思路部分用到哪些语句,方法,和对象. 4,代码实现.用具体的java ...

  7. 毕向东—Java基础知识总结(超级经典)

    Java基础知识总结(超级经典) 写代码: 1,明确需求.我要做什么? 2,分析思路.我要怎么做?1,2,3. 3,确定步骤.每一个思路部分用到哪些语句,方法,和对象. 4,代码实现.用具体的java ...

  8. 7 个最佳的 Java 框架

    毫无疑问,Java是目前最需要的编程语言之一.在这里,我们已经挖掘了一些关于框架趋势的有用信息,以减轻全球软件开发人员的日常工作. 根据RebelLabs,也是在线Java用户组(虚拟JUG)的媒体盟 ...

  9. 沉淀,再出发:Java基础知识汇总

    沉淀,再出发:Java基础知识汇总 一.前言 不管走得多远,基础知识是最重要的,这些知识就是建造一座座高楼大厦的基石和钢筋水泥.对于Java这门包含了编程方方面面的语言,有着太多的基础知识了,从最初的 ...

  10. java基础知识精华

    转载:https://www.jianshu.com/p/6c078abb720f java基础知识 java内存模型 java运行时数据区域 hashMap 如何解决冲突 存储方式 冲突达到一定数量 ...

随机推荐

  1. Python中的魔术方法大全

    魔术方法 一种特殊的方法而已 特点 不需要人工调用,在特定时刻自动触发执行 魔术方法种类 1.__init__初始化方法******* 触发时机:实例化对象之后触发作用:为对象添加对象的所属成员参数: ...

  2. 了解舵机以及MG996R的控制方法

    了解舵机以及MG996R的控制方法 1.舵机基础知识: 舵机是遥控航空.航天模型控制动作,改变方向的重要组成部件,舵机是一种位置(角度)伺服的驱动器. 舵机主要适用于那些需要角度不断变化并可以保持的控 ...

  3. 随时代变迁而进化的治疗策略不断提高RA无药缓解机会[EULAR2015_SAT0058]

    随时代变迁而进化的治疗策略不断提高RA无药缓解机会 SAT0058 DMARD-FREE SUSTAINED REMISSION IN RHEUMATOID ARTHRITIS: AN OUTCOME ...

  4. Jenkins安装(Docker)版

    一.jenkins安装 1.查找,下载jenkins镜像文件 启动docker,查找Jenkins镜像文件 docker search jenkins 下载Jenkins镜像文件 docker pul ...

  5. vue路由中pdfjs插件使用及找不到 viewer.html解决

    官方下载: https://mozilla.github.io/pdf.js/getting_started/#download 同目录下pdfjs-2.12.313-dist.zip为官方下载包 此 ...

  6. Echarts —自定义label标签的样式(formatter,rich,添加图标等操作)

    最近公司项目中在使用 Echarts 绘制图表时,由于默认的 label 标签不能满足设计稿需求,所以研究了对 label标签进行格式化的方案,了解到可以使用 formatter 内容格式器对标签内容 ...

  7. 在Github的fork项目中切换分支来提交PR

    在Github的fork项目中切换分支来提交PR 查看远程所有分支 git branch不带参数,列出本地已经存在的分支,并且在当前分支的前面用*标记,加上-a参数可以查看所有分支列表,包括本地和远程 ...

  8. LeetCode-1610 可见点的最大数目

    来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/maximum-number-of-visible-points 题目描述 给你一个点数组 poi ...

  9. 问题集锦 ~ MySQL

    # 在存储过程中,变量赋值失败 declare parent text; select parent into Parent where id = 1; select Parent; 查询的字段不能和 ...

  10. Windows打开代理快捷方式

    最近使用电脑需要频繁打开关闭网络代理(全局代理会导致一些网站打不开),在想有没有快捷方式,一搜果然有,看来有跟我一样的使用习惯的人. 传统切换代理开关,步骤如下: 设置 => 网络和 Inter ...