静态Web站点:每次访问返回页面相同,客户端与服务器端不能交互
动态Web应用:无数据库
每次请求客户端可以输入一些参数,服务器接收后,返回不同的页面。
动态Web应用:有数据库
多数Web应用都使用数据库存储数据
HTTP协议
1.协议部分
该URL的协议部分为http:,表示网页用的是HTTP协议,后面的//为分隔符
2.域名部分
域名是www.fishbay.cn,发送请求时,需要向DNS服务器解析IP。如果为了优化请求,可以直接用IP作为域名部分使用
3.端口部分
域名后面的80表示端口,和域名之间用:分隔,端口不是一个URL的必须的部分。如果端口是80,也可以省略不写
HTTP请求方法
GET方法:不提交大量数据,无敏感、保密数据时使用
超级链接访问,默认是GET方法
form提交,不指定method,默认为GET方法
form提交,制定method=“GET”,很少用这种方式
POST方法:需要提交敏感、保密数据,或数据量较大
form提交,指定method=“POST”
MyBatis特性
1) MyBatis 是支持定制化 SQL、存储过程以及高级映射的优秀的持久层框架
2) MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集
3) MyBatis可以使用简单的XML或注解用于配置和原始映射,将接口和Java的POJO(Plain Old Java Objects,普通的Java对象)映射成数据库中的记录
4) MyBatis 是一个 半自动的ORM(Object Relation Mapping)框架
MyBatis执行流程
1、读取 Mybatis的全局配置文件 mybatis-config.xml
2、创建 SqlSessionFactory会话工厂
3、创建 SqlSession会话
4、通过SqlSession对话得到代理对象
5、调用对象的增删改查方法
6、提交事务
7、关闭会话
增:当我们插入一条记录,并需要将插入成功的记录信息传递给后面的操作时,则需要考虑返回插入成功记录的主键
删:对接口 测试方法
改:测试类中添加测试方法
查:1)增加无参构造器
- 删除StudentMapper.xml中查询的数据库字段sid,
- 保证mapper.xml中查询的数据库字段属性的类型要和有参构造器的字段类型匹配;
- 查询字段的个数要和有参构造器个数一样
ThreadLocal 的作用:解决多线程的数据安全问题。
sqlSession.commit();提交事务
sqlSession.rollback();事务回滚
自动映射
NONE - 禁用自动映射。仅对手动映射的属性进行映射。(不实用)
PARTIAL - 对除在内部定义了嵌套结果映射(也就是连接的属性)以外的属性进行映射
FULL - 自动映射所有属性。(有风险、慎用)
默认值是 PARTIAL
子查询——association嵌套 Select 查询:通过执行另外一个 SQL 映射语句来加载期望的复杂类型
关联(association)元素处理“有一个”对象的情况,有两种使用方式:
嵌套 Select 查询:通过执行另外一个 SQL 映射语句来加载期望的复杂类型。
可能出现”N+1”问题
嵌套结果映射:使用嵌套的结果映射来处理连接结果的重复子集。
结果映射作为子元素嵌套在内
仅能使用一次
外部结果映射元素来映射关联
可重复使用
MyBatis 可以推断 javaType 属性,因此并不需要填写。所以很多时候你可以简略
多对一
使用select 指定字段的形式,当前需要哪些字段,则查询哪些字段
多对多
Mapper.xml文件中也没有中间表的对应标签描述,是在查询语句中使用中间表来进行关联
映射处理
动态 SQL 是 MyBatis 的强大特性之一。使用动态 SQL 并非一件易事,但借助可用于任何 SQL 映射语句中的强大的动态 SQL 语言,MyBatis 显著地提升了这一特性的易用性
If:#{}中的参数名需要写入参对象中的属性名
minAge 、maxAge设置属性为基本数据类型int
Where:只会在子元素返回任何内容的情况下才插入 “WHERE” 子句。
而且,若子句的开头为 “AND” 或 “OR”,where 元素也会将它们去除
Trim:用于去掉或添加标签中的内容
choose、when、 otherwise相当于if...else if..else
foreach 元素的功能非常强大
使用批量更新,需要设置mysql支持批量操作(默认不支持)
sql片段,可以记录一段公共sql片段,在使用的地方通过include标签进行引入
每个SqlSession单独分配的缓存内存
查询sql语句相同,第一次从数据库获取数据,第二次从缓存中获取数据
查询sql语句相同,第一次从数据库获取数据,第二次仍从数据库中获取数据
第一次从数据库获取数据后清空sqlsession缓存,则一级缓存失效,第二次仍从数据库中查询数据。
二级缓存是SqlSessionFactory级别,通过同一个SqlSessionFactory创建的SqlSession查询的结果会被缓存;此后若再次执行相同的查询语句,结果就会从缓存中获取
延迟加载——如果在MyBatis开启了延迟加载,在执行了子查询(至少查询两次及以上)时,默认只执行第一次查询,当用到子查询的查询结果时,才会触发子查询的执行;如果无需使用子查询结果,则子查询不会执行
正向工程:
先创建Java实体类,由框架负责根据实体类生成数据库表。
逆向工程:
先创建数据库表,由框架负责根据数据库表,反向生成如下资源:
Java实体类
Mapper接口
Mapper映射文件
逆向工程缺点:
生成的代码模板化--生成一大堆没有用的代码
生成的代码的格式规范不合法
生成很多的无用的代码或者方法
生成字段的类型有问题
生成的代码只能进行单表操作--无法进行连表查询
逆向工程的优点:
快速搭建model层的项目结构
快速生成表格对应的实体类,mapper接口,mapper文件
生成标准的sql片段和sql语句的模板
使用JSTL标签循环遍历从request作用域中拿出的List集合bookInfos,并用EL表达式将值输出到前端页面
limit N : 返回 N 条记录,相当于limit 0,5
offset M : 跳过 M 条记录, 默认 M=0, 单独使用似乎不起作用
limit N,M : 相当于 limit M offset N , 从第 N 条记录开始, 返回 M 条记录
currentPage(当前页),pageSize(每页记录数)
totalPage(总页数)
pageList(当前页面封装的数据集合)
导入jar包
在mybatis的主配置文件mybatis-config.xml中通过plugins标签进行配置
}