1、Mybatis简介
一、什么是mybatishtml
Mybatis是由apache提供的一个针对持久层开源框架,对JDBC访问数据库的过程进行了简化和封装 使用mybatis能够只关注SQL语句自己,而不须要关注(JDBC中的)注册驱动、获取链接、获取传输器、释放资源等过程。 mybatis能够将要执行的SQL语句使用xml文件的方式或者注解方式配置起来,在执行时,将Java对象中携带的参数值和SQL骨架进行映射,生成最终要执行的SQL语句,将执行的结果处理后再返回。
二、mybatis的一些优点java
1)JDBC链接访问数据库有大量重复的代码,而mybatis能够极大的简化JDBC代码 注册驱动、获取链接、获取传输器、释放资源 2)JDBC没有自带链接池,而mybatis自带的有链接池 3)JDBC中是将SQL语句、链接参数写死在程序中,而mybatis是将SQL语句以及链接参数都写在配置文件中。 4)JDBC执行查询后获得的ResultSet咱们须要手动处理,而mybatis执行查询后获得的结果会处理完后,将处理后的结果返回。
2、mybatis的快速入门程序
一、准备数据:mysql
执行 /unit08-mybatis/sql脚本.txt 文件中的全部sql语句,建立yonghedb库,并建立emp表,往emp表中插入若干条记录。
二、建立项目、导入jar包、提供测试类sql
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> -------------------------------
三、提供配置文件(mybatis-config.xml、EmpMapper.xml)数据库
3.1.提供mybatis-config.xml文件 mybatis-config文件中主要配置了事务管理方式、链接数据库的参数、导入mapper文件 3.2.提供EmpMapper.xml文件 EmpMapper文件主要配置未来要执行的SQL语句(查询、新增、删除、修改)
四、提供Emp实体类apache
若是要查询全部的员工信息,员工信息查询出来后须要封装到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对象中。 ----------------------------------------------------
3、MyBatis中的占位符
0、启用log4j日志框架: 专门为Java语言提供的一套日志框架,能够经过log4j打印程序中执行的日志信息设计模式
因为mybatis默认已经整合了log4j,使用log4j只须要完成如下两步操做: 1)添加log4j的jar包 2)添加log4j的配置文件(文件名必须是log4j.properties,文件必需要放在类目录下) 由于log4j底层就是到类目录下找名称为log4j.properites的文件
一、#{}占位符: 其实就是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 列=参数值...
二、${}占位符:session
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特殊字符串,也不能影响骨架,只会被当成普通的文原本处理!)
4、Mapper接口开发mybatis
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();
5、内容补充
一、xml方式和注解方式开发的区别
xml方式:1)缺点:相比注解配置起来比较麻烦 2)优势:xml配置的内容能够随时修改,改完以后不用从新编译、从新发布 注解方式:1)缺点:仍是将配置写在Java类中,若是未来一旦发生变化,还须要修改java源文件,改完以后仍须要从新编译,从新发布。 2)优势:配置起来比xml要简洁不少。
6、MVC设计模式
一、模式一: 只用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中的代码将会变得很是的混乱,后期难以维护,并且代码没法复用!
二、模式二: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())