推荐学java——MyBatis高级,2024年最新含面试题+答案

先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7

深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以添加V获取:vip1024b (备注Java)
img

正文

这是截至目前接触到的 settings 标签里的两个配置,下面看 properties 标签,这是我们第一次接触。举个简单的例子你就知道它的作用了,还记得下面这段代码吗?

<property name=“url”

value=“jdbc:mysql://localhost:3306/mybatis_demo?useUnicode=true&characterEncoding=utf8”/>

这里的 value 对应的值通过这种直接写死的方式很不友好,也是不推荐的,实际开发中是有专门的属性文件来管理这些值的,这就要用到 properties 标签了。

resources 目录下新建文件 db.properties ,编辑如下内容:

driver=com.mysql.cj.jdbc.Driver

url=jdbc:mysql://localhost:3306/mybatis_demo?useUnicode=true&characterEncoding=utf8

username=root

password=root

就是这么简单,有其他编程语言经验的道友应该不陌生,这就是简单的 k-v 形式存储值的方式,接下来就是我们的核心配置文件中的 configuration 标签下配置如下代码:

还记得我们前面提到的顺序问题嘛!不要放错了位置(放错也没关系,IDEA太智能了,它会给你提示的)。

细心的你可能注意到我们有一处微小的变化: &amp; -> & 那为什么 & 这个符号不能直接在xml中写呢?

我们都知道 xml 里面都是标签,如果我们要写一个小于号 < ,那么xml在解析的时候会认为你这是某个标签的开始,且这个标签没有写完整,所以就有了一些对应的转义符号,常用的几个:

  • < : &lt;

  • > : &gt;

  • & : &amp;

  • ' : &apos;

  • " : &quot;

typeAliases标签

该标签的作用是为了给繁长且多的javaBean起一个短名字,方便使用减少出错概率,上节内容我们有这样一个查询:

select * from tv_series

这里的 com.javafirst.bean.TVSeriesBean 就是我们要用别名来代替的部分,想一下,如果项目稍微复杂一些,且经历了好几个开发者,那么使用别名就很Nice.下面是别名标签的配置:

这样设置后,我们在对应的 mapper.xml 里就可以这样使用:

select * from tv_series

细心同学注意到了吧,有两种方式,但推荐大家用这里举例的方式,至于注解方式,本文后面会讲。

动态SQL

动态SQL是指根据参数动态组织SQL的技术。简单来说,可以通过在java项目中动态的改变条件等来执行SQL得到需要的结果。其实并不难,也不高深,下面来一一了解:

  • 动态SQL-if

  • 动态SQL-where(对if的优化)

  • 动态SQL-choose(when,otherwise)

  • 动态SQL-foreach

  • 动态SQL-片段

动态SQL-片段

使用注意事项:

  • 尽量基于单表实现

  • 不要嵌套 where 标签

我们先来定义一个SQL片段:

select * from tv_series

语法很简单,使用 sql 标签,里面是基本的SQL语句,可以使增删改查中的其一,可以定义多个,只需id唯一即可,使用方式也很简单,看下面的示例:

当然,你也可以嵌套在语句中,比如这样:

where tv_id = #{tvId}

使用起来还是比较灵活的,尤其当我们的SQL比较长的时候,把一些独立的内容提取出来对我们理解程序有很大的意义。

动态SQL-if

相信你应该已经猜到了,没错,就是要学习 if 标签,还要把它应用在sql语句书写中,作为条件判断使用,这就很有意思了。在开始之前先来插入几条数据,作为接下来学习使用,完整SQL如下,可以直接执行哈:

INSERT INTO tv_series (tv_title,tv_sub_title,tv_type)

VALUES (“《天龙八部》”,“这部小说以宋哲宗时代为背景,通过宋、辽、大理、西夏、吐蕃等王国之间的武林恩怨和民族矛盾,从哲学的高度对人生和社会进行审视和描写,展示了一幅波澜壮阔的生活画卷。”,2),

