乐趣区

关于eclipse: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())
退出移动版