单选(10题)/10
1.mybatis当中的注解声明(@Param 那些可以做,可以传哪些属性……)
@Param注解的作用是给参数命名,参数命名后就能根据名字得到参数值,正确的将参数传入sql语句中
@Param注解单一属性
@Update({"update user set name=#{name}}") #更新user表的用户名
void updateUser(@Param("name"))
@Param注解多个属性
@Update({"update user set name=#{name}} where id=#{id}") #更新user表的用户名
void updateUser(@Param("name"),@Param("id"))
使用@Param时注意的问题
- 当用@Param注解来声明参数时,使用#{}或者${}都可以
- 当不使用@Param注解时,必须使用#{},否则会报错
不使用@Param注解时,参数只能有一个,并且是Javabean。在SQL语句里可以引用JavaBean的属性,而且只能引用JavaBean的属性。
@Select("SELECT * from Table where id = ${id}") //// 这里id是user的属性
Enchashment selectUserById(User user);
2.mybatis当中的事务管理
Mybatis中的事务管理方式有两种:
1、JDBC的事务管理机制,即使用JDBC事务管理机制进行事务管理
2、MANAGED的事务管理机制,Mybatis没有实现对事务的管理,而是通过容器来实现对事务的管理
MyBatis单独使用时,使用SqlSession来处理事务
Spring集成后,使用Spring的事务管理
一个使用MyBatis-Spring的主要原因是它允许MyBatis参与到Spring的事务管理中,而不是给MyBatis创建一个新的特定的事务管理器,MyBatis-Spring利用了存在于Spring中的DataSourceTransactionManager。
3.sqlsessionfactory sqlsessionbuilder sqlsession 的概念
SqlSessionFactory
是MyBatis的关键对象,它是个单个数据库映射关系经过编译后的内存镜像.
SqlSessionFactory对象的实例可以通过SqlSessionFactoryBuilder对象类获得,而SqlSessionFactoryBuilder则可以从XML配置文件或一个预先定制的Configuration的实例构建出SqlSessionFactory的实例.
每一个MyBatis的应用程序都以一个SqlSessionFactory对象的实例为核心.同时SqlSessionFactory也是线程安全的,SqlSessionFactory一旦被创建,应该在应用执行期间都存在.
在应用运行期间不要重复创建多次,建议使用单例模式.SqlSessionFactory是创建SqlSession的工厂。
spring和mybaits整合之后的配置文件,一般以这种方式实现SqlSessionFactory的创建:
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"></property>
<!-- 自动扫描mapping.xml文件 -->
<property name="mapperLocations" value="classpath:com/cn/mapper/*.xml"></property>
</bean>
SqlSessionFactoryBuilder
这个类可以被实例化、使用和丢弃,一旦创建了 SqlSessionFactory,就不再需要它了。
因此 SqlSessionFactoryBuilder 实例的最佳作用域是方法作用域(也就是局部方法变量)。
可以重用 SqlSessionFactoryBuilder 来创建多个 SqlSessionFactory 实例,但最好还是不要让其一直存在以保证所有的 XML 解析资源开放给更重要的事情。
这个类的主要作用就是创建一个SqlSessionFactory,通过输入mybatis配置文件的字节流或者字符流,生成XMLConfigBuilder,XMLConfigBuilder创建一个Configuration,Configuration这个类中包含了mybatis的配置的一切信息,mybatis进行的所有操作都需要根据Configuration中的信息来进行。
SqlSession
是MyBatis的关键对象,是执行持久化操作的独享,类似于JDBC中的Connection.
它是应用程序与持久层之间执行交互操作的一个单线程对象,也是MyBatis执行持久化操作的关键对象.
SqlSession对象完全包含以数据库为背景的所有执行SQL操作的方法,它的底层封装了JDBC连接,可以用SqlSession实例来直接执行被映射的SQL语句.
每个线程都应该有它自己的SqlSession实例.
SqlSession其实不是能进行数据库操作的,是它的实现类调用底层的Executor,底层的Executor再调度相关数据库操作对象才实现的,
SqlSession的实例不能被共享,同时SqlSession也是线程不安全的,绝对不能讲SqlSeesion实例的引用放在一个类的静态字段甚至是实例字段中.也绝不能将SqlSession实例的引用放在任何类型的管理范围中,比如Servlet当中的HttpSession对象中.使用完SqlSeesion之后关闭Session很重要,应该确保使用finally块来关闭它
//确保 SqlSession 关闭的标准模式:
SqlSession session = sqlSessionFactory.openSession();
try {
// do work
} finally {
session.close();
}
问题:【单选题】关于SqlSessionFactory下列说法不正确的是 (D)
A. SqlSessionFactory是线程安全的。
B. SqlSessionFactory一旦创建,在整个应用执行期间都会存在。
C. SqlSessionFactory的主要作用是创建SqlSession
D. SqlSessionFactory对象可以通过 new SqlSessionFactory()创建。
问题:【多选题】以下有关 SqlSessionFactory 的说法正确的是(A B C D)
A. SqlSessionFactory 是 MyBatis 框架中十分重要的对象,其主要作用是创建 SqlSession
B. SqlSessionFactory 对象的实例可以通过 SqlSessionFactoryBuilder 对象来构建
C. SqlSessionFactory 对象是线程安全的,它一旦被创建,在整个应用执行期间都会存在
D. 通常每一个数据库都会只对应一个 SqlSessionFactory ,所以在构建 SqlSessionFactory 实例时,建议使用单列模式
问题:而SqlSessionFactoryBuilder则可以通过()或一个预先定义好的()构建出SqlSessionFactory的实例。
答案:XML配置文件; Configuration实例
【单选题】下列关于SqlSession的说法正确的是(C )。
A. SqlSession是线程安全的
B. SqlSession可以通通过 new Sqlsession() 创建。
C. SqlSession主要作用是执行持久化操作
D. SqlSession使用完毕,无需把它关闭。
【多选题】以下有关 SqlSession 的说明正确的是(A B C D)
A. SqlSession 是 MyBatis 框架中另一个重要的对象,其主要作用是执行持久化操作
B. 每一个线程都应该有一个自己的 SqlSession 实例,并且该实例是不能被共享的
C. SqlSession 实例也是线程不安全的,因此其使用范围最好在一次请求或一个方法中
D. 使用完 SqlSession 对象之后,要及时的关闭它,通常可以将其放在 finally 块中关闭
4.springmvc当中的四大组件 - 拼写,概念,作用
DispatchServlet: 前端控制器
Servlet分发器,整个SPringMVC框架入口<br /> 用户请求到达前端控制器,它就相当于mvc模式中的c,dispatcherServlet是整个流程控制的中心,<br /> 由它调用其它组件处理用户的请求,dispatcherServlet的存在降低了组件之间的耦合性。<br /> *请求入口,前端控制器,接收所有请求(在**web.xml**文件中配置)<br />![image.png](https://cdn.nlark.com/yuque/0/2020/png/471756/1607142806262-9e20e917-206e-41a0-9c22-185a7600872d.png#align=left&display=inline&height=350&margin=%5Bobject%20Object%5D&name=image.png&originHeight=526&originWidth=830&size=159706&status=done&style=none&width=553)<br />
HandlerMapping: 处理器映射器
HandlerMapping负责根据用户请求找到Handler即处理器<br /> 寻找URL所请求的HandlerMethod,找@RequestMapping()<br /> springmvc提供了不同的映射器实现不同的映射方式,例如:配置文件方式,实现接口方式,注解方式等<br /> 使用实现类DefaultAnnotationHandlerMapping实现<br />请求派发,负责请求和控制器建立一一对应的关系,解析请求格式,判断希望要执行哪个具体的方法。<br />(在springmvc.xml [SpringMVC的核心配置文件]文件中配置)<br />![image.png](https://cdn.nlark.com/yuque/0/2020/png/471756/1607142906236-820ef1c8-5f6b-4dd4-a1ea-5f7143f4c83e.png#align=left&display=inline&height=163&margin=%5Bobject%20Object%5D&name=image.png&originHeight=250&originWidth=830&size=92521&status=done&style=none&width=540)
HandlerAdapter: 处理器适配器
实际调用HandlerMethod的组件.<br /> 通过HandlerAdapter对处理器进行执行,这是适配器模式的应用,通过扩展适配器可以对更多类型的处理器进行执行,使用实现类AnnotationMethodHandlerAdapter <br /> 负责调用具体的方法,定位到具体的Controller。<br />![image.png](https://cdn.nlark.com/yuque/0/2020/png/471756/1607142971055-a30391e0-e497-4475-8274-7a36bea6fabe.png#align=left&display=inline&height=85&margin=%5Bobject%20Object%5D&name=image.png&originHeight=124&originWidth=830&size=34992&status=done&style=none&width=569)
ViewResovler: 视图解析器
作用解析HandlerMethod返回值.把逻辑视图转换为需要调用的物理视图.<br /> 自定义视图:InternalResourceViewResolver<br /> 负责将处理结果生成View视图,ViewResolver首先根据逻辑视图名解析成物理视图名即具体的页面地址,再生成View视图对象,最后对View进行渲染将处理结果通过页面展示给用户。<br /> springmvc框架提供了很多的View视图类型,包括:jstlView、freemarkerView、pdfView等<br />视图解析器,解析结果,准备跳转到具体的物理视图。<br />![image.png](https://cdn.nlark.com/yuque/0/2020/png/471756/1607143052321-92f0bc3c-ef5e-4486-ade5-ce77c5963e04.png#align=left&display=inline&height=99&margin=%5Bobject%20Object%5D&name=image.png&originHeight=168&originWidth=796&size=66351&status=done&style=none&width=471)
Handler: 处理器
Handler 是继DispatcherServlet前端控制器的后端控制器,<br /> 在DispatcherServlet的控制下Handler对具体的用户请求进行处理。<br /> 由于Handler涉及到具体的用户业务请求,所以一般情况需要程序员根据业务需求开发Handler<br />1.1.1DispatcherServlet:前端控制器,主要的作用:接受所有的请求(来自HTTP的请求)<br /> 该控制器被定义在web.xml文件中<br />1.1.2HandlerMapping:请求解析控制器, 主要的作用:判断交给那个具体的执行业务控制类<br />1.1.3HandlerAdapter:调用具体的执行业务控制类中的执行方法<br />1.1.4ViewResovler:视图解析器,解析执行的结果(包括数据的显示和相应的跳转操作)<br />【判断题】DispatchServlet收到请求后,寻找一个或多个HandlerMapping,找到处理请求的Controller,并把请求交给Controller(√)<br />5.xx控制器是下面哪一个(即拼写,同4)
6.脏读、幻读、不可重复读,串行的区别(事务)
- 脏读
发生在一个事务A读取了被另一个事务B修改,但是还未提交的数据。假如B回退,则事务A读取的是无效的数据。这跟不可重复读类似,但是第二个事务不需要执行提交。 不可重复读的重点是修改: 同样的条件, 你读取过的数据, 再次读取出来发现值不一样了。
A事务读取B事务尚未提交的数据并在此基础上操作,而B事务执行回滚,那么A读取到的数据就是脏数据。
解决办法:如果在第一个事务提交前,任何其他事务不可读取其修改过的值,则可以避免该问题。
- 不可重复读
指在一个事务内根据同一个条件对行记录进行多次查询,但是搜出来的结果却不一致。发生不可重复读的原因是在多次搜索期间查询条件覆盖的数据被其他事务修改了。
一个事务对同一行数据重复读取两次,但是却得到了不同的结果。事务T1读取某一数据后,事务T2对其做了修改,当事务T1再次读该数据时得到与前一次不同的值。
解决办法:如果只有在修改事务完全提交之后才可以读取数据,则可以避免该问题。
- 幻读
发生在当两个完全相同的查询执行时,第二次查询所返回的结果集跟第一个查询不相同。幻读的重点在于新增或者删除 (数据条数变化)。同样的条件, 第1次和第2次读出来的记录数不一样。
解决办法:如果在操作事务完成数据处理之前,任何其他事务都不可以添加新数据,则可避免该问题。
- 串行
7.事务的隔离级别有哪些,代码当中怎么配
1、读未提交(Read Uncommitted): 会导致脏读、不可重读读、幻读问题。
2、读已提交(Read Committed): 会导致不可重读读、幻读问题(PostgreSQL数据库默认的隔离级别)。
3、可重复度(Repeatable Read): 会导致幻读问题(Mysql数据库默认的数据库隔离级别)。
4、串行化(Serialized):不存在任何问题,但是这个效率非常低,同一时刻只能有一个用户可以操作数据库,只有这个用户操作完了,其他的用户才能进行操作。
8.springmvc当中的四种跳转
第一种———请求转发页面
<!--第一种跳转方式:请求转发页面-->
<a href="${pageContext.request.contextPath}/admin/one.action">请求转发</a><br>
第二种——-请求转发action
第三种———重定向页面
第四种———重定向action
参考
9.mybatis当中的注解(一共有多少个)
MyBatis 主要提供了以下CRUD注解:@Select @Insert @Update @Delete
Mybatis主要提供这些映射注解:
@Results 用于填写结果集的多个字段的映射关系.
@Result 用于填写结果集的单个字段的映射关系.
@ResultMap 根据ID关联XML里面
例如下面的list方法,我们可以在查询SQL的基础上,指定返回的结果集的映射关系,
其中property表示实体对象的属性名,column表示对应的数据库字段名。
10.mybatis当中的多表操作(一对一,一对多声明用哪个标记)
有哪里不同
填空(5题)/10
1.mybatis中的资源文件声明和注解声明的区别
只要使用了注解开发,但是在配置文件路径下同时包含了UserDao.xml的配置,此时不管用不用,都会报错。(我们选择了注解开发的时候,就不能在同一个dao中选择xml开发)
2.动态标签(有哪几个,属性是啥)*批量插入
Mybatis动态sql可以在Xml映射文件内,以标签的形式编写动态sql,执行原理是根据表达式的值 完成逻辑判断 并动态拼接sql的功能。
Mybatis提供了9种动态sql标签:trim | where | set | foreach | if | choose | when | otherwise | bind。
- if
- where
- where 元素只会在至少有一个子元素的条件返回 SQL 子句的情况下才去插入“WHERE”子句。并且,若语句的开头为 AND 或OR,where 元素也会将它们去除。还可以通过 trim 标签去自定义这种处理规则
trim
| 属性 | 描述 | | —- | —- | | prefix | 拼接前缀 | | suffix | 拼接后缀 | | prefixOverrides | 去除前缀 | | suffixOverrides | 去除后缀 |set
作用: 1.生成set子句,如果set子句中没有内容,此时不生成set子句
2.去掉最后一个逗号
foreach | 属性 | 描述 | | —- | —- | | index | 下标 | | item | 每个元素名称 | | open | 该语句以什么开始 | | close | 该语句以什么结尾 | | separator | 在每次迭代之间以什么作为分隔符 | | collection | 参数类型 |
choose
1.只有一个条件的成立,其他的都不成立
2.必须和where连用<br /> 3.choose、when、otherwise: 组合使用,选择多个条件中的一个
bind
- sql
定义一个sql的片段,重复的使用(与include联用)
- include
参考
批量插入:
Insert into teacher values(default,5,’张三1’,16,’男’),(),(),()….. |
---|
<!-- foreache的批量插入操作 -->
<insert id="insertForeach" parameterType="list" >
Insert into teacher values
<trim suffixOverrides=",">
<foreach collection="list" item="it" >
(default,#{tid},#{tname},#{age},#{sex}),
</foreach>
</trim>
</insert>
3.springmvc当中的json访问(跳转时怎么声明json)
4.springmvc获取客户端的参数(7选1)声明方式
5.mybatis中select可以设置两种返回值类型
【resultType】->无需自定义的返回类型和简单数据类型
【resultMap】->多表/逻辑返回时的返回值
简答(3题)/30
1.${} #{}的区别
答:(mybatis笔记3)
{}是预编译处理,$ {}是字符串替换。
- mybatis在处理#{}时,会将sql中的#{}替换为?号, 当传递的参数是一个对象的时候 ,#{属性名}中填写的是参数对象中的属性名。#{} 可以有效的防止SQL注入,提高系统安全性。
{}获取参数的内容 ,使用的是下标的方式,从0开始。如果传递的参数是一个基本的数据类型,对#{}中的内容没有硬性要求
- mybatis在处理 $ { } 时,就是把 ${ } 替换成变量的值。${内容} :寻找get/set方法,${数字} :就是显示该数字
- ${} 表示的是字符串的拼接 ,代表的是 “+”。
2.springmvc重定向和转发从书写到概念应用上的区别
请求转发也称为服务器内跳转,浏览器发出一次请求,获取一次响应;重定向也称为服务器外跳转,浏览器发出2次请求,获取2次请求;
请求转发浏览器地址栏未发生变化,仍是第1次发出的请求;重定向浏览器地址栏发生变化,是第2次发出的请求;
请求转发在请求转发目录可以将请求转发到WEB-INF目录下的资源,而重定向不可以;
重定向与请求转发之间最大的区别在于,请求转发让服务器完成工作,而重定向让浏览器完成工作。
- 转发是服务器行为,重定向是客户端行为。
- 转发HTTP请求一次,地址栏不发生变化,请求域数据不会丢失
重定向HTTP请求至少两次,地址栏发生变化显示新的地址,请求域信息丢失。
3.springmvc当中的resultmapping可以怎么写
(1)将请求参数绑定到控制器的方法参数上。
@RequestMapping(method = RequestMapping.GET)
(2)方法参数被绑定了HTTP请求体的值,可以用GET、POST方式提交
@RequestMapping(path = "/something", method = RequestMethod.PUT)
(3)组合@ResponseBody,方法的返回值被直接写回到HTTP响应体中去
@RequestMapping(path = "/something", method = RequestMethod.PUT)
@ResponseBody
4.@ResponseBody 写在哪?—声明json的
5.springmvc和mybatis整合的步骤
第一步:整合dao层
mybatis和spring整合,通过spring管理mapper接口。
使用mapper的扫描器自动扫描mapper接口在spring中进行注册。
第二步:整合service层
通过spring管理 service接口。
使用配置方式将service接口配置在spring配置文件中。
实现事务控制。
第三步:整合springmvc
由于springmvc是spring的模块,不需要整合。
上机(1)【1.5h】
springmvc+mybatis
插入 带查询(多表)
Tips:
1.多表的mybatis的组合查询的sql语句对不对
2.springmvc查询的时候用json做
3.查询封装成单选按钮/下拉列表
文件创建时间和考试时间一致
结果截图时间,有水印
//截图:日志测试程序结果打印,界面,核心代码