【001】Mybatis是什么?有什么用?
答:
注意:
mybatis在3.4版本以后需要使用jdk1.8及以上
【002】Mybatis与Hibernate的区别?
答:
Hibernate不用写SQL就可以直接操作数据库,使用ORM理论实现,定位于支持多种数据库的项目
Mybatis使用较少的代码就可以操作数据库,使用ORM理论实现,不用写实现类,直接使用接口来操作数据库,定位于提高开发效率
配置流程不同:
Hibernate先映射后操作
Mybatis先操作再映射结果到实体类的ORM框架
【003】Mybatis有 几种操作CRUD的方式?
答:
① 使用xml和接口的方式操作数据库 (现在)
② 使用注解和接口的方式操作数据库 (未来)
③ 使用dao方式操作数据库 (过去)
注意:
mybatis的增删改操作,都是返回一个int类型,表示影响的行数
【004】Mybatis操作数据库的步骤?
答:
① 获取操作数据库的SqlSession
② 使用session获取xxxMapper的代理对象:getMapper( )
③ 使用接口操作数据库
④ 操作完毕后提交事务、关闭
【005】简要说明下Mybatis的总配置文件?
答:
总配置文件指的是mybatis-config.xml文件,包含:
properties :配置支持properties文件
environments :配置数据库的数据源
mappers :配置映射文件
typeAliases :配置别名
settings :配置mybatis默认的设置
其中:
environments :环境便签,用于配置数据库的连接信息
| -- environment :配置具体环境参数
| -- transactionManager :配置使用的事务类型(JDBC)
| -- dataSource :配置数据源的参数
| -- property :配置属性
mappers:配置映射文件信息
| -- mapper class|resource:配置具体指定的mapper文件
| -- class :配置使用注解时指定有注解的映射接口
| -- resource :指定映射文件
| -- properties :配置对propertis文件的支持
| -- typeAliases :配置别名
| -- typeHandlers :配置自定义类型处理器
settings:配置Mybatis的默认设置
传入参数
Mybatis是通过类型来匹配传入的参数的.默认情况下如果不限制类型就自动获得方法的参数的类型 <insert id="insert" parameterType="Student">
所谓的传入参数指mybatis操作(<insert><delete><update><select>)的传入参数.
mybatis默认情况下是不支持传入多个参数的,只能传入一个参数;如果需要多个参数只能将这些参数封装到一个对象里面.再传入
为什么不支持多个参数?
因为Java语法1.7以前.是不能通过反射技术获得方法的参数名的,
所以Mybatis只能通过参数的类型来获得参数值,但Java语法上一个方法可以有多个相同类型的参数,导致如果Mybatis支持的方法有多个相同的参数数,即无法判断参数是哪个参数值
所有Mybatis映射接口操作的方法只能默认支持一个参数
因为使用的是方法的参数的类型来获得参数的,所以在配置文件里面如果获得的值就是方法的参数的值,其实#{随便写},获得的都是这个方法int deleteById(int sid)
注意:
① 默认情况,所有Mybatis映射接口操作的方法只能默认支持一个参数
② 操作方法的参数是通过类型来取值的,而不是参数名
【006】Mybatis如何设置别名(typeAliases)
答:
① 别名(typeAliases):
配置映射文件里面的类名使用指定的名称来代替类的全限制名
② 自定义别名的方式:
方式一:设置实体类的别名
<typeAliases>
<typeAlias type="cc.chuang.entity.Teacher" alias="Teacher" />
<typeAlias type="cc.chuang.entity.Student" alias="Student" />
</typeAliases>
方式二:使用包下面的类,默认去掉包名
<typeAliases>
<package name="cc.chuang.entity" />
</typeAliases>
③ mybatis内置部分别名
【007】Mybatis对操作接口方法是如何支持多参数?
答:
mybatis是通过参数池的概念来实现对多个参数的支持
mybatis要支持多参数,必须在参数前加注解@Param,如:
int methodName(@Param(value="name") String name, @Param(value="sex") String sex)
【008】Mybatis中#{}与${}的区别?什么时候需要使用${}?
答:
区别一:
① 使用#{},输出的日志为,SID =?
#{}表示设置预编译的参数,就是?的参数,
所以如果要不固定的表名不能使用#{},只能使用${}
② 使用${},输出的日志为,SID=10,不是?号,而是一个传递进来的值
${}直接把值输出来,而#{]是使用 ? 来代替,所以${}是不安全的
区别二:
① #{}:可以获得参数类型匹配的值,也可以获得参数池的值
② ${}:必须在参数池里面获得对应的值,所以 ${} 只能接收带有@Param的参数
区别三:
① ${}只能获得参数池的值
② #{}可以获得方法的参数值,也可以获得参数池的值,
如果使用${}获得参数的值,这个参数必须要加上@Param
什么时候需要使用${}
mybatis删除一个表,且表名由参数传递进来时,则不能使用#{},只能使用${}
因为PreparedStatement决定了表名不能是?,?必须SQL的参数
void dropTable(@Param("tableName")String tableName);
<delete id="dropTable">
drop table ${tableName}
</delete>
- mybatis的操作标签只有insert、delete、update、select
只有操作标签才可以操作数据库
sql只是一个拼接标签,不是操作标签
所以删除表可以使用insert,delete,update,select 随便一个标签
【009】Mybatis如何实现新增数据ID回填?
答:
所谓新增数据的ID回填,就是插入数据以后将ID填充到插入的对象
mybatis默认是不支持ID回填的
如何支持:
使用useGeneratedKeys=true,并且制定ID的属性名keyProperty
<insert id="insert" useGeneratedKeys="true" keyProperty="sid" >
INSERT INTO student (SNAME, SEX) VALUES (#{sname}, #{sex})
</insert>
上面的语句说明:
① id必须要与映射接口的方法名一一对应
② useGeneratedKeys:支持ID回填
③ keyProperty:指定回填的主键
④ keyColumn:
如果id主键的实体类字段与数据库字段不匹配时,需指定回填ID的数据库字段
如果实体类字段与数据库字段一致的话,则不用写
⑥ 在mybatis里面使用占位符#{}来获得传递的值(如果是实体类,字段必须一一对应)
【010】Mybatis为动态SQL语句提供了哪些标签?
答:
<sql> :定义sql语句块
<if> :判断 - 类似java的if
<choose> <when> <otherwise> :判断 - 类似java的switch
<trim> :去掉字符前后缀
<foreach> :循环 - 类似java的for
<set> :用于拼接update的set字段
<where> :用于拼接where后面的条件
【011】Mybatis中如何理解一级缓存?如何关闭?
答:
一级缓存默认是打开的,mybatis里面而且没有关闭的配置
如果后面支持关闭一级缓存,肯定在<setings>
一级缓存就是会话(Session)级别的缓存
就是说同一个会话数据会缓存在缓冲区,只要会话(Session)不关闭,不管查询N次数据库,其实都是只查询了一次
mybatis默认是开启缓存的,关闭一级缓存三种方式
① 通过session.clearCache()
② 操作数据库(增删改)
③ 通过关闭session.close()
【012】Mybatis中如何理解二级缓存,如何配置二级缓存?
答:
mybatis中的二级缓存是文件级别的缓存,即将每一个mapper映射文件查询的结构缓存在缓存区,即使关闭了会话(session),缓存依然会存在
配置二级缓存步骤:
① 必须将需要缓存的实体类加上序列化接口
Serializable用于序列化数据,支持二级缓存
② 导入缓存需要的jar包、映射文件配置缓存的支持
<cache></cache>
③ 配置启动二级缓存(新版本默认为true,可以不配)
<settings>
<setting name="cacheEnabled" value="true" />
</settings>
注意:默认情况下,只有发生了增、删、改操作,才会清除缓存
【013】Mybatis整合ehcache的步骤?
答:
注意:
因为映射文件的操作的id是不能重复的,所以在使用接口操作的方式时,方法名不能重复
id必须要与映射接口的方法名一一对应
在Mybatis里面使用占位符#{}来获得传递的值
注意:
如果是实体类,字段必须一一对应
因为查询的表不一样,返回的类型就不一样,所以查询的时候,必须指定返回记录的实体类型
【014】Mybatis中的高级查询指的是什么?
答:
mybatis的高级查询就是在mybatis的映射文件配置中对:一对一、一对多、多对多这几种表关联关系的配置
① 一对一的关系
方法一:先写好两个表的连接表的SQL语句,然后通过 resultMap 标签组成查询的结果
方法二:将查询的方法分开写,最后使用resultMap来组合
② 一对多的关系
③ 多对多的关系
|
|