IDEA技巧

IDEA

文章目录

2、IDEA的技巧
2.1 如果不小心把IDEA的配置搞崩溃了

在C:\Users\tc.IntelliJIdea2017.3路径下,删除config和system文件夹就可以恢复默认设置

2.2 如果导入的文件有乱码怎么办
  • 可以点击右下角的编码集字样的按钮,就可以设置当前文件的编码集。
  • Reload(是指以指定的字符集显示当前文件)
  • Convert(是指重新按指定的编码集重新编码当前文件)
2.3 IDEA下方的indexing一直自动刷新的解决方案

File-Invalidate Cache/Restart-选第一个重启即可

2.4 自动生成接口的测试代码
  • 首先在接口上快捷键:Ctrl+Shift+T,打开Create Test对话框
  • 在Testing library中选择JUnit4进行测试
  • 设置测试类的类名,一般是XxxTest(接口名+Test)
  • 设置Destination package,一般在项目中有test的包
  • 在下方选择要测试的方法
2.5 创建JavaEE工程时,没有带有WEB_INF文件夹和web.xml文件,如何创建?
  1. 进入项目结构对话框

  2. 进入Facet中创建web.xml文件

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BPLlYKBS-1623427371981)(E:\4_StudyVideo\picture\2021-05-27_041731.png)]

2.6 如何在当前工程中移除一个模块
  • 进入工程结构对话框,点击module-选中要移除的模块-点击上方的减号表示移除

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nmJjW4z6-1623427371983)(E:\4_StudyVideo\picture\2021-05-27_145102.png)]

2.7 IDEA在编译时出现 Cannot start process, the working directory … does not exist 的解决方案
  • 选择 Run-Edit configurations ,找到当前的项目,修改Working directory为 M O D U L E D I R MODULE_DIR MODULEDIR即可

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BcpN3KNO-1623427371985)(E:\4_StudyVideo\picture\2021-05-27_181345.png)]

2.8 解决IDEA包名折叠的情况
  • 在项目右上角选择设置按钮,把前两项取消勾选就可以了
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-StLrxZTw-1623427371985)(E:\4_StudyVideo\picture\2021-05-28_014129.png)]
2.9 解决Mybatis中文件没有拷贝到target目录中的问题
  • 首先检查resources文件夹名称是否正确,同时在pom.xml文件中,检查resources标签是否正确配置

    <build>
        <resources>
            <resource>
                <directory>src/main/java</directory>
                <includes>
                    <include>**/*.properties</include>
                    <include>**/*.xml</include>
                </includes>
                <filtering>false</filtering>
            </resource>
        </resources>
    </build>
    
  • 对整个项目进行重新构建,点击Build菜单下的Rebuild Project
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PIhTiJNh-1623427371986)(E:\4_StudyVideo\picture\2021-05-28_060408.png)]

2.10 取消Idea开始界面打开默认项目配置
  • 进入Setting设置界面, 选择Appearance & Behavior>System Settings, 在Startup/Shutdown栏目处,去掉默认的勾选Reopen last project on startup(在启动的时候打开上次的项目),去掉勾选之后,点击确认

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XmXxGZg9-1623427371987)(E:\4_StudyVideo\picture\2021-06-02_024427.png)]

3、IDEA的设置
  1. 设置IDEA的主题
    • Appearance & Behavior - Appearance - Theme
  2. 设置IDEA的代码颜色
    • Editor - Color Schema - Schema
  3. 开启鼠标滚轮调整字体大小
    • Editor - General - Change font size with Ctrl+Mouse Wheel
  4. 设置鼠标悬停提示的时间
    • Editor - General - Show quick documentation on mouse move
  5. 开启自动导包功能
    • Editor - General - Auto import - 选择ALL;并且打钩Add unambiguous import on the fly和Optimize import on the fly
  6. 显示方法的分隔符
    • Editor - General - Appearance - Show method separators
  7. 不区分大小写的提示
    • Editor - General - Code Completion - Case sensitive completion - None
  8. 取消代码标签折叠
    • Editor - General - Editor Tabs - Show tabs in single row(取消)
  9. 设置字体、大小、行间距
    • Editor - Font
  10. 修改注释的颜色
    • Editor - Color Schema - Language Defaults - Comments
  11. 修改文件的注释信息
    • Editor - File and Code Templates - File Header
  12. 设置项目的文件编码
    • Editor - File Encodings
  13. 开启自动重新编译文件运行(如果不勾选,每次都是运行的旧的文件)
    • Build Execution Deployment - Compiler - Build project automatically(勾选);Compile independent modules in parallel(勾选)
4、IDEA的模板
4.1 代码模板
  • 代码模板:代码模板的原理是配置一些常用的代码字母的缩写,在输入时可以出现预定义的固定代码,提高开发效率

  • 代码模板的位置:

    • Editor - Live Templates(用户可以进行自定义)
    • Editor - General - Postfix Completion(用户不能进行自定义,只能使用)
  • 常用代码模板

    • psvm:生成main方法框架
    • sout:生成System.out.println的输出方法
      • soutp(用于输出一个方法的形参)、p代表parameter
      • soutm(用于打印当前调用的方法名)、m代表method
      • soutv(用于打印当前方法里面的局部变量,在测试时经常使用,按照就近原则)、v代表variable
      • xxx.sout
    • fori:生成for循环
      • iter:生成增强的for循环
      • itar:基于最近的变量来推断出要遍历的对象,使用普通for循环来遍历
    • list.for:生成集合的遍历,其中list是要遍历的集合对象变量
      • list.fori:生成普通的for循环来遍历集合
      • list.forr:以倒序的普通for循环来遍历集合
    • ifn:生成判断对象变量是否是null的if语句
      • inn:生成判断对象变量是否不是null的if语句
      • xxx.null、xxx.inn
    • prsf:生成private static final的前缀
      • psf:生成public static final的前缀
  • 修改、自定义模板(Editor - Live Templates)

    • 具体方式:
      • 可以点击右上角的+号来添加一个新的组、新的模板
      • 可以写对应的模板简写、模板描述、模板文本
      • 用两个$$符号,来表示鼠标停留的位置
      • 最后,点击下方的define来设置在哪些地方要使用模板
