A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

【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来组合

②  一对多的关系

③  多对多的关系

1 个回复

倒序浏览
我来占层楼啊   
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马