第一章 初识Spring的基本应用
1.1 Spring概述
一、什么是Spring?
Spring是分层的JavaSE/EE full-stack轻量级开源框架,以IoC(Inverse of Control 控制反转)和AOP(Aspect Oriented Programming面向切面编程)为内核,使用基本的JavaBean来完成以前只可能由EJB完成的工作,取代了EJB的臃肿、低效的开发模式。
二、项目开发的三个层次
表示层(Web)
就是将处理的结果表现出来的状态,就是一个前端的页面。在表示层提供了与SpringMVC框架的整合。
业务逻辑层(Service)
就是处理具体业务的过程。在业务逻辑层可以管理事务、记录日志等
持久层(Dao)
就是数据库的操作。在持久层可以整合MyBatis、JdbcTemplate等技术。
Spring对每一层都提供了技术支持。
三、Spring框架的体系结构
1、Spring框架采用的是分层架构,他一系列的功能要素被分为20个模块。
第一层:
(1)Core Container(核心容器)(Beans Core Context SpEL)
Beans:提供了Bean Factory(Bean 工厂),Spring将管理对象成为Bean。
Core:提供了Spring框架的基本组成部分,包括IoC和DI功能。
Context(上下文对象):建立在Core和Beans模块的基础之上,它是访问定义和配置的任何对象的媒介。
SpEL:Spring3.0后新增的模块,是运行时查询和操作对象图的强大的表达式语言。
第二层:
(2)Data Access/Integration(数据访问/集成)
JDBC:提供了一个JDBC的抽象层,大幅度的减少了在开发过程中对数据库操作的编码。
ORM:对流行的对象关系映射API,包括JPA、JDO和Hibernate提供了集成层支持。
OXM:提供了一个支持对象/XML映射的抽象层实现,如JAXB、Castor、XMLBeans、JiBX和XStream
JMS:指Java消息传递服务,包含使用和产生信息的特性,自4.1版本后支持与Spring-message模块的集成。
Transactions:支持对实现特殊接口以及所有POJO类的编程和声明式的事务管理。
(3)Web
WebSocket:Spring4.0以后新增的模块,它提供了WebSocket和SockJS的实现,以及对STOMP的支持。
Servlet:也称Spring-webmvc模块,包含Spring模型-视图-控制器(MVC)和REST Web Services实现的Web程序。
什么是MVC?
参考一下这篇文章:SSM,三层结构,MVC三者的说明及关系(很全面)_mvc是dao,daomain和service吗-CSDN博客
(搜索)什么是Servlet?
Servlet与MVC的关系,起什么作用,为什么?
Servlet 是 Java Web 应用程序的基本组件之一,用于处理客户端的请求和响应。Servlet 通常用于生成动态 Web 内容,如 HTML 页面、XML 文档、JSON 数据等。
MVC 是一种架构模式,用于将 Web 应用程序分解成三个主要组件:模型 (Model)、视图 (View) 和控制器 (Controller)。MVC 模式通过将这些组件分离来简化 Web 应用程序的开发,提高代码的可维护性和可扩展性。 在 Java Web 应用程序中,Servlet 可以用于实现 MVC 模式中的控制器 (Controller)。Servlet 可以处理客户端的请求,根据请求中的参数和数据,调用适当的模型 (Model) 处理数据,然后将处理后的数据传递给视图 (View) 进行显示。Servlet 可以充当控制器 (Controller) 的角色,根据业务逻辑决定如何响应客户端请求。
总之,Servlet 和 MVC 是密切相关的,Servlet 可以用于实现 MVC 模式中的控制器 (Controller)。使用 Servlet 实现 MVC 模式可以使 Web 应用程序更加灵活和可维护,同时也可以更好地实现业务逻辑和用户界面的分离。
(搜索)REST Web Services
REST全称是Representational State Transfer,中文意思是表述(编者注:通常译为表征)性状态转移。 它首次出现在2000年Roy Fielding的博士论文中,Roy Fielding是HTTP规范的主要编写者之一。 他在论文中提到:"我这篇文章的写作目的,就是想在符合架构原理的前提下,理解和评估以网络为基础的应用软件的架构设计,得到一个功能强、性能好、适宜通信的架构。REST指的是一组架构约束条件和原则。" 如果一个架构符合REST的约束条件和原则,我们就称它为RESTful架构。
REST本身并没有创造新的技术、组件或服务,而隐藏在RESTful背后的理念就是使用Web的现有特征和能力, 更好地使用现有Web标准中的一些准则和约束。虽然REST本身受Web技术的影响很深, 但是理论上REST架构风格并不是绑定在HTTP上,只不过目前HTTP是唯一与REST相关的实例。 所以我们这里描述的REST也是通过HTTP实现的REST。
Web:提供了基本的Web开发集成特性,如:多文件上传、使用Servlet监听器来初始化IoC容器以及Web应用上下文。
Portlet:提供了在portlet环境中使用MVC实现,类似Servlet模块的功能。
(4)其他模块
AOP:提供了面向切面编程实现,允许定义方法拦截器和切入点,将代码按照功能进行分离,以降低耦合性。
Aspects:提供了与AspectJ的集成功能,AspectJ是一个功能强大且成熟的面向切面编程(AOP)框架。
Instrumentation:提供了类工具的支持和类加载器的实现,可以在特定的应用服务器中使用。
Messaging:Spring4.0以后新增的模块,它提供了对消息传递体系结构和协议的支持。
Test:提供了对单元测试和集成测试的支持。
1.2 Spring的核心容器
Spring容器会负责控制程序之间的关系,而不是由程序代码直接控制。Spring为我们提供了两种核心容器,分别为BeanFactory和ApplicationContext。
创建Bean Factory实例时:
语法如下:
BeanFactory beanFactory= new XmlBean Factory(new FileSystemResource(“F:/applicationContext.xml”));
ApplicationContext是Bean Factory的子接口,是另一种常用的Spring核心容器。它由org.springframework.context.ApplicationContext接口定义,不仅包含了BeanFactory的所有功能,还添加了对国际化、资源访问、事件传播等方面的支持。
创建ApplicationContext接口实例
通常采用两种方法,具体如下:
(1)通过ClassPathXmlApplicationContext创建
ApplicationContext applicationContext= new ClassPathXmlApplicationContext(Spring configLocation);
(2)通过FileSystemXmlApplicationContext创建
ApplicationContext applicationContext= new FileSystemXmlApplicationContext(string configLocation);
FileSystemXmlApplicationContext会从指定的文件系统路径(绝对路径)中寻找指定的XML配置文件,找到并装载完成ApplicationContext的实例化工作。
3、(创建Bean工厂的三个方法)在Web项目中,ApplicationContext容器的实例化工作会交给Web服务器来完成。Web服务器实例化ApplicationContext容器时,通常会使用ContextLoaderListenter来实现。
4、创建Spring容器后,就可以获取Spring容器中的Bean。Spring获取Bean的实例通常采用以下两种方法:
(1)Object getBean(Spring name);
根据容器中的Bean的id或name来获取指定的Bean,获取之后需要进行强制类型转换。
(2)<T>T getBean(Class<T>requiredType);
根据类的类型来获取Bean的实例。由于此方法为泛型方法,因此在获取Bean之后不需要进行强制类型转换。
1.3 依赖注入 (9.20.2023)
1.3.1依赖注入的概念
DI的全称是Dependency Injection,中文称之为依赖注入。它与控制反转(IoC)的含义相同,只不过这两个称呼是从两个角度描述的同一个概念。
什么叫IoC?
在使用Spring框架之后,对象的实例不再由调用者来创建,而是由Spring容器来创建,Spring容器会负责控制程序之间的关系,而不是由调用者的程序代码直接控制。这样,控制权由应用代码转移到了Spring容器,控制权发生了反转,这就是控制反转。
什么叫DI?
从Spring容器的角度来看,Spring容器负责将被依赖对象赋值给调用者的成员变量,这相当于为调用者注入了它依赖的实例,这就是Spring的依赖注入。
1.4 依赖注入的实现方法
使用setter方法实现依赖注入
在com.itheima.ioc包中,创建UserService接口的实现类UserServiceImpl,在类中声明userDao属性,并添加属性的setter方法。
private UserDao userDao; public void setUserDao(UserDao userDao){ this.userDao=userDao; }
在配置文件applicationContext.xml中,创建一个id为userService的Bean,该Bean用于实例化UserServiceImpl类的信息,并将userDao的实例注入到userService中。
<bean id="userService" class="com.itheima.ioc.UserServiceImpl"> <property name="userDao" ref="userDao"/> </bean>
1.5 参数注入值的方法
使用无参构造器注入值创建对象
在ljg.com.pojo包中,创建普通类user,默认无参构造器User()。 在配置文件applicationContext.xml中,创建一个id为user的Bean,该Bean用无参构造器创建。
<bean id="user" class="ljg.com.pojo.User"> </bean>
有参构造器的下标地址创建对象
在ljg.com.pojo包中,创建普通类user,使用一、两参构造器User()。
在配置文件applicationContext.xml中,创建一个id为user的Bean,该Bean用有参构造器创建。
注入值的方式1 使用参数的下标地址,有参构造器的第一参数下标为0,第二个为1,……
注入值的方式
使用有参构造器创建对象的注入值。
(1)pojo类必须有有参构造器,下面是两参构造器 public User(Spring name,Spring age){this.name=name+age;}
(2)配置文件中使用,构造器下标地址方法
<bean id="user" class="ljg.com.pojo.User"> <constructor-arg index="0" value="中国馆"/> <constructor-arg index="1" value="30"/> </bean>
通过设置属性值来创建对象
<bean id="user4" class="lmx.com.pojo.User"> <property name="id" value="2002"/> <property name="name" value="李明明"/> <property name="sex" value="男"/> <property name="address" value="天津"/> <property name="age" value="21"/> </bean>
1.6 配置文件的详解
1、beans:bean工厂的装配车间
1)装配bean对象
2)装配bean对象的关系
3)只能装配,不能创建对象
4)它就是一个容器
2、bean:就是装配对象
id=“user1”对象的名称
class="lmx.com.pojo.User":创建对象的类
<constructor-arg index="0" value="1002"/>:注入值给对象 <property name="id" value="2002"/>:注入值给对象
3、使用别名创建对象(即小名创建对象)
-
<alias name="user4" alias="user121"/>
-
使用name属性设置多个别名
在配置文件applicationContext.xml中,创建一个id为user2的Bean,该Bean的别名用name配置多个分别是user12,user13,user14
<bean id="user8" class="lmx.com.pojo.User" name="user13,user14,user15"> <constructor-arg name="name" value="新别名"/> <constructor-arg name="id" value="13"/> </bean>
1.7 复杂的pojo类
在ljg.com.pojo中,创建复杂student学生类,包括普通属性、map、set、数组、list、对象属性等复杂的属性。并写get和set方法。
public class Student { // 1 普通属性 private Integer id; private String name; // 2 对象属性:就是其它类的对象作为我的一个属性,建立了两个类的关系 private Address address; // 3 数组作为属性:就是Arrays对象作为属性 private String[] books; // 4 list数组作为属性:就是list对象作为属性 private List<String> hobbys; // 5 map 键值对集合作为属性 private Map<String,String> card; // 6 set 集合作为属性 private Set<String> games; // 7 空值注入 private String wife; // 8 java的特殊属性 属性值注入 private Properties info; }
一个pojo类:属性+无参构造器+全参构造器+getter and setter方法+重写toString()。
第二章 Spring中的bean
2.1 Bean的装配
什么是Spring中的bean?
Bean的本质就是Java中的类,而Spring中的Bean其实就是对实体类的引用,来生产Java类对象,从而实现生产和管理Bean。
Bean是如何装配的?
XML配置文件的根元素是<beans>,<beans>中包含了多个<bean>子元素,每一个<bean>子元素定义了一个Bean,并描述了该Bean……
scope(Bean的生命周期)用来设定Bean实例的作用域,其属性有,singleton(单例)、prototype(原型)、request、global Session、application和websocket。其默认值为singleton。
2.2 Bean的实例化(Bean的创建)
Bean的实例化有哪些方式?
分别为构造器实例化、静态工厂方式实例化和实例工厂方式实例化(其中最常用的时构造器实例化)。
静态工厂方式实例化的使用
1、创建名为Bean2的Java类;
2、创建一个Java工厂类,在类中使用静态方法获取Bean2实例;
public class MyBean2Factory{ public static Bean2 createBean(){ return new Bean2(); } }
3、创建Spring配置文件bean2.xml并配置工厂类Bean;
<bean id="bean2" class="com.itheima.instance.static_factoryMyBean2Factory" factory-method="createBean"/>
4、创建测试类,测试程序
实例工厂方式实例化的使用:
-
创建名为Bean3的Java类;
-
创建一个Java工厂类,在类中使用非静态方法获取Bean3实例;
public class MyBean3Factory{ public Bean3 createBean(){ return new Bean3(); } }
-
创建Spring配置文件beans3.xml,并配置工厂类Bean;
<bean id="myBean3Factory" class="com.ithcima.instance.factory.MyBean3Factory"/> <bean id="bean3" factory-bean="myBean3Factory" factory-methon="createBean"/>
-
创建测试类,测试程序
2.3 Bean的作用域
Spring 4.3中为Bean的实例定义了7种作用域,如下表所示:
作用域名称 | 说明 |
---|---|
singleton(单例) | 使用singleton定义的Bean在Spring容器中将只有一个实例,也就是说,无论有多少个Bean牵引它,始终将指向同一个对象。这也是Spring容器默认的作用域。 |
prototype(原型) | 每次通过Spring容器获取的prototype定义的Bean时,容器都将创建一个新的Bean实例。 |
request | 在一次HTTP请求中,容器会返回该Bean的同一个实例。对不同的Http请求则会产生一个新的Bean,而且该Bean仅在当前HTTP Request内有效。 |
session | 在一次HTTP Session 中,容器会返回该Bean的同一个实例。对不同的HTTP请求则会产生一个新的Bean,而且该Bean仅在当前HTTP Session内有效。 |
globalSession | 在一个全局的HTTP Session中,容器会返回该Bean的同一个实例。仅在使用portlet上下文时有效。 |
application | 为每个ServletContext对象创建一个实例。仅在Web相关的ApplicationContext中生效。 |
websocket | 为每个websocket对象创建一个实例。仅在Web相关的ApplicationContext中生效。 |
2.4 Bean的生命周期
Spring容器可以管理Bean部分作用于的生命周期。有关说明具体如下:
Bean的生命周期管理
singleton作用域:Spring容器可以管理singleton作用域的Bean的生命周期,在此作用域下,Spring能够精确的知道该Bean何时被创建,何时初始化完成,以及何时被销毁。
prototype作用域:prototype作用域的Bean,Spring只负责创建,当容器创建了Bean实例后,Bean的实例就交给客户端代码来管理,Spring容器将不再跟踪其生命周期。
2.5 Bean的装配方式
什么是Bean的装配?
(Spring支持多种形式的Bean装配方式) 基于XML的装配、基于注解(Annotation)的装配和自动装配(其中最常用的是基于注解的装配)
基于Annotation的装配(重点)
基于XML的装配可能会导致XML配置文件过于臃肿,给后续的维护和升级带来一定的困难。为此,Spring提供了对Annotation(注解)技术的全面支持。
主要注解
@Component:用于描述Spring中的Bean,它是一个泛化的概念,仅仅表示一个组件。
@Repository:用于将数据访问层(DAO)的类表示为Spring中的Bean。
@Service:用于将业务层(Service)的类标识为Spring中的Bean。
@Controller:用于将控制层(Controller)的类标识为Spring中的Bean。
@Autowired:用于对Bean的属性变量、属性的setter方法及构造方法进行标注,按照Bean的类型自动装配。
@Resource:其作用与Autowired一样。@Resource中有两个重要属性:name和type。Spring将name属性解析为Bean实例名称,type属性解析为Bean实力类型。
@Qualifier:与@Autowired注解配合使用,会将默认的按Bean类型装配修改为Bean的实例名称装配,Bean的实例名称由@Qualifier注解的参数指定。
第三章 Spring AOP
3.1.1 Spring AOP简介
什么是AOP?
AOP的全称是Aspect-Oriented Programming,即面向切面编程(也称面向方面编程)。它是面向对象编程(OOP)的一种补充,目前已成为一种比较成熟的编程方式。
AOP的编程思想是什么?
AOP采取横向抽取机制,将分散在各个方法中的重复代码提取出来,然后在程序编译或运行时,再将这些提取出来的代码应用到需要执行的地方。这种采取横向抽取机制的方式,采用传统的OOP思想显然是无法办到的,因为OOP只能实现父子关系的纵向的重用。虽然AOP是一种新的编程思想,但却不是OOP的替代品,它只是OOP的延伸和补充。
类与切面的关系:
AOP的术语:
-
切面Aspect:封装的用于横向插入的系统功能(如事物、日志等)的类
-
连接点Joinpoint:在程序执行过程中的某个阶段点
-
切入点Pointcut:切面与程序流程的交叉点,即那些需要处理的连接点
-
Advice(通知/增强处理):AOP框架在特定的切入点执行的增强处理,即在定义好的切入点处所要执行的程序代码。可以将其理解为切面类中的方法。
-
Target Object(目标对象):指所有被通知的对象,也被称为被增强的对象。如果AOP框架采用的是动态的AOP实现,那么该对象就是一个被代理的对象。
-
Proxy(代理):将通知应用到目标对象之后,被动态创建的对象。
-
Weaving(织入):将切面代码插入到目标对象上,从而生成代理对象的过程。
3.2 什么是代理?
1、代理是一种编程思想和编程模式;
2、代理的分类:静态代理、动态代理;
3、代理的结构图:以租房为例说明。
静态代理的角色分析:
静态代理可以抽象为四种角色,如下:
(1)抽象的角色:用一个使用接口或抽象类实现(租房接口)
(2)真实的角色:被代理的对象(房东)
(3)代理角色:代理真实角色,代理真实角色后,一般会做一些附属的操作
(4)客户:访问代理对象的人
静态代理的深入理解:
3.2.1 JDK动态代理
JDK动态代理是通过java.lang.reflect.Proxy类来实现的,我们可以调用Proxy类的newProxyInstance()方法来创建代理对象。对于使用业务接口的类,Spring默认会使用JDK动态代理来实现AOP。 (书110)
3.2.2 CGLIB代理
CGLIB(Code Generation Library)是一个高性能开源的代码生成包,它采用非常底层的字节码技术,对指定的目标类生成一个子类,并对子类进行增强。 案例如下:
查询:百度查询两个代理
3.3 基于代理类的AOP实现
3.3.1 Spring的通知类型
Spring按照通知在目标类方法的连接点位置,可以分为5种类型,具体如下: org.springframework.aop.MethodBeforeAdvice(前置通知) 在目标方法执行前实施增强,可以应用于权限管理等功能。 org.springframework.aop.AfterReturningAdvice(后置通知) 在目标方法执行后实施增强,可以应用于关闭流、上传文件、删除临时文件等功能。 org.aopalliance.intercept.MethodInterceptor(环绕通知) 在目标方法执行前后实施增强,可以应用于日志、事务管理等功能。 org.springframework.aop.ThrowsAdvice(异常抛出通知) 在方法抛出异常后实施增强,可以应用于处理异常记录日志等功能。 org.springframework.aop.IntroductionInterceptor(引介通知) 在目标类中添加一些新的方法和属性,可以应用于修改老版本程序。 (英文:Method 方法)
3.3.2 ProxyFactoryBean
ProxyFactoryBean是FactoryBean接口的实现类,FactoryBean负责实例化一个Bean,而ProxyFactoryBean负责为其它Bean创建代理实例。在Spring种,使用ProxyFactoryBean是创建AOP代理的基本方式。
3.4 AspectJ开发
AspectJ是一个基于Java语言的AOP框架,它提供了强大的AOP功能。Spring AOP引入了对AspectJ的支持,并允许直接使用AspectJ进行编程。 使用AspectJ实现AOP有两种方式:一种是基于XML的声明式AspectJ,另一种是基于注解的声明式AspectJ。
3.4.1 基于XML的声明式Aspect
基于XML的声明式AspectJ是指通过XML文件来定义切面、切入点及通知,所有的切面、切入点和通知都必须定义在<aop:config>元素内。
<aop:config>元素及其子元素如下:
注:灰色部分标注的元素为常用的配置元素。
XML文件中常用元素的配置方式如下:
1.配置切面
在Spring的配置文件中,配置切面使用的是<aop:aspect>元素,该元素会将一个已定义好的Spring Bean转换成切面Bean,所以要在配置文件中先定义一个普通的Spring Bean。
配置<aop:aspect>元素时,通常会指定id和ref两个属性。
2.配置切入点
当<aop:pointcut>元素作为<aop:config>元素的子元素定义时,表示该切入点是全局切入点,它可被多个切面所共享;当<aop:pointcut>元素作为<aop:aspect>元素的子元素时,表示该切入点只对当前切面有效。
在定义<aop:pointcut>元素时,通常会指定id和expression两个属性。
切入点表达式:(重要)
Execution(* com.itheima.jdk..(..))是定义的切入点表达式,该切入点表达式的意思是匹配com.ithrima.jdk包中任意类的任意方法的执行。
第一个 * 代表的是:返回类型,使用 * 代表所有类型。 com.itheima,jdk代表的是:需要拦截的包名。 第二个 * 代表的是:类名,使用 * 代表所有类。 第三个 * 代表的是:方法名,使用 * 代表所有方法。 (..)代表的是:方法的参数,其中的“..”表示任意参数。
(必须有一个空格)
3.配置通知
使用<aop:aspect>的子元素可以配置5种常用通知,这5个子元素不支持使用子元素,但在使用时可以指定一些属性,其常用属性及其描述如下:
3.4.2 基于注解的声明式AspectJ
AspectJ框架为AOP的实现提供了一套注解,用以取代Spring配置文件中为实现AOP功能所配置的臃肿代码。AspectJ的注解及其描述如下所示:
第四章 MyBatis基础入门
4.1 什么是MyBatis
MyBatis框架也被称之为ORM(Object/Relation Mapping,即对象关系映射)框架。所谓的额ORM就是一种为了解决面向对象与关系型数据库中数据类型不匹配的技术,它通过描述java对象与数据库表之间的映射关系,自动将java应用程序中的对象持久化到关系型数据库的表中。
4.2 持久化与数据持久层
1、持久化
就是把数据保存到可掉电式存储设备中供之后使用。
2、三层结构
三层结构就是为了符合“高内聚,低耦合”思想,把各个功能模块划分为表示层 (UI) 、业务逻辑层 (BLL) 和数据访问层(DAL) 三层架构,各层之间采用接口相互访问,并通过对象模型的实体类(Model) 作为数据传递的载体,不同的对象模型的实体类一般对应于数据库的不同表,实体类的属性与数据库表的字段名一致。
一个最常用的扩展就是将三层体系扩展为五层体系,即表示层(Presentation)、控制/中介层(Controller/Mediator)、领域层(Domain)、数据持久层(Data Presentation)和数据源层(Data Source)。
第五章 配置文件解析
5.1 配置核心文件 mybatis-config.xml
说明:必须按照这个顺序配置,否则错误
5.2 核心配置文件的作用
MyBatis的配置文件包含了影响MyBatis行为的设置和属性信息。
5.3 环境配置
5.3.1 格式设置
<environments default="development"> <environment id="development"> <transactionManager type="JDBC"> <property name="..." value="..."/> </transactionManager> <dataSource type="POOLED"> <property name="driver" value="${driver}"/> <property name="url" value="${url}"/> <property name="username" value="${username}"/> <property name="password" value="${password}"/> </dataSource> </environment></environments>
说明:
(1)environments default="development"
默认使用哪个环境
(2)environment id="development"
环境配置 ID指定环境名称
(3)transactionManager type="JDBC"
事务管理类型 JDBC
(4)<dataSource type="POOLED">
数据源配置,默认为POOLED,其他的为cp30数据库连接池等
(5)
<property name="driver" value="${driver}"/>
驱动程序配置
<property name="url" value="${url}"/>
数据库URL
<property name="username" value="${username}"/>
用户名
<property name="password" value="${password}"/>
密码
5.3.2 配置案例
类型别名(typeAliases)
类型别名可为Java类型设置一个缩写名字。他仅用于XML配置,意在降低冗余的全限定类名书写。
格式一: 配置类名 ,一个类配置一个别名
<typeAliases> <typeAlias type="lmx.com.pojo.User" alias="User"/> </typeAliases>
第六章 分页技术
6.1 一、 使用limt语句的分页技术 语句格式
格式1
select * from jwgl.user limit startIndex,pagesize
说明 :
startIndex :起始下标:指定从哪个下标地址开始,数据表的第一记录的下标为0,依此类推。
pagesize : 每次查询的记录数,就是一页上显示几条记录,实现分页。
格式2
Select * from jwgl.user limit 0,2;
说明 0:从就一个记录开始,2 每页显示2个记录
格式3
Select * from jwgl.user limit 5;
相当于
Select * from jwgl.user limit 0,5;
说明:一页上显示的最大数据5个记录。
6.2 使用Mybatis分页技术的三部曲——案例1 使用sql语句的分页技术
动态sql
注解版的动态sql