4.2 文件模板
  • 文件模板:文件模板是预定义好的指定后缀文件,其核心内容是预先定义好的,省去从头编写文件的繁琐过程

  • 自定义文件模板
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qypgAE2E-1623427371989)(E:\4_StudyVideo\picture\2021-05-28_050248.png)]

  • 使用自定义文件模板
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-N34HvRTi-1623427371989)(E:\4_StudyVideo\picture\2021-05-28_050721.png)]

5、IDEA的快捷键
  1. 复制删除当前行

    1. 复制:Ctrl+d
    2. 删除:Ctrl+y
    3. 复制当前类的全限定名称:在类上右键-Copy Reference(Ctrl+Alt+Shift+C)
  2. 向上、下移动当前行

    1. 向上移动:Alt+Shift+↑
    2. 向下移动:Alt+Shift+↓
  3. 向上或向下插入一行

    1. 向下插入空行:Shift+Enter
    2. 向上插入空行:Alt+Ctrl+Enter
  4. 新建

    • 选中项目中的文件夹、包(包也是文件夹),点击Alt+Insert(还可以输入单词缩写过滤文件)
    • 选中要实现类,单击Alt+Enter可以进行接口的实现
  5. 收藏

    • 添加到收藏夹(类、方法):Alt+Shift+F
  6. 注释

    1. 单行注释:Ctrl+/
    2. 多行注释:Ctrl+Shift+/
  7. 错误:

    1. 定位下一个错误:F2
    2. 定位上一个错误:Shift+F2
  8. 记忆粘贴

    1. 打开最近剪贴板的拷贝记录:Ctrl+Shift+V
  9. 代码修改

    1. 标识符的整体修改:Shift+F6
    2. 文本的大小写转换:Ctrl+Shift+U
    3. 将局部变量抽取为成员变量:Alt+Ctrl+F
    4. 将局部代码步骤抽取为成员方法:Alt+Ctrl+M
    5. 整理当前.java源代码导入的包:Ctrl+Alt+O
  10. 展开与收起

    1. 全部展开的一个项目:选中该项目,点击数字键的*****号即可展开
    2. 一层一层展开一个项目:选中该项目,点击方向键的即是展开,方向键的即是收起
  11. 代码自动生成
    1. 给类添加get/set方法以及构造器等:ALt+Insert
    2. 使用XXX结构包围代码:Ctrl+Alt+t
    3. 根据使用环境,自动生成代码:Alt+Enter
    4. 在接口中自动生成测试代码:Ctrl+Shift+T

  12. 代码的格式

    1. 折叠全部代码:Ctrl+Shift±

    2. 展开全部代码:Ctrl+Shift++

    3. 格式化代码:Ctrl+Alt+L

  13. 运行与调试、终止

    1. 运行当前类文件(必须要当前类有main函数):Shift+F10
    2. 调试当前类文件(必须要当前类有main函数):Shift+F9
    3. 单步步过:F8
    4. 单步步入:F7
    5. 执行完当前方法并返回:Shift+F8
  14. 查询

    1. 当前类的概览(可以看当前类的所有构造器、属性、方法、代码块…,以及它们是否是静态、是怎样的访问权限):Ctrl+F12
    2. 在抽象类(接口)上查看有哪些类继承/实现了自己:Ctrl+Alt+B
    3. 查看一个类的继承图:Ctrl+H
    4. 查看一个类的继承图,以图形的形式显示:Alt+Ctrl+U
    5. 查看方法在哪里被调用:Alt+F7
  15. 提示

    1. 代码提示:Ctrl+Alt+Space
    2. 方法参数提示显示:Ctrl+P
  16. 搜索

    1. 文本查找:Ctrl+F(find)
    2. 文本替换:Ctrl+R(replace)
    3. 项目、模块、目录搜索替换:Ctrl+Shift+R(find in path)
      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8WTe4non-1623427371990)(E:\4_StudyVideo\picture\2021-05-18_010449.png)]
    4. 类搜索:Ctrl+N(go to class)
    5. 文件搜索:Ctrl+Shift+N(go to file)
  17. 最近打开、使用过的文件:Ctrl + E

  18. 重命名当前类(需要先选中类):Shift+F6

  19. Ctrl+w:选中当前选择的整个单词,多次点击可以递进式选择

  20. 局部隐藏代码:Alt+Ctrl+T+C

6、IDEA与服务器
6.1 在IDEA的当前项目中添加服务器(Tomcat)

点击Edit Configuration,点击左上方的+号,可以创建一个local的Tomcat服务器()

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VhzitUwj-1623427371991)(E:\4_StudyVideo\picture\2021-06-02_175022.png)]

6.2 将项目部署到Tomcat服务器中

点击Edit Configuration,点击Deployment选项卡,点击右方的+号,再点击artifact来向服务器部署一个项目

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Uf7LL0vp-1623427371992)(E:\4_StudyVideo\picture\2021-06-02_175438.png)]

然后进入当前项目的选择界面,如下,可以看到有两种部署的方式,一种是war,一种是war exploded

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cIFl8AED-1623427371993)(E:\4_StudyVideo\picture\2021-06-02_175702.png)]

选中项目部署后,可以看到下方有一个Application context,它表明了当前工程的访问路径,我们通过ip:port/Application context就可以访问到部署的项目(我们以项目的名字作为Application context的值)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-z6edSmDx-1623427371993)(E:\4_StudyVideo\picture\2021-06-02_205025.png)]

6.2 配置Tomcat服务器的相关属性
  • 原因:一个项目应该对应一个Tomcat服务器,通常我们会改动Tomcat服务器的名称,和当前项目的名称一致
  1. 点击Tomcat图片组合框,选择Edit Configurations…
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eVgTkuP5-1623427371994)(E:\4_StudyVideo\picture\2021-05-14_203344.png)]

  2. 部署服务器路径(当有访问到Tomcat服务器时,ip:port/后的工程与4所填写一致,则Tomcat会自动索引到当前项目中,所以这里我们应该填写我们的项目名。部署了项目名之后,就可以进行访问了)

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Ve5FAIj6-1623427371994)(E:\4_StudyVideo\picture\2021-05-14_203801.png)]

  3. 如果url是http://localhost:8080/项目名,则默认匹配的路径为项目名/web文件夹web.xml(创建JavaEE项目时,没有自动生成.xml文件)

    • 进入项目结构对话框(Project Structure),在Deployment Descriptors中添加文件

      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-275lhPJI-1623427371994)(E:\4_StudyVideo\picture\2021-05-14_225350.png)]

    • 在点击加号产生的对话框中,主要要添加一个web\的路径

      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rYJkhYBe-1623427371996)(E:\4_StudyVideo\picture\2021-05-14_225555.png)]