(“《侠客行》”,“孤悬海外的侠客岛,每十年即派出赏善罚恶二使来到中原,强行邀请武林各大门派掌门人赴岛喝腊八粥。凡不接受邀请的门派皆被二使斩尽杀绝,而去了侠客岛的掌门人又个个渺无音信。”,1),

(“《笑傲江湖》”,“该剧讲述华山派大弟子令狐冲,生性豁达不羁。偶遇剑宗高人风清扬授以《独孤九剑》,又意外尽得五岳各派剑法精髓,导致师父岳不群猜疑,藉口逐出师门。”,2),

(“《人民的名义》”,“夜幕下的汉东省京州市,看似平静的官场霎时间阴云密布。国家部委项目处处长赵德汉涉嫌受贿,遭到最高人民检察院反贪总局侦查处处长侯亮平(陆毅 饰)的突击调查。”,6)

;

现在我们来看个很简单的例子:

通过标题或者类型来查询数据,返回一个List集合.

实现这个功能,并不难,关键是我们要通过动态SQL技术来做,但我们熟悉的 三步骤 不会变。第一步 ,在 TVSeriesDao 中定义接口 List<TVSeriesBean> selectByDynamicSQL_if(Map<String, Object> params) ;

第二步,在 TVSeriesMapper.xml 中完成SQL的编写:

where

tv_title=#{title}

or tv_type = #{type}

第三步,就是测试方法,代码如下:

/**

  • 动态SQL-if 测试

*/

@Test

public void testDynamicSQL_if() {

SqlSession sqlSession = MyBatisUtil.openSqlSession();

TVSeriesDao tvSeriesDao = sqlSession.getMapper(TVSeriesDao.class);

// 通过标题 或者 类型 来查找数据

Map<String, Object> params = new HashMap<>();

params.put(“title”, “《人民的名义》”);

//params.put(“type”, 2);

List beanList = tvSeriesDao.selectByDynamicSQL_if(params);

for (TVSeriesBean seriesBean : beanList) {

System.out.println(seriesBean);

}

sqlSession.close();

}

完成以上三步,最后就是看结果了,这里给各位几组测试参数:

// 第一组

params.put(“title”, “《人民的名义》”);

//params.put(“type”, 2);

// 第二组

params.put(“title”, “《人民的名义》”);

params.put(“type”, 2);

// 第三组

//params.put(“title”, “《人民的名义》”);

params.put(“type”, 2);

// 第四组

params.put(“title”, “”);

params.put(“type”, 12);

大家测试后一定会发现第三组和第四组参数是会出错的, 这就是只使用 IF 标签带来的问题 ,此时这两组参数对应的SQL变为下面这样了:

select * from tv_series where or tv_type=2

select * from tv_series where

很明显,这两条SQL语法都错误的,无法执行,导致我们的程序出现异常。那么解决方案是什么呢?这就是接下来要学的动态SQL-where标签和if结合使用。

动态SQL-where(if)

在前面的基础上,我们只需要修改一下 mapper.xml 中的代码即可测试结果:

tv_title=#{title}

or tv_type = #{type}

验证结果各位自行测试,这里不做演示,需要说明的是 MyBatis 会自动取消紧跟在 where 标签后的 or 和 and ,正是因为这样,我们的SQL会自动拼装为可执行的语句。

动态SQL-choose(when,otherwise)

过程都一样,这里直接上代码了,定义接口 TVSeriesBean selectByDynamicSQL_choose(Map<String, Object> params) ;接着是 mapper.xml 中的代码如下:

tv_type = #{type}

tv_title = ‘《人民的名义》’

tv_id = #{id}

这里说明一下代码功能, choose-when-otherwise 结构和我们在java基础部分学习过的 switch-case 结构作用是等同的,只是书写语法不同而已,理解起来一点难度没有。

