IDEA
文章目录
- 2、IDEA的技巧
- 2.1 如果不小心把IDEA的配置搞崩溃了
- 2.2 如果导入的文件有乱码怎么办
- 2.3 IDEA下方的indexing一直自动刷新的解决方案
- 2.4 自动生成接口的测试代码
- 2.5 创建JavaEE工程时,没有带有WEB_INF文件夹和web.xml文件,如何创建?
- 2.6 如何在当前工程中移除一个模块
- 2.7 IDEA在编译时出现 Cannot start process, the working directory ... does not exist 的解决方案
- 2.8 解决IDEA包名折叠的情况
- 2.9 解决Mybatis中文件没有拷贝到target目录中的问题
- 2.10 取消Idea开始界面打开默认项目配置
- 3、IDEA的设置
- 4、IDEA的模板
- 5、IDEA的快捷键
- 6、IDEA与服务器
- 7、IDEA与调试
- 8、IDEA与测试
- 9、IDEA与jar包
- 10、IDEA与插件
- 11、IDEA与Maven
- 12、IDEA与MyBatis
- 13、IDEA与Spring
- 14、IDEA与GitHub
- 14、IDEA中发生的错误以及解决方法
- 14.1 MyBatis中,进行测试方法报告,抛出异常
- 14.2 在服务器返回ajax响应的数据时,抛出异常(注意)
- 14.3 在启动服务器时抛出错误java.rmi.server.ExportException: Port already in use: 1099;....
- 14.4 Mybatis中,执行sqlSessionFactory.openSession()时,抛出NullPointerException异常
- 14.5 手写动态代理invoke方法后,调用Proxy.getProxy()返回null对象
- 14.6 使用Mybatis框架时,出现org.apache.ibatis.binding.BindingException异常
- 15、常见问题解决思路
- 15.1 set\getAttribute、set\getParameter有什么区别?
- 15.2 Servlet有哪些域对象?他们分别是什么类型?它们的声明周期如何?
- 15.3 什么是过滤器?什么是监听器?什么是拦截器?SSM整合开发中如何配置web.xml?
- 15.4 SpringMVC、Spring、Mybatis的配置文件分别是怎样的?
- 15.4 Spring中@Autowired和@Resource,对于属性值的自动注入有什么区别
- 15.5 HTTP协议中的重要key含义
- 15.6 JSP页面中的常用指令
- 15.7 什么是EL表达式?它的作用是什么?
- 15.8 JQuery
- 15.9 HTTP协议
- 15.10.Json
- 15.11 SQL
- 15.12 Mybatis
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文件,如何创建?
-
进入项目结构对话框
-
进入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的设置
- 设置IDEA的主题
- Appearance & Behavior - Appearance - Theme
- 设置IDEA的代码颜色
- Editor - Color Schema - Schema
- 开启鼠标滚轮调整字体大小
- Editor - General - Change font size with Ctrl+Mouse Wheel
- 设置鼠标悬停提示的时间
- Editor - General - Show quick documentation on mouse move
- 开启自动导包功能
- Editor - General - Auto import - 选择ALL;并且打钩Add unambiguous import on the fly和Optimize import on the fly
- 显示方法的分隔符
- Editor - General - Appearance - Show method separators
- 不区分大小写的提示
- Editor - General - Code Completion - Case sensitive completion - None
- 取消代码标签折叠
- Editor - General - Editor Tabs - Show tabs in single row(取消)
- 设置字体、大小、行间距
- Editor - Font
- 修改注释的颜色
- Editor - Color Schema - Language Defaults - Comments
- 修改文件的注释信息
- Editor - File and Code Templates - File Header
- 设置项目的文件编码
- Editor - File Encodings
- 开启自动重新编译文件运行(如果不勾选,每次都是运行的旧的文件)
- 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的快捷键
-
复制删除当前行
- 复制:Ctrl+d
- 删除:Ctrl+y
- 复制当前类的全限定名称:在类上右键-Copy Reference(Ctrl+Alt+Shift+C)
-
向上、下移动当前行
- 向上移动:Alt+Shift+↑
- 向下移动:Alt+Shift+↓
-
向上或向下插入一行
- 向下插入空行:Shift+Enter
- 向上插入空行:Alt+Ctrl+Enter
-
新建
- 选中项目中的文件夹、包(包也是文件夹),点击Alt+Insert(还可以输入单词缩写过滤文件)
- 选中要实现类,单击Alt+Enter可以进行接口的实现
-
收藏
- 添加到收藏夹(类、方法):Alt+Shift+F
-
注释
- 单行注释:Ctrl+/
- 多行注释:Ctrl+Shift+/
-
错误:
- 定位下一个错误:F2
- 定位上一个错误:Shift+F2
-
记忆粘贴
- 打开最近剪贴板的拷贝记录:Ctrl+Shift+V
-
代码修改
- 标识符的整体修改:Shift+F6
- 文本的大小写转换:Ctrl+Shift+U
- 将局部变量抽取为成员变量:Alt+Ctrl+F
- 将局部代码步骤抽取为成员方法:Alt+Ctrl+M
- 整理当前.java源代码导入的包:Ctrl+Alt+O
-
展开与收起
- 全部展开的一个项目:选中该项目,点击数字键的*****号即可展开
- 一层一层展开一个项目:选中该项目,点击方向键的→即是展开,方向键的←即是收起
-
代码自动生成
1. 给类添加get/set方法以及构造器等:ALt+Insert
2. 使用XXX结构包围代码:Ctrl+Alt+t
3. 根据使用环境,自动生成代码:Alt+Enter、
4. 在接口中自动生成测试代码:Ctrl+Shift+T -
代码的格式
-
折叠全部代码:Ctrl+Shift±
-
展开全部代码:Ctrl+Shift++
-
格式化代码:Ctrl+Alt+L
-
-
运行与调试、终止
- 运行当前类文件(必须要当前类有main函数):Shift+F10
- 调试当前类文件(必须要当前类有main函数):Shift+F9
- 单步步过:F8
- 单步步入:F7
- 执行完当前方法并返回:Shift+F8
-
查询
- 当前类的概览(可以看当前类的所有构造器、属性、方法、代码块…,以及它们是否是静态、是怎样的访问权限):Ctrl+F12
- 在抽象类(接口)上查看有哪些类继承/实现了自己:Ctrl+Alt+B
- 查看一个类的继承图:Ctrl+H
- 查看一个类的继承图,以图形的形式显示:Alt+Ctrl+U
- 查看方法在哪里被调用:Alt+F7
-
提示
- 代码提示:Ctrl+Alt+Space
- 方法参数提示显示:Ctrl+P
-
搜索
- 文本查找:Ctrl+F(find)
- 文本替换:Ctrl+R(replace)
- 项目、模块、目录搜索替换:Ctrl+Shift+R(find in path)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8WTe4non-1623427371990)(E:\4_StudyVideo\picture\2021-05-18_010449.png)] - 类搜索:Ctrl+N(go to class)
- 文件搜索:Ctrl+Shift+N(go to file)
-
最近打开、使用过的文件:Ctrl + E
-
重命名当前类(需要先选中类):Shift+F6
-
Ctrl+w:选中当前选择的整个单词,多次点击可以递进式选择
-
局部隐藏代码: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服务器的名称,和当前项目的名称一致
-
点击Tomcat图片组合框,选择Edit Configurations…
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eVgTkuP5-1623427371994)(E:\4_StudyVideo\picture\2021-05-14_203344.png)] -
部署服务器路径(当有访问到Tomcat服务器时,ip:port/后的工程与4所填写一致,则Tomcat会自动索引到当前项目中,所以这里我们应该填写我们的项目名。部署了项目名之后,就可以进行访问了)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Ve5FAIj6-1623427371994)(E:\4_StudyVideo\picture\2021-05-14_203801.png)]
-
如果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)]
- Step Over:单步执行
Step Into:单步步入
Step Force Into:强制单步步入(一些系统函数使用单步步入没有效果,便可以使用该按钮强制步入)
Step Out:调出当前执行的方法
Run To Cursor:执行到光标所在位置 - Resume Program:恢复程序的执行,直到遇到下一个断点
View BreakPoints:浏览和管理所有的断点
Mute BreakPoints:沉默所有的断点,也就是让所有断点失效,但是并不是取消 - 方法的调用窗口,下面的方法调用上面的方法
- 变量窗口,可以看到当前方法里所有的可见变量
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包
- 打开项目结构对话框
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-r0rzJSJV-1623427371997)(E:\4_StudyVideo\picture\2021-05-14_212844.png)] - 在Libraries中添加自定义类库(可以设置类库的名称、以及类库中包含的jar包)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Zxkr4Sie-1623427371997)(E:\4_StudyVideo\picture\2021-05-14_213208.png)] - 为模块添加自定义类库
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(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
-
在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)]
-
上面的设置只是针对当前的工程,如果想默认就使用这样的设置,需要在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项目
-
打开Project structure,选择Modules,点击左上角的绿色加号,点击Import Module
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zN1yhYlE-1623427372004)(E:\4_StudyVideo\picture\2021-05-27_145320.png)]
-
选择模块文件夹的位置,点击OK
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9KOwYynt-1623427372004)(E:\4_StudyVideo\picture\2021-05-27_145552.png)]
-
选择导入的模块的类型,点击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的步骤
-
在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>
-
在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>
-
编写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>
-
在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的步骤
-
在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>
-
在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 { ...... }
-
在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有哪些域对象?他们分别是什么类型?它们的声明周期如何?
对象名称 | 对象类型 | 创建时机 | 销毁时机 | 生命周期 |
---|---|---|---|---|
request | HttpServletRequest | 客户端向服务器发送一次请求,服务器就创建一个request对象 | 服务器对请求做出响应后就会销毁request对象 | 在一次请求中有效 |
session | HttpSession | 当服务器为某一个客户端的请求第一次调用getSession()时,一个Session被创建 | 1.session过期,默认30分钟; 2.手动调用session.invalidate(); | 在一次会话中有效。在web中,一次会话是指浏览器的不关闭 |
application | ServletContext | 服务器启动时,服务器为每个WEB应用创建一个属于该web项目的对象的ServletContext类. | 服务器关闭或者项目从服务器中移除的时候. | 与服务器具有相同的生命周期 |
对象名称 | 对象类型 | 创建时机 | 销毁时机 | 生命周期 |
---|---|---|---|---|
pageContext | PageContextImpl | 当进入当前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-8 | 1.通过设置jsp的page标签中的contentType 2.通过response.setContentType来设置 |
15.6 JSP页面中的常用指令
标签 | 功能 | 代码 |
---|---|---|
page | page指令可以修改jsp页面中一些重要的属性、行为 | <%@ page contentType=“text/html;charset=UTF-8” language=“java” %> |
include | include指令可以指定当前JSP页面要静态包含的部分JSP页面,避免重复编写代码 | <%@ include file="/include/footer.jsp"%> |
jsp:forward | jsp: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个隐含对象 | 数据类型 | 功能 |
---|---|---|
pageContext | PageContextImpl | 获取JSP中的九大内置对象 |
pageScope | Map<String,Object> | 获取 pageContext 域中的数据 |
requestScope | Map<String,Object> | 获取 Request 域中的数据 |
sessionScope | Map<String,Object> | 获取 Session 域中的数据 |
applicationScope | Map<String,Object> | 获取 ServletContext 域中的数据 |
… | … | … |
15.8 JQuery
1. JQuery中存取值的理解
方式 | 类比原生JS | 解释 |
---|---|---|
val(值)、val() | document.getElementById(“xxx”).value | value是代表标签元素中的属性的value值 |
html(值)、html() | document.getElementById(“xxx”).innerHTML | innerHTML代表标签元素中的内容,也就是标签对之间的内容 |
text(值)、text() | document.getElementById(“xxx”).innerText | innerText和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>