7、IDEA与调试
1. 必须知道的要点
  • 调试需要满足的前提是:断点+调试模式运行(调试模式需要点击小虫图标来启动)
2. 调试的图标

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-c2MeudOM-1623427371996)(E:\4_StudyVideo\picture\2021-05-14_210101.png)]

  1. Step Over:单步执行
    Step Into:单步步入
    Step Force Into:强制单步步入(一些系统函数使用单步步入没有效果,便可以使用该按钮强制步入)
    Step Out:调出当前执行的方法
    Run To Cursor:执行到光标所在位置
  2. Resume Program:恢复程序的执行,直到遇到下一个断点
    View BreakPoints:浏览和管理所有的断点
    Mute BreakPoints:沉默所有的断点,也就是让所有断点失效,但是并不是取消
  3. 方法的调用窗口,下面的方法调用上面的方法
  4. 变量窗口,可以看到当前方法里所有的可见变量
8、IDEA与测试
  • 自动生成测试代码:在接口上按住快捷键Ctrl+Shift+T,弹出Create Test对话框

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PM692tpb-1623427371996)(E:\4_StudyVideo\picture\2021-05-18_135601.png)]

9、IDEA与jar包
1. 将jar包直接添加到当前工程

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nPKKXnGc-1623427371996)(E:\4_StudyVideo\picture\2021-05-14_212634.png)]

2. 自定义类库添加jar包
  1. 打开项目结构对话框
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-r0rzJSJV-1623427371997)(E:\4_StudyVideo\picture\2021-05-14_212844.png)]
  2. 在Libraries中添加自定义类库(可以设置类库的名称、以及类库中包含的jar包)
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Zxkr4Sie-1623427371997)(E:\4_StudyVideo\picture\2021-05-14_213208.png)]
  3. 为模块添加自定义类库
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TwnSv9hI-1623427371998)(E:\4_StudyVideo\picture\2021-05-14_213530.png)]
3. 为当前类库添加新的jar包

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KM4kg4Ib-1623427371998)(E:\4_StudyVideo\picture\2021-05-14_214039.png)]

10、IDEA与插件
  • 如何找到安装的插件的配置界面(Setting-Other Setting)

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bXfyBwU4-1623427371999)(E:\4_StudyVideo\picture\2021-06-03_043043.png)]

10.1 Translation

一款嵌入在IDEA中的翻译插件,可以帮助我们对一些英文进行翻译。也可以对一些中文进行命名。快捷键Ctrl+Shift+Y:立即进行翻译(先选中需要翻译的单词)。Ctrl+Shift+S:表示切换翻译源。

10.2 Ace Jump

一款可以代替鼠标的软件,按下Ctrl+;进入ace模式,再按任意一个想要的字符,插件就会给屏幕中出现这个字符的所有位置打上标签。按Enter键是跳转到下一个标签,按Shift+Enter键是跳转到上一个标签

10.3 Alibaba Java Coding Guidelines

代码规范检查插件,我们只需要来我们的项目,类上右键-编码规约扫描(Ctrl+Alt+Shift+J),就可以获取是否满足代码规约要求,如果有不满足的,会在左下方Inspection Results进行输出(双击可以定位)。

10.4 String Manipulation

一个字符串的插件,暂时还不会使用

10.5 Key Promoter

一个提示快捷键的插件,当我们去通过鼠标点击一些操作按钮时,该插件会提示该操作的快捷键是什么

10.6 CodeGlance

快速定位代码的插件,就是右侧的小地图

10.7 Gsonformat

一款根据JSON的文本信息,快速生成javabean实体类的插件。使用是首先新建一个Javabean,不需要写内部的代码,然后,把光标移动到javabean中,按下Alt+S,把Json文本信息粘贴进去,点击OK就可以直接生成

10.8 Generate AllSetter

一款可以快速生成一个类对象的所有xxxSet()方法调用的插件。用于我们new一个对象的时候,想要对这个对象的所有属性进行set赋值,就可以使用该插件的功能。在对象上按Alt+Enter就可以给出提示

10.9 Codota

一款可以查询API使用示例的插件,我们可以通过此插件来查询我们想要查找的某个api的用法,节约查阅资料的时间。用法是选中要查询的api方法,右键-选择Get relevant example(Ctrl+Shift+O)

10.10 auto filling java call arguments

一个可以自动填充参数的插件,当我们使用构造函数,或者调用某个函数时,可以把光标放置在()括号中,按Alt+Enter,选择auto filling all parameters

11、IDEA与Maven
11.1 IDEA中整合Maven
  1. 在IDEA中设置Maven的属性

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fekjWkp6-1623427372000)(E:\4_StudyVideo\picture\2021-05-27_035242.png)]

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7JyrAftr-1623427372000)(E:\4_StudyVideo\picture\2021-05-27_040127.png)]

  2. 上面的设置只是针对当前的工程,如果想默认就使用这样的设置,需要在File-Other Settings-Default Settings中再进行一次设置

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mPtgyAwc-1623427372000)(E:\4_StudyVideo\picture\2021-05-27_040815.png)]

11.2 通过IDEA创建Maven管理的项目

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BxUIpaWT-1623427372001)(E:\4_StudyVideo\picture\2021-05-27_042103.png)]

11.3 如果IDEA创建的项目没有图标怎么办?

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2YEbP0OH-1623427372001)(E:\4_StudyVideo\picture\2021-05-27_043153.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sYB394Qo-1623427372001)(E:\4_StudyVideo\picture\2021-05-27_043229.png)]

11.4 在IDEA中快速测试代码

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rXxuVyNA-1623427372002)(E:\4_StudyVideo\picture\2021-05-27_044215.png)]

11.5 在IDEA中进行Maven的插件操作

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gUmCCXjW-1623427372002)(E:\4_StudyVideo\picture\2021-05-27_045248.png)]

11.6 如果修改了pom.xml文件,如何使其快速生效
  • 方法一:通过pom.xml文件右键的方式来Reimport,这种方式是刷新一个项目

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PNSfndE3-1623427372003)(E:\4_StudyVideo\picture\2021-05-27_045545.png)]

  • 方式二:在maven的工具栏上,点击刷新的图标,这样刷新是刷新所有的maven项目

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BeLVfVS3-1623427372003)(E:\4_StudyVideo\picture\2021-05-27_144317.png)]

