1、复习MVC
Why:没有使用MVC的时候,我们可以在jsp页面写java代码;
MVC含义:M:(Model)V(View):C(Control);
MVC的流程图:
- 没有使用MVC(Model-1)
Jsp本身就是一个Servlet,为什么要使用jsp?
在Servlet中拼装html代码的复杂,在jsp页面上忘记了总是忘记导入包,总是忘记强转
缺点:
- 如果数据库里面的表特别多,关系特别的复杂;不好维护;牵一发而动全身;
- 分工不明确
- 使用了MVC:(Model-2)
Db:存储数据(项目中的数据)
POJO:存储的是和表的列名一模一样的对象;一个表对应一个POJO
Dao:只负责表的CRUD;一个表对应一个Dao
Service:一个Service持有多个Dao,持有其它的Service;
测试类:一个Service对应一个测试类
Servlet:一个Servlet持有多个Service;
JSP:一个JSP对应一个Servlet方法;
例子:
| 优点 | 缺点 | |
|
村东头小饭店 |
|
|
|
大城市超级大饭店 |
解决了小饭店的缺点 |
代价大 |
OCP原则:(Open Close P(原则)--开闭原则:
- 对已有的功能关闭,
- 对新开发的功能开放
- 在增加新功能或者修复bug的时候尽量不要修改别人的代码;
- 将经常修改的内容放到配置文件中;修复bug的时候,一般情况下是新增加一个方法;
2、Mybatis
2.1 Why(即jdbc的缺点)
肯定是原来的内容或者使用的工具有很多缺点;或者说使用不方便;mybatis替换的是dao层框架,dao层就是封装的jdbc;如果jdbc特别棒,那orm框架(mybatis)等就没市场了。
Jdbc有哪些缺点:
- 四步走(麻烦);
- 修改数据库中的表(列的增加和修改),修改的地方特别多;POJO,SQL语句,将数据库的记录变为java中的Object;
- 万恶的占位符(主要解决SQL注入的问题);ps.setObject(占位的位置,值),是为占位的位置发愁;多条件搜索:为啥要加上where 1 =1 ;
- 关联关系:一对一,一对多(多对一)),多对多;手动增加一个开关;
- 联合查询的语句:一条语句就可以
- 分多次查询:手动增加了一个关联关系的开关
- 开关可否变动自动的;对象的关联关系,我使用的时候自动打开,不使用的时候不要查询
- 手动的关联关系的开关,只能处理到第一层关联关系;(第二层以上的无法处理)
- 缓存:比如搜索的时候:两个人搜索的关系字是一样的;将第一个人搜索的记录存储到一个集合中,当第二个搜索的时候,直接从集合中取数据就可以了,就少向数据库中发送了一条sql语句的
2.2介绍
Mybatis是一个ORM框架,O(Object)R(Relation)M(Mapping);对象(java)关系(数据库,关系型数据库)映射;
POJO:pojo的类名一般和表名一样(去掉下划线);属性名和表的列名一样;pojo的对象和表的记录
把数据库里面的记录变成java对象(Rs+反射);Db-->Dao;
把JAVA对象变成数据库的SQL:从Dao-->Db
官网:最早是在出名的apache(Tomcat,common-fileupload,jstl)下面;后来挪到了google-code上面,再后来挪到了github(国外版本的码云);原名叫:ibatis
中文手册:http://www.mybatis.org/mybatis-3/zh/index.html
Github:https://github.com/mybatis/mybatis-3
都是开源的,将源代码也提供;
目录介绍
- Mybatis-3.4.5核心的jar包
- Lib:mybatis所使用到的jar包
- mybatis-3.4.5.pdf:官网自带的英文手册
- 中文在线手册:http://www.mybatis.org/mybatis-3/zh/index.html
3、实战
3.1 Junit(单元测试)——测试类
- 创建一个java项目(因为不需要tomcat,所以创建java项目即可);创建过程(略)
- 添加一些jar包;
为java项目添加jar有哪些方法:
测试类:写了一个main方法;测试类要测试很多很多方法;测试某个方法的时候,是要把其它的代码注释掉,然后运行;main方法是入口函数;程序的开始运行的地方就是main方法;
当然们接触了junit,添加了两个jar包以后,main方法不再是入口函数了.(jar包做了此项工作)
- 运行
如果一个类里面即写了main方法又写了juni单元测试类,类似于被static修饰的属性和方法,不需要创建对象,你偏偏创建对方访问(多此一举)
查看结果:
代码:
|
package com.carlinfo.mybatis.test;
import org.junit.After; import org.junit.Before; import org.junit.Test;
/** * junit测试类 * @author wa * */ public class JunitTest { /** * 在测试@test方法之前执行 */ @Before public void init() { System.out.println("==我初始化了=="); }
/** * 在执行@test方法之后执行 */ @After public void destory() { System.out.println("==销毁=="); }
/** * @这个是注解,是给java的编译器看的 * * 此方法可以使用junit运行 */ @Test public void method01() { System.out.println("====这是method01==="); }
/** * 这是第二个方法 * @test指定就可以 */ @Test public void method02() { try { String str = null ; str.toString() ; } catch (Exception e) { e.printStackTrace(); } System.out.println("==这是method02=="); }
/** * 有了junit,main就不要再写了 * @param args */ public static void main(String[] args) { System.out.println("==这是main=="); } } |