一、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-012.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())