11.7 在IDEA中导入一个maven项目
  1. 打开Project structure,选择Modules,点击左上角的绿色加号,点击Import Module

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zN1yhYlE-1623427372004)(E:\4_StudyVideo\picture\2021-05-27_145320.png)]

  2. 选择模块文件夹的位置,点击OK

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9KOwYynt-1623427372004)(E:\4_StudyVideo\picture\2021-05-27_145552.png)]

  3. 选择导入的模块的类型,点击OK,之后一直点击next即可

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-L6iO7hpt-1623427372005)(E:\4_StudyVideo\picture\2021-05-27_145652.png)]

11.8 如何修改Maven默认仓库的位置

打开maven路径下的conf/settings.xml,在第55行可以看到一个localRepository的标签,在其中指明仓库的位置即可

11.9 通过maven来创建一个web项目要注意的点
  • 在main文件夹下建立java文件、resources文件夹
  • 在main文件夹平级创建一个test文件夹
  • 在test文件夹下创建java文件夹 和resources文件夹
12、IDEA与MyBatis
12.1 在IDEA中使用MyBatis的步骤
  1. 在pom.xml文件中,添加相关的依赖

    <!--mybatis的依赖-->
    <dependency>
        <groupId>org.mybatis</groupId>
        <artifactId>mybatis</artifactId>
        <version>3.5.1</version>
    </dependency>
    <!--mybatis和spring集成的依赖-->
    <dependency>
        <groupId>org.mybatis</groupId>
        <artifactId>mybatis-spring</artifactId>
        <version>1.3.1</version>
    </dependency>
    <!--数据库连接池-->
    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>druid</artifactId>
        <version>1.1.12</version>
    </dependency>
    <!--数据库依赖-->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>8.0.25</version>
    </dependency>
    
  2. 在resources中创建mybatis.xml作为主配置文件

    <settings>
        <setting name="logImpl" value="STDOUT_LOGGING"/>
    </settings>
    <!--设置别名,在mapper文件中就可以直接使用别名,无需全限定名称了-->
    <typeAliases>
        <!--该包下的所有类名就作为别名-->
        <package name="com.bjpowernode.entity"></package>
    </typeAliases>
    <mappers>
        <!--该包下所有的.xml文件都当做映射文件-->
        <package name="com.bjpowernode.dao"></package>
    </mappers>
    
  3. 编写XxxDao接口类和XxxDao.xml的mapper文件

    <mapper namespace="com.bjpowernode.dao.OrderDao">
        <select id="insertStudent" resultType="Student">
            INSERT INTO `student`(`id`,`name`,`email`,`age`) VALUES(#{id},#{name},#{email},#{age})
        </select>
     
        <select id="selectStudents" resultType="Student">
            SELECT `id`,`name`,`email`,`age` FROM `student` ORDER BY `id`
        </select>
    </mapper>
    
  4. 在IOC的配置文件(applicationContext.xml)中,进行属性的配置

    <!--在xml文件中加载一个.properties文件,使用context:property-placeholder标签-->
    <context:property-placeholder location="classpath:jdbc.properties"></context:property-placeholder>
    <!--获取druid的数据库连接,通过${}读取.properties文件中的key-->
    <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close">
        <property name="url" value="${jdbc.url}"></property>
        <property name="username" value="${jdbc.username}"></property>
        <property name="password" value="${jdbc.password}"></property>
        <property name="maxActive" value="${jdbc.maxActive}"></property>
    </bean>
    <!--创建sqlSessionFactory对象,把我们自己创建的druid连接池信息,和mybatis.xml配置文件的路径注入到此对象中-->
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <!--set注入,把数据库连接池信息赋值给DataSource属性-->
        <property name="dataSource" ref="dataSource"></property>
        <!--指定mybatis注配置文件的位置-->
        <property name="configLocation" value="classpath:mybatis.xml"></property>
    </bean>
    <!--固定写法,根据接口类直接创建其实现代理类对象-->
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"></property>
        <property name="basePackage" value="com.bjpowernode.dao"></property>
    </bean>
    
    <bean id="studentService" class="com.bjpowernode.service.impl.StudentServiceImpl">
        <property name="studentDao" ref="studentDao"></property>
    </bean>
    
13、IDEA与Spring
13.1 IDEA创建xml文件的选项中,没有Spring Config

因为没有导入spring-context的依赖,我们需要在maven的pom.xml文件中,添加spring-context的依赖即可

13.2 在IDEA中使用Soring的步骤
  1. 在pom.xml中,添加相关的依赖

    <!--spring中的ioc相关依赖-->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <version>5.3.7</version>
    </dependency>
    <!--spring中的aop相关依赖-->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-aspects</artifactId>
        <version>5.3.7</version>
    </dependency>
    
  2. 在resources目录下的applicationContext文件中,利用标签进行bean对象的创建(IOC)

    <bean id="myStudent" class="com.bjpowernode.ba01.Student">
        <property name="name" value="张三"></property>
        <property name="age" value="12"></property>
    </bean>
    
    @Component("student")
    public class Student {
    	......
    }
    
  3. 在resources目录下的applicationContext文件中,开启切面自动代理(AOP);创建业务逻辑类,我们可以创建一个切面类,在类中使用切入点表达式来进行aop操作

     <aop:aspectj-autoproxy proxy-target-class="true"></aop:aspectj-autoproxy>
    
    @Aspect
    public class MyAspect {
        @Pointcut(value = "execution(* *..ba07.*.*(..))")
        	......
        @Before(value = "myPointCut()")
            ......
        @After(value = "myPointCut()")
            ......
        @AfterReturning(value = "myPointCut()")
            ......
        @AfterThrowing(value = "myPointCut()")
            ......
    }
    
14、IDEA与GitHub
14.1 为IDEA添加一个Git账户

进入Settings-Version Control-GitHub-Add account

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AHZ6QYEU-1623427372006)(E:\4_StudyVideo\picture\2021-06-08_141315.png)]

  • 在登录时,有可能会遇到账号无法登录的问题,需要在Git中创建一个Token,即令牌。在Git的网站上, 进入Setting-Development settings-Generate new token即可(勾选repo、gist)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Q00crfTg-1623427372006)(E:\4_StudyVideo\picture\2021-06-08_170555.png)]

14.2 在IDEA中为当前项目配置本地Git仓库

