首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >Java面试专题之十:Mybatis相关的6个实用性问题

Java面试专题之十:Mybatis相关的6个实用性问题

作者头像
用户1289394
发布2020-11-23 10:41:57
发布2020-11-23 10:41:57
4020
举报
文章被收录于专栏:Java学习网Java学习网

1、如何执行批量插入?

首先,创建一个简单的 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);

}

sqlsession.commit();

} catch (Exception e) {

e.printStackTrace();

sqlSession.rollback();

throw e;

}

finally {

sqlsession.close();

}

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

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());

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

  • 第一种:

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>

  • 第二种:使用 @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>

  • 第三种:多个参数封装成 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();

}

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

Mybatis 动态 sql 可以在 Xml 映射文件内,以标签的形式编写动态 sql,执行原理是根据表达式的值完成逻辑判断并动态拼接 sql 的功能。

Mybatis提供了9种动态sql标签:trim | where | set | foreach | if | choose| when | otherwise | bind。

5、Xml 映射文件中,除了常见的 select|insert|updae|delete标签之外,还有哪些标签?

<resultMap>、<parameterMap>、<sql>、<include>、

<selectKey> ,加上动态 sql 的 9 个标签,其中 <sql> 为 sql 片段标签,通过<include> 标签引入 sql 片段, <selectKey> 为不支持自增的主键生成策略标签。

6、Mybatis 的 Xml 映射文件中,不同的 Xml 映射文件,id 是否可以重复?

不同的 Xml 映射文件,如果配置了 namespace,那么 id 可以重复;如果没有配置 namespace,那么 id 不能重复;

原因就是 namespace+id 是作为 Map <String, MapperStatement> 的 key使用的,如果没有 namespace,就剩下 id,那么,id 重复会导致数据互相覆盖。

有了 namespace,自然 id 就可以重复,namespace 不同,namespace+id 自然也就不同。

我是一名码龄10年的程序员,在这里会分享实在干货,让你少走弯路,成就精彩人生。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-11-20,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Java学习网 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档