ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

怒肝通宵给女朋友整理Mybatis知识点总结,网友:单身狗羡慕了呀

2021-05-23 11:58:19  阅读:149  来源: 互联网

标签:语句 知识点 怒肝 占位 mybatis JSP Emp SQL Mybatis


上一篇分享的是《IntelliJ IDEA 中的常用配置》,这篇给大家分享《Mybatis》

一、Mybatis简介
1、什么是mybatis

Mybatis是由apache提供的一个针对持久层开源框架,对JDBC访问数据库的过程进行了简化和封装
使用mybatis可以只关注SQL语句本身,而不需要关注(JDBC中的)注册驱动、获取连接、获取传输器、释放资源等过程。
mybatis可以将要执行的SQL语句使用xml文件的方式或者注解方式配置起来,在执行时,将Java对象中携带的参数值和SQL骨架进行映射,生成最终要执行的SQL语句,将执行的结果处理后再返回。

2、mybatis的一些优势

1)JDBC连接访问数据库有大量重复的代码,而mybatis可以极大的简化JDBC代码
    注册驱动、获取连接、获取传输器、释放资源
2)JDBC没有自带连接池,而mybatis自带的有连接池
3)JDBC中是将SQL语句、连接参数写死在程序中,而mybatis是将SQL语句以及连接参数都写在配置文件中。
4)JDBC执行查询后得到的ResultSet我们需要手动处理,而mybatis执行查询后得到的结果会处理完后,将处理后的结果返回。

二、mybatis的快速入门程序
1、准备数据:

执行 /unit08-mybatis/sql脚本.txt 文件中的所有sql语句,创建yonghedb库,并创建emp表,往emp表中插入若干条记录。

2、创建项目、导入jar包、提供测试类

2.1.创建的Maven的java项目:CGB-Mybatis-01
2.2.在项目的pom文件中导入依赖:junit、mysql驱动、mybatis、log4j等
2.3.创建com.tedu.MybatisTest01测试类
    -------------------------------
    <dependencies>
        <!-- 引入mybatis依赖 -->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.2.8</version>
        </dependency>
        <!-- 引入mysql驱动 -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.11</version>
        </dependency>
        <!-- 引入单元测试的依赖 -->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.10</version>
        </dependency>
        <!-- 引入日志框架的依赖 -->
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-log4j12</artifactId>
            <version>1.6.4</version>
        </dependency>
    </dependencies>
    -------------------------------

3、提供配置文件(mybatis-config.xml、EmpMapper.xml)

3.1.提供mybatis-config.xml文件
    mybatis-config文件中主要配置了事务管理方式、连接数据库的参数、导入mapper文件
3.2.提供EmpMapper.xml文件
    EmpMapper文件主要配置将来要执行的SQL语句(查询、新增、删除、修改)

4、提供Emp实体类

如果要查询所有的员工信息,员工信息查询出来后需要封装到Java对象中
因为这里需要提供的Emp(员工)类,这个类用于封装所有的员工信息
com.tedu.pojo.Emp
有哪些信息(数据)需要封装到Emp类中,就在Emp类中提供什么的属性/变量
在Emp中提供4个变量(id、name、job、salary)分别用来封装emp表中的id、name、job、salary四列数据。
再提供4个变量(id、name、job、salary)对应的Get和Set方法
----------------------------------------------------
1) 什么是POJO?
    plain old/ordinary java object: 简单java对象, 专指用于封装数据的对象
    例如: 为了封装员工信息, 我们可以提供一个Emp类来封装员工信息
2) id和salary为什么不用基本数据类型而是使用包装数据类型?
    基本数据类型有默认值, 例如 int类型变量默认值是0, 如果使用包装类型,默认值为null
    默认值为0,有时影响我们的判断(例如,一个int类型的变量为0,我们无法区分0是赋的值还是默认值)
3) Emp类中的变量名为什么要和emp表中的列名保持一致?
    框架在将查询的结果封装到Emp对象中时,就是通过emp表中的列名(id,name,job,salary)
    生成对应的set方法( setId, setName, setJob, setSalary ), 将查询的结果封装到Emp对象中
    如果没有set方法, 也是通过emp表中的列名(id,name,job,salary)找到Emp类中的
    变量(id,name,job,salary), 通过暴力反射将查询的结果封装到Emp对象中。
----------------------------------------------------

三、MyBatis中的占位符
0、启用log4j日志框架: 专门为Java语言提供的一套日志框架,可以通过log4j打印程序中执行的日志信息

由于mybatis默认已经整合了log4j,使用log4j只需要完成以下两步操作:
1)添加log4j的jar包
2)添加log4j的配置文件(文件名必须是log4j.properties,文件必须要放在类目录下)
    因为log4j底层就是到类目录下找名称为log4j.properites的文件

1、#{}占位符: 其实就是JDBC中的问号(?)占位符,在mybatis底层会将 #{}占位符翻译成问号(?)占位符

如果在SQL语句中占位符只有一个#{}占位符,{}中名称没有要求,但不能是空的; 参数可以直接传递,不用封装;
如果在SQL语句中的#{}占位符不止一个,参数值需要通过Map或者POJO对象进行封装;

如果通过Map集合来封装SQL参数值,#{}占位符中的名称要和Map中的key保持一致!!!
    因为在mybatis底层是通过#{}占位符中的名称,作为key,到map中获取对应的value;
如果通过POJO对象来封装SQL参数值,#{}占位符中的名称要在POJO对象中有对应的getXxx方法,或者有对应的变量
    例如:#{job}占位符中的名称为job,那么就意味着,在Emp中要有getJob()方法或者有job变量,如果两者都有,会优先通过getXxx方法来获取POJO对象中存储的属性值,如果没有getXxx方法,会通过暴力反射直接获取Emp中job变量的值。

