网站如何做百度才会收录,云南手机网站建设,安徽太基建设官方网站,热度网络网站建设Mybatis学习-day19
1. resultMap
resultMap 是 MyBatis 中最复杂的元素#xff0c;主要用于解决实体类属性名与数据库表中字段名不一致的情况#xff0c;可以将查询结果映射成实体对象。
resultMap idstaffAndDep typecom.easy.bean.Staff主要用于解决实体类属性名与数据库表中字段名不一致的情况可以将查询结果映射成实体对象。
resultMap idstaffAndDep typecom.easy.bean.Staffassociation columndep_id selectgetStaffDep propertydep/association
/resultMap
select idgetStaffDep resultTypecom.easy.bean.Departmentselect * from department where id #{dep_id};
/select
!--一对一或一对多查询需要指定映射方式 resultMap--
select idgetStaffAndDep resultMapstaffAndDepselect * from staff
/select这段代码展示了在MyBatis中如何使用resultMap来处理一对一的关联查询。在这个例子中Staff员工和Department部门之间存在一对一的关系即每个员工属于一个部门。这里使用了resultMap和association标签来定义这种关系并通过一个嵌套的查询即N1查询问题的一个实例来获取员工及其对应的部门信息。
resultMap idstaffAndDep: 这是resultMap的唯一标识符用于在select标签中引用。typecom.easy.bean.Staff: 指定了结果映射到的Java类型这里是Staff类。 association columndep_id: 指定了Staff表中用于连接Department表的列名这里是dep_id即员工的部门ID。selectgetStaffDep: 这是一个嵌套查询的引用表示MyBatis将执行getStaffDep这个select查询来获取与dep_id对应的Department信息。propertydep: 指定了Staff类中用于存放获取到的Department对象的属性名这里是dep。 getStaffDep查询 resultTypecom.easy.bean.Department: 指定了查询结果应该映射到的Java类型这里是Department类。查询语句select * from department where id #{dep_id};这是一个简单的SQL查询根据传入的dep_id从department表中检索对应的部门信息。 getStaffAndDep查询 使用resultMapstaffAndDep指定了结果应该按照staffAndDep这个resultMap的规则来映射。查询语句select * from staff从staff表中选择所有列但需要注意的是由于使用了resultMap和嵌套查询MyBatis实际上会根据dep_id对每个员工执行额外的查询来获取其部门信息。
2. 动态SQL
动态 SQL 只有几个基本元素与 JSTL 或 XML 文本处理器相似十分简单明了大量的判断都可以在 MyBatis 的映射 XML 文件里配置以达到许多需要大量代码才能实现的功能。
动态 SQL 大大减少了编写代码的工作量更体现了 MyBatis 的灵活性、高度可配置性和可维护性。 使用如下所示
MyBatis 中动态语句 choose-when-otherwise 类似于 Java 中的 switch-case-default 语句。由于 MyBatis 并没有为 if 提供对应的 else 标签如果想要达到if…else…/else /if 的效果可以借助 choose、when、otherwise 来实现。
select idgetStaffBySalary resultTypecom.easy.bean.Staffselect * from staffwhere/*参数名 salarytext*/choosewhen testsalarytext 低salary lt; 8000/whenwhen testsalarytext 中salary gt; 8000 and salary lt; 12000/whenotherwisesalary gt; 12000/otherwise/choose/where
/selectupdate ideditStaffItemupdate staffsetif testname ! null and name ! name #{name},/ifif testsalary ! nullsalary #{salary},/if/setwhereid #{id}/where
/updateforeach循环
insert idaddListinsert into staff(code, name, salary, username, userpass)valuesforeach collectionlist itemitem separator,(#{item.code}, #{item.name}, #{item.salary}, #{item.username}, #{item.userpass})/foreach
/insert3. MyBatis缓存
3.1 一级缓存
MyBatis 提供了一级缓存和二级缓存的支持。默认情况下MyBatis 只开启一级缓存
一级缓存是基于 PerpetualCacheMyBatis自带的 HashMap 本地缓存作用范围为 SQLession 域内。当 session flush刷新或者 close关闭之后该 session 中所有的 cache缓存就会被清空。
在参数和 SQL 完全一样的情况下我们使用同一个 SqlSession 对象调用同一个 mapper 的方法往往只执行一次 SQL。因为使用 SqlSession 第一次查询后MyBatis 会将其放在缓存中再次查询时如果没有刷新并且缓存没有超时的情况下SqlSession 会取出当前缓存的数据而不会再次发送 SQL 到数据库。
由于 SqlSession 是相互隔离的所以如果你使用不同的 SqlSession 对象即使调用相同的 Mapper、参数和方法MyBatis 还是会再次发送 SQL 到数据库执行返回结果。
3.2 二级缓存
二级缓存是全局缓存作用域超出 SQLsession 范围之外可以被所有 SqlSession 共享。手动开启
cache evictionFIFO flushInterval60000 size512 readOnlytrue /4. 其他
4.1 标准的sql执行顺序
FROM — ON — (LEFT/RIGHT) JOIN — WHERE (BETWEEN…AND…/IN) — GROUP BY — HAVING — SELECT — DISTINCT — ORDER BY (ASC/DESC) — LIMIT
4.2 JSP九大内置对象
request,response,session,application,page,pageContext,config,out,exception
1、request对象 request 对象是 javax.servlet.httpServletRequest类型的对象。 该对象代表了客户端的请求信息主要用于接受通过HTTP协议传送到服务器的数据。包括头信息、系统信息、请求方式以及请求参数等。request对象的作用域为一次请求。
2、response对象 response 代表的是对客户端的响应主要是将JSP容器处理过的对象传回到客户端。response对象也具有作用域它只在JSP页面内有效。
3、session对象 session 对象是由服务器自动创建的与用户请求相关的对象。服务器为每个用户都生成一个session对象用于保存该用户的信息跟踪用户的操作状态。session对象内部使用Map类来保存数据因此保存数据的格式为 “Key/value”。 session对象的value可以使复杂的对象类型而不仅仅局限于字符串类型。
4、application对象 application 对象可将信息保存在服务器中直到服务器关闭否则application对象中保存的信息会在整个应用中都有效。与session对象相比application对象生命周期更长类似于系统的“全局变量”。
5、out 对象 out 对象用于在Web浏览器内输出信息并且管理应用服务器上的输出缓冲区。在使用 out 对象输出数据时可以对数据缓冲区进行操作及时清除缓冲区中的残余数据为其他的输出让出缓冲空间。待数据输出完毕后要及时关闭输出流。
6、pageContext 对象 pageContext 对象的作用是取得任何范围的参数通过它可以获取 JSP页面的out、request、reponse、session、application 等对象。pageContext对象的创建和初始化都是由容器来完成的在JSP页面中可以直接使用 pageContext对象。
7、config 对象 config 对象的主要作用是取得服务器的配置信息。通过 pageConext对象的 getServletConfig() 方法可以获取一个config对象。当一个Servlet 初始化时容器把某些信息通过 config对象传递给这个 Servlet。 开发者可以在web.xml 文件中为应用程序环境中的Servlet程序和JSP页面提供初始化参数。
8、page 对象 page 对象代表JSP本身只有在JSP页面内才是合法的。 page隐含对象本质上包含当前 Servlet接口引用的变量类似于Java编程中的 this 指针。
9、exception 对象 exception 对象的作用是显示异常信息只有在包含 isErrorPage“true” 的页面中才可以被使用在一般的JSP页面中使用该对象将无法编译JSP文件。excepation对象和Java的所有对象一样都具有系统提供的继承结构。exception 对象几乎定义了所有异常情况。在Java程序中可以使用try/catch关键字来处理异常情况 如果在JSP页面中出现没有捕获到的异常就会生成 exception 对象并把 exception 对象传送到在page指令中设定的错误页面中然后在错误页面中处理相应的 exception 对象。
4.3 delete与truncate的区别
1- 功能不同delete用于删除表中的记录truncate删除表再重建
2- 影响自增delete自增不会重置truncate会重置
3- 事务支持delete可以回滚truncate不能回滚
4- 效率delete慢truncate快
4.4 请求转发与重定向的区别
1- 发生位置请求转发发生在服务器内部是服务器行为重定向是服务器指挥浏览器发生在浏览器中。
2- 请求次数请求转发只有一次请求重定向要发送两次请求。
3- 浏览器地址请求转发浏览器地址不变重定向浏览器会指向重定向后的地址。
4- 请求对象请求转发多页面共享一对request和response可以使用request共享数据重定向每次请求创建不同的request和response不能使用request共享数据。
5- 范围请求转发只能在当前项目内进行跳转重定向可以跨站跳转
4.5 Get与Post请求的区别
1 Get请求参数会使用?和拼接到url上。Post请求参数放在请求体的Form Data数据域中。
2 Get请求参数必须是字符串。Post请求参数除了可以传递字符串类型的也可以传递二进制。
3 Get请求参数的长度会受到url长度的限制。Post请求参数长度不会受到客户端浏览器的限制只要服务器允许。
Get与Post请求的区别
1 Get请求参数会使用?和拼接到url上。Post请求参数放在请求体的Form Data数据域中。
2 Get请求参数必须是字符串。Post请求参数除了可以传递字符串类型的也可以传递二进制。
3 Get请求参数的长度会受到url长度的限制。Post请求参数长度不会受到客户端浏览器的限制只要服务器允许。
4 Get安全性低。Post相对安全。