一、Mybatis中保存一条记录,返回主键有哪些要求?【10分】
保存一条记录,返回主键有两种方法:保存记录时获取主键、保存记录后获取主键
Ⅰ、在保存记录时能够返回主键的关键所在:SQL标签中添加三个属性。即,
①【useGeneratedKeys】的值————>必须设置为【true】,否则无法获得主键id,
可以在【mybatis-config.xml】中设置:
<settings> <setting name="useGeneratedKeys" value="true"/> </settings>
②【keyProperty】————>设置为POJO对象的主键id【属性名称】
③【keyColumn】————>设置为数据库记录的主键id的【字段名称】
Ⅱ、在保存记录之后获取主键,用到了【selectKey】标签
<selectKey keyColumn="id" keyProperty="id" resultType="int" order="AFTER"> select LAST_INSERT_ID() 或者 select @@identity </selectKey>
要求:
①【keyProperty】————>设置为POJO对象的主键id【属性名称】
②【keyColumn】————>设置为数据库记录的主键id的【字段名称】
③【resultType】————>设置为获取主键的SQL语句的返回值的【数据类型】
④【order】——————>设置获取主键的SQL语句在保存记录之前【BEFORE】还是之后【AFTER】执行
SQL语句有两种:
# 查询最后一次添加的SQL语句中的主键的值 select LAST_INSERT_ID(); select @@identity
二、请写出使用Mybatis的Mapper代理的步骤;dao有啥要求?映射文件有什么要求?【10分】
mapper:相当于Java里面的类
namespace:相当于Java里面的包名
使用Mapper代理的要求:
————> namespace:必须是Dao接口的包名+类名
————> sql标签中的id:必须和dao接口中的方法名一样,唯一标识,id不能重复
————> parameterType:必须和dao接口方法中的形参类型一样
————> resultType:必须和dao接口方法中的返回值类型一样
——————> 如果查询的是单条,那么返回值类型就是resultType;
——————> 如果查询的是多条,那么返回值的类型是List,List里面放的是resultType
Ⅰ、接口和Mapper文件必须在同一目录下
Ⅱ、mapper.xml中namespace指定为mapper接口的全限定名
Ⅲ、mapper.xml中statement的id就是mapper.java中方法名
Ⅳ、mapper.xml中statement的parameterType和mapper.java中方法输入参数类型一致
Ⅴ、mapper.xml中statement的resultType和mapper.java中方法返回值类型一致.
三、请写出Mybatis中映射文件的动态SQL语句常用的SQL标签有哪些?分别代表什么含义?【10分】 ——> 9分
where
if
when
otherwise
choose
set
sql
include
trim
foreach
test
四、Mybatis中实现一对多的关联关系的步骤有哪些?【10分】
Ⅰ、数据库两表关联字段
A表的主键列是B表的外键列,即,A表——>B表为一对多的关系
Ⅱ、映射文件中需要为两表的关联字段重新赋值
<!-- A表是一的一方,B表是多的一方 --> <mapper namespace="A表"> <select id="findList" resultMap="resultMap" parameterType="A表对应的POJO类的类全限定名"> <!-- 为重复字段【两表中的关联字段】重新赋值 --> <id column="A表中主键ID字段名" property="A表POJO类主键ID对应的属性名"/> <property id="B表POJO类中的A表的自定义引用属性名" column="B表中关联字段的属性名" ofType="B表的类全限定名" select="B表.findList"> </select> </mapper> <mapper namespace="B表"> <select id="findList" resultType="B表对应的POJO类的类全限定名"> select * from B表 where B表关联字段ID = #{ID} </select> </mapper>
Ⅲ、Mapper文件需要在全局配置文件中配置,以便加载配置时知道Mapper文件的位置
五、Mybatis的分页有三种,分别是什么?【10分】——> 9分
Ⅰ、数组分页 ?
Ⅱ、SQL分页
mysql分页关键字 limit
postgresql分页关键字 offset
oracle 分页:三层rowNum 嵌套
分页必备的两个要素:总条数、每页多少条
<select id="page_Query" resultType="POJO类的全限定名"> select * from 表名 limit 3,2 </select>
Ⅲ、拦截器+插件配置分页
①、在【mybatis.cfg.xml】文件中配置插件;【注意插件配置的顺序】
<!-- 配置插件 --> <plugins> <!-- 插件 --> <plugin interceptor="com.github.pagehelper.PageInterceptor"> <!-- 参数 reasonable:分页合理化参数,默认值为false。当该参数设置为 true 时, pageNum<=0 时会查询第一页, pageNum>pages(超过总数时), 会查询最后一页。默认false 时,直接根据参数进行查询。 --> <property name="reasonable" value="true"/> </plugin> </plugins>
②、在映射文件中,配置SQL语句
<select id="page_3" resultType="分页类的全限定名"> select * from 类对应的表 </select>
插件:pageHelper:Page page = pageHelper.startPage(a,b);
总条数:page.getTotal();
总页数:page.getPageSize();
每页条数:page.getPages();
page.getPageNum();
③、PageHelper插件分页查询的测试类及运行结果
![]()
【 PageHelper插件分页查询的测试类及运行结果】
![]()
【 PageHelper插件分页查询的测试类及运行结果02】 Ⅳ、RowBounds分页
Mybatis自带的RowBounds分页的测试类及运行结果如下:
六、Spring中的IOC和DI分别代表什么含义,请解释一下?【10分】
IOC:【Inversion Of Controller】控制反转
将对象实例化的操作交给Spring IOC容器进行封装处理成一个个的Bean,通过反射的原理获得该对象 DI:【Dependency Injection】依赖注入
分为三大类:构造器赋值、读写器赋值、其他赋值。
构造器赋值:
①按照形参的下标索引值赋值 ②按照形参的数据类型赋值 ③按照形参的变量名赋值 读写器赋值:
①基本数据类型<property name="" value=""> ②引用数据类型<array>数组<list>List集合<set>Set集合 <map>Map集<props>properMap集
③自定义引用类型 <!-- String数组 --> <property name="hobbyArr"> <array> <value>篮球</value> <value>足球</value> <value>羽毛球</value> </array> </property> <!-- List集合 --> <property name="hobbyList"> <list> <value>篮球hobbyList</value> <value>足球hobbyList</value> <value>羽毛球hobbyList</value> </list> </property> <!-- Set集合 --> <property name="hobbySet"> <set> <value>篮球hobbySet</value> <value>足球hobbySet</value> <value>羽毛球hobbySet</value> </set> </property> <!-- Map集 --> <property name="hobbyMap"> <map> <entry key="a" value="篮球hobbyMap"/> <entry key="b" value="足球hobbyMap"/> <entry key="a" value="羽毛球hobbyMap"/><!-- 会覆盖键为a的值 --> </map> </property> <!-- ProperMap集 --> <property name="hobbyProperMap"> <props> <prop key="a">篮球hobbyProperMap</prop> <prop key="b">足球hobbyProperMap</prop> <prop key="a">羽毛球hobbyProperMap</prop> </props> </property>
<property name="kingList"> <list> <ref bean="zh"/> <ref bean="zz"/> </list> </property> <bean id="zh" class="com.jinghangzz.spring.pojo.ADemoKing"> <property name="id" value="1"/> <property name="name" value="赵恒"/> <property name="age" value="11"/> </bean> <bean id="zz" class="com.jinghangzz.spring.pojo.ADemoKing"> <property name="id" value="2"/> <property name="name" value="赵祯"/> <property name="age" value="13"/> </bean>
其他方法:
①、P ②、属性文件
七、Spring为指定的类常见的构造方法赋值有哪几种?推荐使用哪个?为什么?【10分】
Ⅰ、按照有参构造方法的形参的【下标索引值】进行赋值
缺点:如果形参数量相同,数据类型不同,不知道指定下标的形参的数据类型是什么,数据类型则会不匹配。
Ⅱ、按照有参构造方法的形参的【数据类型】进行赋值
缺点:如果数据类型相同的形参数量不唯一,不知道赋值给哪一个形参
Ⅲ、按照有参构造方法的形参的【名称】进行赋值 【推荐使用】
优点:因为属性名具有唯一性,所以按照属性名进行赋值,不易出错。
缺点:如果形参的数量较多,(指定的类的属性过多),赋值代码繁而冗杂。
八、SpringAOP是什么意思?它都包含哪些概念,写的越多越好。【10分】——> 9分
AOP:【Aspect Oriented Programming】 面向侧面编程
包含概念有:
Ⅰ、切面【Aspect】
Ⅱ、连接点【Join Point】
Ⅲ、通知【Advice】
Ⅳ、切入点【Pointcut】
Ⅴ、介绍【Introduction】
Ⅵ、目标对象【Target object】
Ⅶ、AOP代理【AOP proxy】
Ⅷ、织入【Weaving】
九、SpringMVC驱动赋值都有哪几类,分别是什么?【10分】——> 3分
基本数据类型
引用数据类型
自定义引用类型
十、请介绍一下代理模式?【10分】——> 3分
代理模式:可以实现委托类的要求
静态代理:维护性差,一个代理实现一个目标对象
动态代理:一个代理可以实现多个目标对象;写一个代理。谁用谁拿,返回对象即可。