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,否则提示很多包找不到,参考

最新文章

  1. 2016 icpc-ec-final
  2. cordova常用资料源
  3. XPath的基本使用
  4. 随堂练习——Rational rose
  5. C++ Socket编程步骤 【转】
  6. boa服务器安装
  7. 【Java】IO技术的使用——用IO实现大文件的复制
  8. CodeForces 362B Petya and Staircases
  9. SVN 权限配置具体说明
  10. 咸鱼入门到放弃9--jsp中使用的JavaBean
  11. Linux基础命令1
  12. 通过JQuery的$.ajax()把 json 数据 post 给 PHP
  13. C# ACtiveMQ 收发数据
  14. vim 在行首 行尾添加字符
  15. LDA线性判别分析(转)
  16. 监测多个textFiled.text的长度同时不小于0
  17. 设计模式(23)--Visitor--访问者模式--行为型
  18. js 面试题总结 3
  19. hadoop start-all.sh报错JAVA_HOME is not set and could not be found.
  20. CentOS7开发环境搭建

热门文章

  1. Mybatis的常用配置-多表关联查询
  2. TCP/IP协议(4): 地址解析协议(ARP) —— 网络地址转换为物理地址的方式
  3. [代码审计基础 03]-RCE-fork,system,execve
  4. CCRD_TOC_2015_EULAR专刊
  5. The size of the request headers is too long.
  6. CF845F - Guards In The Storehouse
  7. 计网学习笔记二 Link Layer Service
  8. Vs出现调试问题
  9. vivado工具ila抓取的波形读取方法
  10. mysql转DM的日期函数转换