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接口开拓要知足以下四个规则: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》的分享。也欢迎大家互换磋商,该文章若有禁绝确的地方,希望大家多多包涵。创作不易,你们的支持便是我最大的动力,如果对大家有帮忙给个赞哦~~~