第一章 框架的概述
1.三层架构
mvc:web开发中,使用mvc架构模式,m:数据,v:视图,c:控制器。
m:数据:来自数据库mysql。来自文件,来自网络。
v视图:现在使用jsp,html,css,js。显示请求处理结果,把m中的数据显示出来。
c控制器:接受请求,调用service对象,显示请求的处理结果,当前使用servlet作为控制器,
mvc的作用:
1.实现解耦合。2.让mvc各负其责。3.使系统扩展性更好。更容易维护。
三层架构
三层架构:
1.界面层(视图层):接收用户的请求,调用service,显示请求的处理结果,包含jsp,html,servlet等对象,对应的包controller。
2.业务逻辑层:处理业务逻辑,使用算法处理数据的,把数据返回给界面层,对应的是service包,和包中的很多的xxxService类,例如:StudentService,orderService,ShopService。
3.持久层(数据访问层):访问数据库,或者读取文件,访问网络,获取数据,对应的包是dao,dao包中很多的StudentDao
,OrderDao,ShopDao等等。
处理流程:
用户发起请求–>界面层–>业务逻辑层–>持久层->数据库(mysql)
优势:
1.结构清晰,耦合度低,各层分工明确
2.可维护高。可扩展性高
3.有利于标准化
4.开发人员可以只关注整个架构中的某一层的功能实现
5.有利于各层逻辑的复用
每一层对应着一个框架
1.界面层—springmvc框架
2.业务层—spring框架
3.持久层—MyBatis框架
框架
什么是框架(framework)
框架:就是一个软件,完成了部分的功能,软件中的类和类之间的方法调用都已经规定好了,通过这些可以完成某些功能,框架看作是模板。
框架是可以升级的,改造的,安全的
框架是对某各方面有用的,不是全能的
框架解决的问题
1.框架实现技术的整合
2.提高开发的效率,降低难度
jdbc访问数据库
优点:
直观,容易理解
缺点:
1.创建了很多对象Connection,Statement,ResultSet
2.注册驱动
3.执行sql语句
4.把ResultSet转为Student,list集合
5.关闭资源
6.sql语句和业务代码混在一起
Mybatis框架
主要解决的问题
减轻使用jdbc的复杂性,不用编写重复的创建Connection,Statement,不用编写关闭资源代码,直接使用Java对象,表示结果数据,让开发者sql的处理,其他分心的工作由Mybatis代劳。
Mybatis可以完成:
1.注册数据库驱动
2.创建jdbc中必须使用的对象
3.从xml中获取sql,并执行sql语句,把ResultSet结果转换Java对象
4.关闭资源
5.实现sql语句与Java代码的解耦合
第二章mybatis案例
Mybatis快速入门案例
实现步骤:
1.创建student表(id,name,email,age)
2.创建maven项目,修改pom.xml文件,加入mybatis依赖,mysql驱动,junit,
3.创建实体类Student,定义属性,属性名与列名保持一致
4.创建Dao接口,定义操作数据库的方法
5.创建xml文件(mapper文件),写sql语句
mybatis框架推荐是把sql语句和Java代码分开
mapper文件:定义和dao接口在同一目录下,一个表一个mapper文件
6.创建mybatis的主配置文件(xml文件):有一个,放在Redources目录下
1.定义创建连接实例的数据源(Datasource)对象
2.指定其他mapper文件的位置
7.测试的内容
使用main方法,测试mybatis访问数据库
也可以使用junit访问数据库
日志
Mybatis 通过使用内置的日志工厂提供日志功能。内置日志工厂将会把日志工作委托给下面的实现之一:
SLF4J
Apache Commons Logging
Log4j 2
Log4j
JDK logging
MyBatis 内置日志工厂会基于运行时检测信息选择日志委托实现。它会(按上面罗列的顺序)使用第一个查找到的实现。当没有找到这些实现时,将会禁用日志功能。
不少应用服务器(如 Tomcat 和 WebShpere)的类路径中已经包含 Commons Logging。注意,在这种配置环境下,MyBatis 会把 Commons Logging 作为日志工具。这就意味着在诸如 WebSphere 的环境中,由于提供了 Commons Logging 的私有实现,你的 Log4J 配置将被忽略。这个时候你就会感觉很郁闷:看起来 MyBatis 将你的 Log4J 配置忽略掉了(其实是因为在这种配置环境下,MyBatis 使用了 Commons Logging 作为日志实现)。如果你的应用部署在一个类路径已经包含 Commons Logging 的环境中,而你又想使用其它日志实现,你可以通过在 MyBatis 配置文件 mybatis-config.xml 里面添加一项 setting 来选择其它日志实现。
... ...可选的值有:SLF4J、LOG4J、LOG4J2、JDK_LOGGING、COMMONS_LOGGING、STDOUT_LOGGING、NO_LOGGING,或者是实现了 org.apache.ibatis.logging.Log 接口,且构造方法以字符串为参数的类完全限定名。
你也可以调用以下任一方法来选择日志实现:
org.apache.ibatis.logging.LogFactory.useSlf4jLogging();
org.apache.ibatis.logging.LogFactory.useLog4JLogging();
org.apache.ibatis.logging.LogFactory.useJdkLogging();
org.apache.ibatis.logging.LogFactory.useCommonsLogging();
org.apache.ibatis.logging.LogFactory.useStdOutLogging();
你应该在调用其它 MyBatis 方法之前调用以上的某个方法。另外,仅当运行时类路径中存在该日志实现时,日志实现的切换才会生效。如果你的环境中并不存在 Log4J,你却试图调用了相应的方法,MyBatis 就会忽略这一切换请求,并将以默认的查找顺序决定使用的日志实现。
Mybatis重要对象
Resources:mybatis框架中的对象,一个作用读取 主配置信息
String config="mybatis.xml";
InputStream inputStream= Resources.getResourceAsStream( config );
SqlSessionFactoryBuidler:负责创建SqlSessionFactory对象
SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build( inputStream );
SqlSessionfactory:重要对象
SqlSessionfactory是重量级对象:创建对象需要更多的资源和时间,在项目中有一个就可以了,
sqlsessionFactory接口:作用是sqlsession的工厂,就是创建sqlsession对象
DefaultSqlSessionFactory实现类
pubulic class defaultsqlsessionfactory implements sqlsessionfactory{}
sqlsessionFactory接口中的方法
openSession():获取一个默认的sqlsession对象,默认需要手工提交事物的
opensession(boolean):boolean参数表示是否自动提交事物
true:创建一个自动提交事物的sqlsession,false:等同于没有参数的opensession
sqlsession对象
sqlsession对象是通过sqlsessionfactory获取的,sqlsession本身是接口
sqlsession作用是提供大量的执行sql语句的方法
Defaultsqlsession:实现类
pubulic class Defaultsqlsession implements sqlsession{}
第三章 mybatis的Dao代理
Dao代理
mybatis提供代理
mybatis创建Dao接口的实现对象,完成sql语句的执行,mybatis创建一个对象代替你的dao实现类功能
使用代理的要求
代理的实现方式
理解参数
理解参数:通过Java程序把数据传入到mapper文件中的sql语句。参数主要是指dao接口方法的形参
parameterType
parameterType:表示参数的类型,指定dao方法的形参的数据类型是给mybatis使用,mybatis在给sql语句的参数赋值时使用,PreparedStatement.setXXX(位置,值)
第一种 :java类型的全限定类型名称
第二种 :mybatis定义的Java类型的别名,可以通过反射机制获取dao接口方法参数的类型,可以不写
一个简单的参数
Dao接口中方法的参数只有一个简单的参数(Java基本类型和string),占位符#{任意字符},和方法的参数名无关。
多个简单类型的参数
@param:命名参数,在方法的形参前使用,定义函数名,这个名称可以使用在mapper文件中。
Dao接口方法使用对象作为参数
方法的形参是一个Java对象,这个Java对象表示多个参数
多个参数-使用对象
使用Java对象传递参数,java的属性值就是sql需要的参数值,每一个属性就是一个参数
#与$ 的区别
相同点:
都能取到变量的值。
不同点:
#可以实现预编译,会先把#{变量}编译成?,在执行时再取值,可以防止sql注入。
$是直接进行字符串替换。
占位符#{}
特点
1.使用的Preparestatement对象,执行sql语句,效率高
2.使用的Preparestatement对象,能避免sql语句,sql语句执行更安全
3.#{}长用作列值使用,位于等号右侧,#{}位置的值和数据类型有关的
占位符
特
点
1.
使
用
s
t
a
t
e
m
e
n
t
对
象
,
执
行
s
q
l
语
句
,
效
率
低
。
2.
{} 特点 1.使用statement对象,执行sql语句,效率低。 2.
特点1.使用statement对象,执行sql语句,效率低。2.{}占位符的值,使用字符串连接方式,有sql注入的风险,有代码安全的问题。
3.
数
据
是
原
样
使
用
的
,
不
区
分
数
据
类
型
。
4.
{}数据是原样使用的,不区分数据类型。 4.
数据是原样使用的,不区分数据类型。4.常用做表名或者列名,在能保证数据安全的情况下使用${}
封装Mybatis输出结果
封装输出结果:mybatis执行sql语句,得到ResultSet,转为java对象
resultType
resultType属性:在执行select时使用,作为标签的属性出现
resultType表示结果类型:执行sql得到ResultSet转换的类型,使用类型的完全限定名或别名,注意返回的是集合,那应该设置为集合包含的类型,而不是集合本身,resultType和resultMap不能同时使用。
练习
resultMap
resultmap:结果映射,自定义列名和Java对象属性的对应关系,常用在列名和属性名不同的情况
用法:
1.先定义resultMap标签,指定列名和属性名对应关系
2.在select标签使用resultmap属性,指定上面定义的resultMap的id值
自定义别名
mybatis提供的对Java类型定义简短,好记名称
自定义别名步骤:
1.在mybatis主配置文件,使用typeAliase标签声明
2.在mapper文件中,resultType=“别名”
Like
第一种方式:在Java程序中,把like的内容组装好,把这个内容传入导sql语句
第二种方式:在sql语句,组织like的内容
sql语句格式:where name like “%“空格#{name}空格”%”
下一章部分动态sql
end