单击VCS(Version Control System)菜单,点击Import into Version Control-Create Git Repository。这一步操作就是创建一个本地仓库,是IDEA帮我们创建的,可以在我们指定的目录中找到.git目录

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-187DUGvY-1623427372006)(E:\4_StudyVideo\picture\2021-06-08_171304.png)]

14.3 将当前项目提交到暂存区,从暂存区上传到本地仓库,从本地仓库上传到远程仓库

在模块上点击右键-Git-Add即可提交到暂存区

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-59gLHNVF-1623427372006)(E:\4_StudyVideo\picture\2021-06-08_171741.png)]

提交到暂存区后,就可以点击Commit Directory提交到本地仓库

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-l2zCFqHD-1623427372007)(E:\4_StudyVideo\picture\2021-06-08_172338.png)]

当本地仓库有代码了之后,就可以点击目录下的Repository-Push,然后输入远程仓库的url,就可以完成提交

14.4 使用IDEA从云端clone项目

点击File-New-Project from Version Control…

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-W0sHWo1q-1623427372007)(E:\4_StudyVideo\picture\2021-06-08_174955.png)]

在弹出的对话框中继续选择,最后选择Clone即可开始

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2KQYLyK5-1623427372008)(E:\4_StudyVideo\picture\2021-06-08_175239.png)]

14、IDEA中发生的错误以及解决方法
14.1 MyBatis中,进行测试方法报告,抛出异常

org.apache.ibatis.binding.BindingException。(这个错误从提示来看不明显,其原因是xxxDao.xml中配置写错了)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8GJ5b7uj-1623427372008)(E:\4_StudyVideo\picture\2021-05-28_134924.png)]

14.2 在服务器返回ajax响应的数据时,抛出异常(注意)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uE5RnjsL-1623427372009)(E:\4_StudyVideo\picture\2021-06-05_061034.png)]

可以看出,错误的原因是返回的ArrayList类型的数据,没有找到合适的转换器对象来讲其转换为json格式的数据。可以看我们的代码,所有的依赖,注解驱动等都添加了,为什么失败呢?原因就是springmvc中的配置文件导入的名称空间错了

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CKg7e3Fj-1623427372009)(E:\4_StudyVideo\picture\2021-06-05_061348.png)]

可以看到,这里有很多同名的annotation-driven,就是因为导入包导错了,导入成了alibaba的包,正确的包应该是http://www.springframework.org/schema/mvc才是正确的

14.3 在启动服务器时抛出错误java.rmi.server.ExportException: Port already in use: 1099;…

这是应为某个应用程序已经占用了tomcat容器的指定端口,我们需要通过cmd- netstat -ano 后出现列表,在列表中找到指定冲突的端口的进程id,在任务管理器中关闭此进程即可解决

14.4 Mybatis中,执行sqlSessionFactory.openSession()时,抛出NullPointerException异常

找了一会儿,发现错误是在Mybatis的配置文件中出错了,

14.5 手写动态代理invoke方法后,调用Proxy.getProxy()返回null对象
public class TransactionInvocationHandler implements InvocationHandler {
    private Object target;

    public TransactionInvocationHandler(Object target) {
        this.target = target;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        SqlSession sqlSession = null;
        Object result = null;
        try {
            sqlSession = SqlSessionUtil.getSqlSession();
            result = method.invoke(args);
            sqlSession.commit();
        } catch (Exception e) {
            sqlSession.rollback();
            e.printStackTrace();
        } finally {
            SqlSessionUtil.closeSqlSession(sqlSession);
        }
        return result;
    }

    public Object getProxy() {
        Object proxy = Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), this);
        return proxy;
    }
}
14.6 使用Mybatis框架时,出现org.apache.ibatis.binding.BindingException异常

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jRcelG5W-1623427372010)(E:\4_StudyVideo\picture\2021-06-10_060428.png)]

15、常见问题解决思路
15.1 set\getAttribute、set\getParameter有什么区别?
  • setParameter()获取的是客户端设置的数据(一般是客户端提交表单等操作);getParameter永远返回字符串
  • xxxAttribute()获取的是服务器设置的数据(一般用于一次请求多次跳转之间共享一些数据)。getAttribute()返回值是任意类型
15.2 Servlet有哪些域对象?他们分别是什么类型?它们的声明周期如何?
对象名称对象类型创建时机销毁时机生命周期
requestHttpServletRequest客户端向服务器发送一次请求,服务器就创建一个request对象服务器对请求做出响应后就会销毁request对象在一次请求中有效
sessionHttpSession当服务器为某一个客户端的请求第一次调用getSession()时,一个Session被创建1.session过期,默认30分钟;
2.手动调用session.invalidate();
在一次会话中有效。在web中,一次会话是指浏览器的不关闭
applicationServletContext服务器启动时,服务器为每个WEB应用创建一个属于该web项目的对象的ServletContext类.服务器关闭或者项目从服务器中移除的时候.与服务器具有相同的生命周期
对象名称对象类型创建时机销毁时机生命周期
pageContextPageContextImpl当进入当前JSP页面当离开当前JSP页面当前JSP页面范围内有效(如果使用请求跳转到其他页面,pageContext对象中存储的数据将无效)
15.3 什么是过滤器?什么是监听器?什么是拦截器?SSM整合开发中如何配置web.xml?
xx器功能应用场景使用步骤
过滤器用于拦截请求,当请求满足.xml文件中配置好的被拦截要求时,就可以拦截到请求设置request、response的参数,如过滤字符编码1.Filter是一个接口,它是由Java提供的。如果我们要手动实现一个过滤器,需要先定义出该接口实现类。
2.在web.xml中去配置过滤器,通过filter标签来配置过滤器,通过filter-mapping来配置在哪些地方应用过滤器
监听器他可以监听服务器中ServletContext对象的创建和销毁。
做一些初始化的内容添加工作、设置一些基本的内容、比如一些参数或者是一些固定的对象等等
使用监听器创建Spring容器对象1.ServletContextListener是一个接口,它是由Java提供的。如果我们要手动实现一个监听器,需要先定义出该接口实现类。
2.在web.xml中去配置监听器,通过listener标签来配置监听器。配置好后,当ServletContext对象被创建和销毁时,会自动调用我们实现的方法
拦截器拦截器是属于SpringMVC框架中的一个组件,当用户的请求访问到中央调度器时,将由拦截器所拦截,进而可以验证请求参数,能够截断请求拦截器有AOP的思想,它常被用于做各种验证,一个项目中可以有很多拦截器1.HandlerInterceptor是一个接口,我们的类首先要实现此接口(接口有三个重要的方法,他们的default的,可以按需要来重写三个方法)
2.在SpringMVC的配置文件中,使用mvc:interceptors标签来声明拦截器,通过mvc:mapping指定要拦截的请求地址,通过bean指定要处理拦截的拦截器
<!--中央调度器-->
<!--使用spring框架已经写好的Servlet的接口实现类DispatcherServlet-->
<!--通过配置contextConfigLocation属性的值来设置默认SpringMVC的配置文件的路径-->
<!--通过load-on-startup标签设置当服务器启动时,立即创建该servlet对象-->
<!--通过servlet-mapping标签哪些请求由当前Servlet来处理,此处代表所有以.do结尾的请求都有该对象处理/-->
<servlet>
    <servlet-name>myweb</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:conf/dispatcherServlet.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
    <servlet-name>myweb</servlet-name>
    <url-pattern>*.do</url-pattern>
