一,什么是MyBatis?

1,MyBatis是一个ORM(对象关系映射)框架,它内部封装了JDBC,开发时只需要关注SQL语句本身,不需要花费精力去处理加载驱动,创建连接,创建statement等复杂的过程。程序员不需要编写原生态sql,可以严格控制sql执行性能,灵活度高

2,MyBatis可以使用xml或者注解来配置映射原生信息,将POJO映射成数据库中的记录,避免了几乎所有的JDBC代码和手动设置的参数以及获取结果集

二,MyBatis的优点

1,基于SQL语句编程,相对灵活,接触sql与程序代码的藕合,便于统一管理,支持写动态sql语句并可重复使用

2,减少代码量,消除了冗余代码,

3,数据库兼容能够与Spring集成

4,提供映射标签支持字段关系映射

三, MyBatis框架的缺点

1,工作量较大,字段多,关联表多

2,数据库移植性差      

四、MyBatis 框架适用场合

1,DAO层解决方案

2,对性能的要求高,或者需求量变化较多的项目

五,MyBatis 与 Hibernate 有哪些不同?

1,MyBatis它不完全是一个ORM框架,因为MyBatis需要程序员自己编写sql语句

2,MyBatis直接编写sql语句,sql执行性能,灵活度高,适合对关系数据模式要求不高的软件开发,MyBatis无法做到数据库无关性

3,Hibernate 数据库无关性好,对于关系模式要求高的软件

六、#{}和${}的区别是什么?

1,#{}预编译处理,${}是字符串替换

2,#{}防止SQL注入,提高系统安全性

七、当实体类中的属性名和表中的字段名不一样 ,怎么办 ?

第一种:通过查询的Sql语句中定义字段名的别名,让字段明的别名和实体类的属性名一致

<select id=”selectorder” parametertype=”int” resultetype=”
me.gacl.domain.order”>
select order_id id, order_no orderno ,order_price price form
orders where order_id=#{id};
</select>

第二种通过来映射字段名和实体类属性名的一一对应的关系。

 八、 模糊查询 like 语句该怎么写?

第 1 种:在 Java 代码中添加 sql 通配符。

<select id=”selectlike”>
select * from foo where bar like #{value}
</select>

第 2 种:在 sql 语句中拼接通配符,会引起 sql 注入

string wildcardname = “smi”;
list<name> names = mapper.selectlike(wildcardname);
<select id=”selectlike”>
select * from foo where bar like "%"#{value}"%"
</select>

 九、通常一个 Xml 映射文件,都会写一个 Dao 接口与之对应, 请问,这个 Dao 接口的工作原理是什么?Dao 接口里的方法, 参数不同时,方法能重载吗?

Dao 接口即 Mapper 接口。接口的全限名,就是映射文件中的 namespace 的值; 接口的方法名,就是映射文件中 Mapper 的 Statement 的 id 值;接口方法内的 参数,就是传递给 sql 的参数。 Mapper 接口是没有实现类的,当调用接口方法时,接口全限名+方法名拼接字符 串作为 key 值,可唯一定位一个 MapperStatement。在 Mybatis 中,每一个 、、、标签,都会被解析为一个 MapperStatement 对象。

十、Mybatis 是如何进行分页的?分页插件的原理是什么?

Mybatis 使用 RowBounds 对象进行分页,它是针对 ResultSet 结果集执行的内 存分页,而非物理分页。可以在 sql 内直接书写带有物理分页的参数来完成物理分 页功能,也可以使用分页插件来完成物理分页。 分页插件的基本原理是使用 Mybatis 提供的插件接口,实现自定义插件,在插件 的拦截方法内拦截待执行的 sql,然后重写 sql,根据 dialect 方言,添加对应的物 理分页语句和物理分页参数。

十一,MyBatis是如何将sql执行结果封装为目标对象并返回的?都有哪些映射形式?

第一种是使用<resultMap>标签,逐一定义数据库列名和对象属性之间的映射关系

第二种是使用sql列的别名功能,将列的别名书为对象属性名,有了列名与属性明的映射关系后,Mybatis通过反射创建对象,同时使用反射给 对象的属性逐一赋值并返回,那些找不到映射关系的属性,是无法完成赋值的。

十二,如何执行批量插入

首先创建一个简单的insert