简言之,只要其中一个 when 标签的判断条件满足情况,那么就不会走后面的逻辑;如果 when条件都不满足,那么会走 otherwise 后的逻辑,就这么简单。

最后是我们的测试代码,如下:

/**

  • 动态SQL-choose-when-otherwise

*/

@Test

public void testSelectByDynamicSQL_choose() {

SqlSession sqlSession = MyBatisUtil.openSqlSession();

TVSeriesDao tvSeriesDao = sqlSession.getMapper(TVSeriesDao.class);

Map<String, Object> params = new HashMap<>();

params.put(“title”, “xxx”);

params.put(“type”, 12);

// 条件都不满足 则取默认值

params.put(“id”, 2);

TVSeriesBean bean = tvSeriesDao.selectByDynamicSQL_choose(params);

System.out.println(bean);

sqlSession.close();

}

结果大家自行尝试,通过变换参数来实践结果,理解更透彻。

动态SQL-foreach

常见使用场景是对集合进行遍历(尤其是在构建 IN 条件语句的时候)。这里会分别讲解集合的泛型是 Integer 和 Object 类型,他们只是稍微有点区别,先来看包装类型的集合遍历。

定义接口 List<TVSeriesBean> selectByDynamicSQL_foreach(List<Integer> ids) ;然后是 mapper.xml 中的代码:

where tv_id in

#{cus_id}

这里对每个属性的意义都做了解释,其实是完全对应我们之前学习过集合的结构来的,所以理解起来并不难,因为xml中始终都是按照节点来做解析的。

测试代码如下:

/**

  • 动态SQL-foreach 遍历泛型类型是包装类的集合

*/

@Test

public void testSelectByDynamicSQL_foreach() {

SqlSession sqlSession = MyBatisUtil.openSqlSession();

TVSeriesDao tvSeriesDao = sqlSession.getMapper(TVSeriesDao.class);

List ids = new ArrayList<>();

ids.add(1);

ids.add(2);

ids.add(3);

//ids.add(5);

List beanList = tvSeriesDao.selectByDynamicSQL_foreach(ids);

for (TVSeriesBean seriesBean : beanList) {

System.out.println(seriesBean);

}

sqlSession.close();

}

大家自行测试,结果满足我们的需求即可:从表中查找出我们指定的id集合中的记录。

我们都知道集合的泛型可以使基本数据类型对应的包装类,也可以是自定义对象类型,那么现在我们就来学习变量对象类型的集合。

首先定义接口 List<TVSeriesBean> selectByDynamicSQL_foreachObj(List<TVSeriesBean> seriesBeans) ;接着是我们的 mapper.xml 文件中代码:

读者福利

由于篇幅过长,就不展示所有面试题了,感兴趣的小伙伴

35K成功入职:蚂蚁金服面试Java后端经历!「含面试题+答案」

35K成功入职:蚂蚁金服面试Java后端经历!「含面试题+答案」

35K成功入职:蚂蚁金服面试Java后端经历!「含面试题+答案」

更多笔记分享

35K成功入职:蚂蚁金服面试Java后端经历!「含面试题+答案」

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注Java)
img

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

d集合中的记录。

我们都知道集合的泛型可以使基本数据类型对应的包装类,也可以是自定义对象类型,那么现在我们就来学习变量对象类型的集合。

首先定义接口 List<TVSeriesBean> selectByDynamicSQL_foreachObj(List<TVSeriesBean> seriesBeans) ;接着是我们的 mapper.xml 文件中代码:

读者福利

由于篇幅过长,就不展示所有面试题了,感兴趣的小伙伴

[外链图片转存中…(img-WcppVrbB-1713709804992)]

[外链图片转存中…(img-WqzB2s73-1713709804992)]

[外链图片转存中…(img-A5FThDi7-1713709804993)]

更多笔记分享

[外链图片转存中…(img-dRjyK2LU-1713709804993)]

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注Java)
[外链图片转存中…(img-ebGj9Z4l-1713709804994)]

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 23
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值