</servlet-mapping>

<!--监听器-->
<!--使用spring框架已经写好的ServletContextListenerdr的接口实现类 ContextLoaderListener-->
<!--通过配置contextConfigLocation属性的值来修改默认的Spring配置文件位置(默认的位置为WEB-INF/applicationContext.xml)。-->
<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath:conf/applicationContext.xml</param-value>
</context-param>
<listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

<!--过滤器-->
<!--使用spring框架已经写好的Filter的接口实现类CharacterEncodingFilter-->
<!--CharacterEncodingFilter是spring框架定义的一个过滤器,我们使用init-param为其属性进行赋值,使用filter-mapping来指定filter过滤器要应用的位置,/*表示应用来所有请求和响应上-->
<filter>
    <filter-name>characterEncodingFilter</filter-name>
    <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
    <init-param>
        <param-name>encoding</param-name>
        <param-value>UTF-8</param-value>
    </init-param>
    <init-param>
        <param-name>forceRequestEncoding</param-name>
        <param-value>true</param-value>
    </init-param>
    <init-param>
        <param-name>forceResponseEncoding</param-name>
        <param-value>true</param-value>
    </init-param>
</filter>
<filter-mapping>
    <filter-name>characterEncodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>
15.4 SpringMVC、Spring、Mybatis的配置文件分别是怎样的?
  • SpringMVC的配置文件(dispatcherServlet.xml)
<!--    组件扫描器-->
<!--    因为要使用注解式开发,所以要在类中添加注解,为了SpringMVC可以知道当前是使用注解式开发,所以要添加组件扫描器,base-package代表要扫描的包,SpringMVC便可以扫描包后创建对象到其容器中-->
<context:component-scan base-package="com.bjpowernode.controller" />
<!--    内部资源视图解析器-->
<!--    作用是在Controller返回的时候进行解析视图,将prefix和suffix添加到返回的视图的前后-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <property name="prefix" value="/WEB-INF/jsp/"></property>
    <property name="suffix" value=".jsp"></property>
</bean>
<!--    注解驱动-->
<!--    作用是让初学者可以快速应用默认配置方案,当SpringMVC读取到此内容时,会立即帮我们创建7个对象,这7个对象中就有重要的消息转换器HttpMessageConverter,得以将Java对象自动转换为Json对象进行Ajax响应-->
<mvc:annotation-driven />
  • Spring的配置文件(applicationContext.xml)
<!--    属性定位器-->
<!--    通过属性定位器,可以让.xml文件可以加载一个.properties文件-->
<context:property-placeholder location="classpath:conf/jdbc.properties" />

<!--    德鲁伊数据源对象-->
<!--    javax.sql.DataSource是javax提供的一个接口,它的实体类代表了与数据库的连接,所以此对象表示与数据库建立连接-->
<bean id="dataSource"
      class="com.alibaba.druid.pool.DruidDataSource"
      init-method="init"
      destroy-method="close">
    <property name="url" value="${jdbc.url}" />
    <property name="username" value="${jdbc.username}" />
    <property name="password" value="${jdbc.password}" />
    <property name="maxActive" value="${jdbc.maxActive}" />
</bean>

<!--    创建Sql会话工厂-->
<!--    SqlSessionFactory是MyBatis中的一个重要的对象,它是用来创建SqlSession对象的,而SqlSession用来操作数据库的。SqlSessionFactory是线程安全的,它一旦被创建,应该在应用执行期间都存在。在应用运行期间不要重复创建多次,应使用单例模式。-->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
    <property name="dataSource" ref="dataSource"/>
    <property name="configLocation" value="classpath:conf/mybatis.xml" />
</bean>

<!--    组件扫描器-->
<!--    功能等同SpringMVC中的组件扫描器,这里是创建service层的对象-->
<context:component-scan base-package="com.bjpowernode.service" />

<!--    组件扫描器-->
<!--    此处是创建dao的代理类对象-->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
    <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
    <property name="basePackage" value="com.bjpowernode.dao"/>
</bean>
  • Mybatis的配置文件
<!--    打印日志-->
<settings>
	<setting name="logImpl" value="STDOUT_LOGGING"/>
</settings>

<!--设置别名-->
<typeAliases>
    <package name="com.bjpowernode.domain"></package>
</typeAliases>

<mappers>
    <!--该包下所有的.xml文件都当做映射文件-->
    <package name="com.bjpowernode.dao"></package>
</mappers>
15.4 Spring中@Autowired和@Resource,对于属性值的自动注入有什么区别
自动注入属性的方式特点注意
@Autowired需要在引用属性上使用注解@Autowired,该注解默认使用按类型自动装配 Bean 的方式因为是按类型来自动的匹配,难免有时候会有相同类型的多个类对象的问题,可以与@Qualifier注解的搭配使用
@Resource@Resource 注解若不带任何参数,采用默认按名称的方式注入,如果按名称不能注入, 则会按照类型进行 Bean 的匹配注入可以通过name属性来指定匹配的名称
15.5 HTTP协议中的重要key含义
response响应头含义举例设置方式
Content-Type代表服务器响应数据的内容的类型text/html;charset=UTF-81.通过设置jsp的page标签中的contentType
2.通过response.setContentType来设置
15.6 JSP页面中的常用指令
标签功能代码
pagepage指令可以修改jsp页面中一些重要的属性、行为<%@ page contentType=“text/html;charset=UTF-8” language=“java” %>
includeinclude指令可以指定当前JSP页面要静态包含的部分JSP页面,避免重复编写代码<%@ include file="/include/footer.jsp"%>
jsp:forwardjsp:forward指令可以通过标签的方式来使当前页面进行跳转<jsp:forward page="/scope2.jsp"></jsp:forward>
15.7 什么是EL表达式?它的作用是什么?

全称是Expression Language,主要是替代jsp页面中的表达式脚本在jsp页面中进行数据输出,对它的使用主要是获取域对象中的数据。

  • EL表达式中如果直接写对象的名称,此时默认搜索域中数据的顺序是:pageContext->request->session->application(按照从小到大的顺序搜索),只要在某个域对象中找到了指定的key,就会得到这个key所对应的value。
  • 如果想要指定在哪个域中获取指定key的value,我们可以使用EL表达式中定义的4个隐含对象,我们是pageScope、requestScope、sessionScope、applicationScope,它们的类型都是Map<String,Object>类型,通过.get(key…)就可以得到指定域中的key所对应的value
  • 如果想获得<%…%>的JSP代码脚本中定义的局部变量,以目前的知识,只能通过JSP的表达式语句获得,即<%=…%>的方式来获得
EL表达式的11个隐含对象数据类型功能
pageContextPageContextImpl获取JSP中的九大内置对象
pageScopeMap<String,Object>获取 pageContext 域中的数据
requestScopeMap<String,Object>获取 Request 域中的数据
sessionScopeMap<String,Object>获取 Session 域中的数据
applicationScopeMap<String,Object>获取 ServletContext 域中的数据
15.8 JQuery
1. JQuery中存取值的理解
方式类比原生JS解释
val(值)、val()document.getElementById(“xxx”).valuevalue是代表标签元素中的属性的value值
html(值)、html()document.getElementById(“xxx”).innerHTMLinnerHTML代表标签元素中的内容,也就是标签对之间的内容
text(值)、text()document.getElementById(“xxx”).innerTextinnerText和innerHTML很类似,但是不同的是innerText只针对内容本身,而innerHTML还可以动态的编写标签元素
2.使用JQuery寻找标签元素的方法
选择器语法
id选择器$("#id")用#号+标签的id
tag选择器$(“tag”)直接写标签名,查找到所有查找标签的所有元素
class选择器$(".class")用.号+标签的class
3.Ajax的几种表现形式
方式解释
$.ajax(…)基于jquery的ajax的最标准的表现形式,该形式功能齐全,使用方便,在未来的实际项目开发中,应用的最广泛
$.get(…)/post(…)该形式是基于上述$.ajax的简写形式,使用更加方便。但是在保留了核心ajax功能的同时,也去除了一些扩展功能。如果要使用额外的扩展功能,需要在ajax体外写额外代码。虽然功能不全,但是使用非常方便,在实际项目开发中使用的也很普遍
$.getJSON()该形式是专门针对于json数据解析的形式,该形式在市场上问世较晚,所以没有上述两种形式使用的多
4.$.ajax(…)中的重要参数
参数功能
url代表当前ajax要请求的后台servlet/Controller的url地址
data要提交的数据,可以使用json的形式,也可以使用一般的形式
dataType表名后台响应回数据的格式,用json来表示后台响应json数据,用text来表示后台响应文本数据
type表示请求后台的方式,可以是get或post
async表示当前ajax是否异步执行,默认是true
success回调函数,当请求完成后,会将数据传递给data参数
15.9 HTTP协议
1. 项目中什么时候用Get?什么时候用Post?
  • Get字面意思是取,拿,得到,在实际项目开发中,核心业务是以 查询 为目的,我们都是发出get请求

  • Post字面意思是投递,在实际项目开发中,核心业务是以 添加、修改、删除 为目的,我们都是发出Post请求

2. 前端向后端传值的方式
  • 通过url传参
  • 通过form表单传参
  • 通过ajax以json格式传参
15.10.Json
1. Json格式的意义?

在网络传输中,后端给前端专传输数据,为了让开发更加的便捷,后端希望是直接传输domain,bean等实体类(实体类就是封装属性的一个容器,这样做是为了简化一个对象里面有很多属性的问题,管理一个对象比管理一堆属性要简单很多),但是我们直接把实体类传给前端,前端是用不了的,我们需要使用一个媒介,先把java对象转换为json格式,然后前端解析json格式,也就得到了转换的对象。

15.11 SQL
1. 在实际项目开发中,表的主键是采用什么形式呢?

采用的是UUID的方式,而不是采用int类型,并且使用auto_increment这样的自动递增。因为SQL内部,当添加一条记录时,它会先计算以下当前最大的id是多少,然后对其进行+1。当数据量特别大的时候,比如千万级别,这种方式是效率十分低下的。所以就应该使用UUID来当主键。

15.12 Mybatis
1. 如何搭建Mybatis环境
  • Mybatis有两类重要的配置文件,一类是主配置文件,一类是与每一个DAO(数据库的每一个表)相关的配置文件

    • Mybatis主配置文件(完成事务和数据源(数据库连接池)的配置,同时要声明映射xml文件,Mybatis才知道哪些配置文件是映射文件)

      <configuration>
          <properties resource="jdbc.properties"></properties>
          <typeAliases>
              <!--<typeAlias type="com.bjpowernode.domain.Student" alias="Student"></typeAlias>-->
              <package name="com.bjpowernode.domain"/>
          </typeAliases>
          <environments default="development">
              <environment id="development">
                  <transactionManager type="JDBC"></transactionManager>
                  <dataSource type="POOLED">
                      <property name="driver" value="${jdbc.driver}"/>
                      <property name="url" value="${jdbc.url}"/>
                      <property name="username" value="${jdbc.username}"/>
                      <property name="password" value="${jdbc.password}"/>
                  </dataSource>
              </environment>
          </environments>
          <mappers>
      		<!--<mapper resource="com/bjpowernode/dao/StudentDao.xml"></mapper>-->
              <package name="com.bjpowernode.dao"/>
          </mappers>
      </configuration>
      
    • MyBatis映射文件,与每个DAO相关的配置文件(要声明当前配置文件的名称空间,一般以DAO类名命名,Mybatis通过namespace.id就可以找到任意一个sql语句)

      <mapper namespace="testNamespace">
          <select id="selectStudentById" parameterType="String" resultType="Student">
              select id,name,age from student where id=#{id}
          </select>
          <!--当表列名和字段名不一致时使用-->
          <resultMap id="stuMap" type="Student">
              <id property="id" column="id"></id>
              <result property="name" column="fullname"></result>
              <result property="age" column="age"></result>
          </resultMap>
          <!--需求是需要添加多个判断条件时使用,如很多的and、or等语句-->
          <select id="select13" resultType="Student">
              select * from student
              <where>
                  <if test="name != null and name != ''">
                      and name like '%' #{name} '%'
                  </if>
                  <if test="address != null and address != ''">
                      and address like '%' #{address} '%'
                  </if>
              </where>
          </select>
          <!--需求是使用in时,条件中的很多属性需要根据传入的参数来动态的生成SQL语句-->
      	<select id="select14" resultType="Student">
              select * from student where id in
              <foreach collection="array" item="id" open="(" close=")" separator=",">
                  #{id}
              </foreach>
          </select>
          <!--创建SQL片段-->
          <sql id="sqlHead">
              select id,name,age,address from Student
          </sql>
      	<!--使用SQL片段-->
          <select id="select15" resultType="Student">
              <include refid="sqlHead" /> where id=#{id}
          </select>
      </mapper>
      
      • 关于parameterType属性
      • 关于resultType属性
      • 关于resultMap标签、resultMap属性
      • 关于where标签、if标签、foreach标签
      • 关于foreach标签
      • 关于sql标签
  • 对Mybatis的使用,其核心是SqlSession对象,该对象可以通过SqlSessionFactoryBuilder->SqlSessionFactory->调用openSession()来得到,通过该对象,我们就可以根据namespace.id来找到指定的sql语句

    String resource = "mybatis-config.xml";
    InputStream inputStream = null;
    try {
        inputStream = Resources.getResourceAsStream(resource);
    } catch (IOException e) {
        e.printStackTrace();
    }
    SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
    SqlSession sqlSession = sqlSessionFactory.openSession();
    Student student = sqlSession.<Student>selectOne("testNamespace.selectStudentById", "A0002");
    
3. 动态代理用在MVC中的哪一层?

用在service业务层。因为Controller层用于处理用户请求,它无需动态代理。动态代理常被用于事务的管理,在一个事务中,可能会多次调用DAO持久层,所以,我们需要在service中使用动态代理,从而进行事务的提交。

  • 手写Spring中AOP的实现过程(使用JDK的InvocationHandler动态代理类来完成)

    public class TransactionInvocationHandler implements InvocationHandler {
        private Object target;
    
        public TransactionInvocationHandler(Object target) {
            this.target = target;
        }
    
        @Override
        public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
            SqlSession sqlSession = null;
            Object result = null;
            try {
                sqlSession = SqlSessionUtil.getSqlSession();
                result = method.invoke(args);
                sqlSession.commit();
            } catch (Exception e) {
                sqlSession.rollback();
                e.printStackTrace();
            } finally {
                SqlSessionUtil.closeSqlSession(sqlSession);
            }
            return result;
        }
    
        public Object getProxy() {
            return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), this);
        }
    }
    
4. 为什么持久层和业务层都需要接口类呢?

因为这两个类都是需要动态代理以增强功能,比如业务层需要提交事务,持久层每一个方法都需要先拿到sqlSession对象,最后要返回出结果(可以使用动态代理来帮助完成繁琐的操作,让我们只写SQL语句)。如果有接口类,那么他们的上层(对于持久层来说上层就是业务层,对于业务层来说,上层就是控制层)在使用他们时,就可以传入一个动态代理来增强它们,而不是传入他们的实现类对象。所以,这就是需要为持久层和业务层定义接口类的一大原因。经过Mybatis的处理,我们创建的是interface,实际使用的确实增强的代理类

5. 如何理解动态代理是如何运行起来的

在Service中,其实现类是不具有事务功能的,从单一职责的方向来思考,事务是DAO中的概念,为了方便在Service中具有事务功能,我们可以使用动态代理。动态代理(用JDK的方式实现)是在程序的运行中,Java为我们编译出代理类的.class文件,然后装载到虚拟机中,最后通过反射来生成代理类对象

6.mybatis如何使用模糊查询
    <select id="select6" resultType="Student">
        select * from student where name like '%' #{name} '%'
    </select>
7. mybatis中,当表列名和domain类字段名不一致时如何处理

产生错误的原因是查询到的列名在domain中找不到字段名与之对应,所以,mybatis就不会对字段名赋值。

  • 方式一:在SQL语句中为查询的列名起别名
  • 方式二:使用resultMap标签和resultMap属性来解决
8.什么是动态SQL

动态SQL方便处理带各种查询条件的情况,当为SQL语句设置查询条件是,比如name,gender,age…当他们交错起来查询,我们要写的SQL语句呈指数的形式增长。所以使用了mybatis的动态SQL,就可以很好的解决这种情况。mybatis的自动的根据我们参数有多少个,来动态的,有规律的生成一个临时的SQL语句提供给我们来查询。

动态SQL中,常用的有where标签和foreach标签,where用来处理where子句有很多and、or的情况,foreach用来处理in中很多属性的情况

9.什么是SQL片段

SQL片段mybatis提供了的,为了解决mapper映射文件中,大量的重复的SQL语句片段,如select * from student…这样的,可以看到在每一个SQL语句中,都有这样的语句。

但是在企业的开发中,认为SQL片段虽然有好处,但是也有坏处,坏处就是导致代码的可读性变得很差,所以一般企业中都不会使用这个SQL片段,偶尔用用就是来子查询中使用

10.使用mybatis进行多表联查

对于多表联查,我们有两种处理方式,一种是使用Map来装查询的结果,一种是使用VO对象来装查询的结果。从使用上来说,Map无需创建类,但是写起来不方便,而VO需要创建类,但使用起来方便。所以,主要看使用频率,如果频率高,就可以选择VO,反之,就用Map,显得更加的轻量级

<!--使用Map-->
<select id="select16" resultType="Map">
    select s.name as sname,c.name as cname from student as s inner join classroom as c on s.classroom=c.id
</select>
<!--使用VO-->
<select id="select17" resultType="com.bjpowernode.vo.StudentAndClassroom">
    select
    s.id as sid,
    s.name as sname,
    s.age as sage,
    s.address as saddress,
    c.id as cid,
    c.name as cname
    from student as s inner join classroom as c on s.classroom=c.id
</select>
  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值