总结: 在Mybatis框架中,大部分情况都是用#{}占位符,#{}其实就是JDBC中的问号(?)占位符,是为SQL语句中的【参数值】进行占位。例如:
    查询:select * from emp where job=参数值 and salary>参数值
    新增: insert into emp value(null, 参数值, 参数值, 参数值)
    修改: update emp set 列=参数值, 列=参数值, .. where 列=参数值...
    删除: delete from emp where 列=参数值...

2、${}占位符:

select * from emp where id>5;
${}占位符: 是为SQL语句中的某一个SQL片段进行占位,将参数传递过来时,是直接将参数拼接在${}占位符所在的位置,因为是直接拼接,所以可能会引发SQL注入攻击,因此不推荐大量使用!
    如果SQL语句中只有一个#{}占位符,参数可以不用封装,直接传递即可!
    但如果SQL语句中哪怕只有一个${}占位符,参数也必须得先封装到Map或者POJO对象中,再把Map或者POJO对象传递过去!
    mybatis底层在执行SQL语句时,使用的就是PreparedStatement对象来传输SQL语句!

PreparedStatement: 可以防止SQL注入攻击
    1)先将SQL骨架发送给数据库服务器进行编译并确定下来(骨架一旦确定,就无法更改)
        王海涛
        select * from emp where name=?
    2)再将SQL中的参数传递给服务器(此时如果参数中再包含关键字或者SQL特殊字符串,也不能影响骨架,只会被当成普通的文本来处理!)
    

四、Mapper接口开发

mapper接口开发要满足以下四个规则:
1)写一个接口,要求接口的全类名(包名+接口名) 要等于mapper文件的namespace值
    namespace=接口的全类名
2)mapper文件中要执行的SQL,在接口中得有对应的接口方法,而且SQL标签的id值要等于方法名
    SQL语句的id值=方法名
    namespace+SQL语句的id值 = 接口的全类名+方法名
3)如果是查询SQL,resultType属性中指定的类型,要和接口方法的返回值类型保持一致
    (如果接口方法返回的是List集合,resultType属性只需要指定集合中的泛型)
4)SQL标签上的参数类型(可以省略) 要和 接口方法的参数类型保持一致

/* 1.获取EmpMapper接口的实现类实例
 *    框架底层可以根据getMapper方法接收的EmpMapper接口的字节码对象,提供接口的实现类,
 *    并根据接口的实现类,创建实现类的实例,同时也可以获取接口的全类名(=namespace)
 */
EmpMapper mapper = session.getMapper(EmpMapper.class);
/* 2.调用findAll01方法
 *     框架底层可以在执行findAll01方法时,根据上面获取的
 *     接口全类名(=namespace)+当前方法名(=SQL标签的id值), 
 *     就可以定位到要执行的SQL语句, 执行完SQL语句后,对结果进行封装处理,将处理完的结果再返回!
 */
List<Emp> list = mapper.findAll01();

五、内容补充
1、xml方式和注解方式开发的区别

xml方式:1)缺点:相比注解配置起来比较麻烦
    2)优点:xml配置的内容可以随时修改,改完之后不用重新编译、重新发布
注解方式:1)缺点:还是将配置写在Java类中,如果将来一旦发生变化,还需要修改java源文件,改完之后仍需要重新编译,重新发布。
    2)优点:配置起来比xml要简洁很多。

六、MVC设计模式
1、模式一: 只用JSP

Servlet: 处理服务器接收过来的请求,Servlet不适合输出一个完整的html网页
HTML: 本就是网页的开发技术,可以作为网页输出,但是HTML无法展示动态数据
JSP: 也是网页的开发技术(本质是Servlet),可以输出网页,也可以通过Java代码展示动态的数据
    JSP的出现既解决了Servlet不适合输出网页的问题,同时也解决了HTML无法展示动态数据的问题
    JSP可以实现Servlet所实现的功能,也可以作为html开发网页。
    很多人开始在开发项目时只用JSP
        1)JSP负责获取请求中携带的参数(如果有)
        2)JSP负责对请求进行处理
        3)JSP负责连接并访问数据(JDBC代码)
        4)JSP还负责展示请求处理的结果
    但如果只用JSP开发项目,JSP中必然要写很多的Java代码,JSP中的代码将会变得非常的混乱,后期难以维护,而且代码无法复用!

2、模式二:Servlet+JavaBean+JSP (符合MVC设计模式)

    Servlet(Controller:控制器): 
        1) 负责接收请求中的参数(如果有)
        2) 负责调用JavaBean中的方法对请求进行处理
        3) 负责调用JSP,由JSP负责展示请求处理的结果
    JavaBean(Model:模型): 
        1) 封装数据(POJO)
        2) 处理业务逻辑
        3) 访问数据库
    JSP(View:视图): 
        只负责展示请求处理的结果

    JavaBean: 就是一个普通的Java类,提供的有私有属性,可以通过属性封装数据,也可以提供业务方法,通过业务方法处理业务逻辑,以及访问数据库。
        实体bean(POJO): 专门用于封装数据的java类
        业务bean: 专门处理业务逻辑的java类
        Emp: (id,name,job,salary,get/set,findAll())
  • 以上就是《Mybatis》的分享。
  • 也欢迎大家交流探讨,该文章若有不正确的地方,希望大家多多包涵。
  • 创作不易,你们的支持就是我最大的动力,如果对大家有帮忙给个赞哦~~~

 

标签:语句,知识点,怒肝,占位,mybatis,JSP,Emp,SQL,Mybatis
来源: https://blog.csdn.net/vip0809/article/details/117191951

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有