<insert id=”insertname”>
insert into names (name) values (#{value})
</insert>

然后在Java代码中像下面这样执行处理插入:

list < string > names = new arraylist();
names.add(“fred”);
names.add(“barney”);
names.add(“betty”);
names.add(“wilma”);
// 注意这里 executortype.batch
sqlsession sqlsession =
sqlsessionfactory.opensession(executortype.batch);
try {
namemapper mapper = sqlsession.getmapper(namemapper.class);
for (string name: names) {
mapper.insertname(name);
}
sqlsessionmit();
} catch (Exception e) {
e.printStackTrace();
sqlSession.rollback();
throw e;
}
finally {
sqlsession.close();
}

十三、如何获取自动生成的(主)键值?

insert方法总是返回一个int值这个值代表的插入的行数。

如果采用自增长策略,自动生成的键值在insert方法执行完后可以被设置到传入的参数对象中

实例:

<insert id=”insertname” usegeneratedkeys=”true” keyproperty=”
id”>
insert into names (name) values (#{name})
</insert>
name name = new name();
name.setname(“fred”);
int rows = mapper.insertname(name);
// 完成后,id 已经被设置到对象中
system.out.println(“rows inserted = ” + rows);
system.out.println(“generated key value = ” + name.getid())

十四、在 mapper 中如何传递多个参数?

1,第一种:

DAO层的函数

public UserselectUser(String name,String area); 对应的 xml,#{0}代表接收的是 dao 层中的第一个参数,#{1}代表 dao 层中第二 参数,更多参数一致往后加即可。

<select id="selectUser"resultMap="BaseResultMap">
select * fromuser_user_t whereuser_name = #{0}
anduser_area=#{1}
</select>

2,第二种:使用@param注解:

public interface usermapper {
user selectuser(@param(“username”) string
username,@param(“hashedpassword”) string hashedpassword);
}

然后,就可以在 xml 像下面这样使用(推荐封装为一个 map,作为单个参数传递给 mapper):

<select id=”selectuser” resulttype=”user”>
select id, username, hashedpassword
from some_table
where username = #{username}
and hashedpassword = #{hashedpassword}
</select>

3、第三种:多个参数封装成 map

try {
//映射文件的命名空间.SQL 片段的 ID,就可以调用对应的映射文件中的
SQL
//由于我们的参数超过了两个,而方法中只有一个 Object 参数收集,因此
我们使用 Map 集合来装载我们的参数
Map < String, Object > map = new HashMap();
map.put("start", start);
map.put("end", end);
return sqlSession.selectList("StudentID.pagination", map);
} catch (Exception e) {
e.printStackTrace();
sqlSession.rollback();
throw e;
} finally {
MybatisUtil.closeSqlSession();
}

十五、Mybatis 动态 sql 有什么用?执行原理?有哪些动态 sql?

Mybatis动态sql可以在Xml映射文件内,以标签的形式编写动态sql

执行原理是根据表达式的值 完全逻辑判断并动态sql的功能

Mybatis提供了9中动态sql标签:trim | where | set | foreach | if  |choose | when | otherwise|bind
十六,一对一、一对多的关联查询 ?

<mapper namespace="com.lcb.mapping.userMapper">
<!--association 一对一关联查询 -->
<select id="getClass" parameterType="int"
resultMap="ClassesResultMap">
select * from class c,teacher t where c.teacher_id=t.t_id and
c.c_id=#{id}
</select>
<resultMap type="com.lcb.user.Classes" id="ClassesResultMap">
<!-- 实体类的字段名和数据表的字段名映射 -->
<id property="id" column="c_id"/>
<result property="name" column="c_name"/>
<association property="teacher"
javaType="com.lcb.user.Teacher">
<id property="id" column="t_id"/>
<result property="name" column="t_name"/>
</association>
</resultMap>
<!--collection 一对多关联查询 -->
<select id="getClass2" parameterType="int"
resultMap="ClassesResultMap2">
select * from class c,teacher t,student s where c.teacher_id=t.t_id
and c.c_id=s.class_id and c.c_id=#{id}
</select>
<resultMap type="com.lcb.user.Classes" id="ClassesResultMap2">
<id property="id" column="c_id"/>
<result property="name" column="c_name"/>
<association property="teacher"
javaType="com.lcb.user.Teacher">
<id property="id" column="t_id"/>
<result property="name" column="t_name"/>
</association>
<collection property="student"
ofType="com.lcb.user.Student">
<id property="id" column="s_id"/>
<result property="name" column="s_name"/>
</collection>
</resultMap>
</mapper>

更多推荐

MyBatis详细面试题以及答案