SSM 框架
2017-12-26 08:34:44 0 举报
AI智能生成
ssm三大框架
作者其他创作
大纲/内容
MyBatis
MyBatis优点
半自动化的ORM实现
对象关系映射(Object Relational Mapping,简称ORM),用于实现面向对象编程语言里不同类型系统的数据之间的转换
动态SQL
MyBatis 框架所需jar包
mybatis-3.1.1.jar
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.1.1</version>
</dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.1.1</version>
</dependency>
核心对象
SqlSessionFactoryBuilder
用过即丢,其生命周期只存在于方法体内
可重用其来创建多个 SqlSessionFactory 实例
负责构建SqlSessionFactory,并提供多个build方法的重载
可重用其来创建多个 SqlSessionFactory 实例
负责构建SqlSessionFactory,并提供多个build方法的重载
SqlSessionFactory
SqlSessionFactory
SqlSessionFactory是每个MyBatis应用的核心
作用:创建SqlSession实例
作用域:Application
生命周期与应用的生命周期相同
单例
存在于整个应用运行时,并且同时只存在一个对象实例
SqlSessionFactory是每个MyBatis应用的核心
作用:创建SqlSession实例
作用域:Application
生命周期与应用的生命周期相同
单例
存在于整个应用运行时,并且同时只存在一个对象实例
SqlSession
包含了执行SQL所需的所有方法
对应一次数据库会话,会话结束必须关闭
线程级别,不能共享
对应一次数据库会话,会话结束必须关闭
线程级别,不能共享
在SqlSession里可以执行多次SQL语句,但一旦关闭了SqlSession就需要重新创建
SqlSession的两种使用方式
实例直接运行映射的SQL语句
SqlSession sqlSession = null;
try {
//1 获取mybatis-config.xml的输入流
InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
//2 创建SqlSessionFactory对象,完成对配置文件的读取
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is);
//3 创建sqlSession
sqlSession = factory.openSession();
//4 调用mapper文件来对数据进行操作,必须先把mapper文件引入到mybatis-config.xml中
int count = sqlSession.selectOne("cn.smbms.dao.user.UserMapper.count");
logger.debug("UserMapperTest count---> " + count);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
sqlSession.close();
}
try {
//1 获取mybatis-config.xml的输入流
InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
//2 创建SqlSessionFactory对象,完成对配置文件的读取
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is);
//3 创建sqlSession
sqlSession = factory.openSession();
//4 调用mapper文件来对数据进行操作,必须先把mapper文件引入到mybatis-config.xml中
int count = sqlSession.selectOne("cn.smbms.dao.user.UserMapper.count");
logger.debug("UserMapperTest count---> " + count);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
sqlSession.close();
}
基于Mapper接口方式操作数据
SqlSession sqlSession = null;
try {
//1 获取mybatis-config.xml的输入流
InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
//2 创建SqlSessionFactory对象,完成对配置文件的读取
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is);
//3 创建sqlSession
sqlSession = factory.openSession();
//第二种方式:调用getMapper(Mapper.class)执行dao接口方法来实现对数据库的查询操作
int count = sqlSession.getMapper(UserMapper.class).count();
logger.debug("UserMapperTest count---> " + count);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
sqlSession.close();
}
try {
//1 获取mybatis-config.xml的输入流
InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
//2 创建SqlSessionFactory对象,完成对配置文件的读取
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is);
//3 创建sqlSession
sqlSession = factory.openSession();
//第二种方式:调用getMapper(Mapper.class)执行dao接口方法来实现对数据库的查询操作
int count = sqlSession.getMapper(UserMapper.class).count();
logger.debug("UserMapperTest count---> " + count);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
sqlSession.close();
}
核心配置文件
mybatis-config.xml
properties标签
<!-- 引入 database.properties 文件-->
<properties resource="database.properties" />
<properties resource="database.properties" />
typeAliases标签
<!--类型别名-->
<typeAliases>
<typeAlias alias="User" type="cn.smbms.pojo.User"/>
<package name="cn.smbms.pojo" />
</typeAliases>
<typeAliases>
<typeAlias alias="User" type="cn.smbms.pojo.User"/>
<package name="cn.smbms.pojo" />
</typeAliases>
environments标签
mappers标签
<!-- 将mapper文件加入到配置文件中 -->
<mappers>
<mapper resource="cn/smbms/dao/user/UserMapper.xml"/>
</mappers>
<mappers>
<mapper resource="cn/smbms/dao/user/UserMapper.xml"/>
</mappers>
dtd 头
mapper.xml
dtd头
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
mapper - namespace命名空间
namespace和子元素的id联合保证唯一,
区别不同的mapper绑定DAO接口
区别不同的mapper绑定DAO接口
namespace的命名必须跟某个接口同名
接口中的方法与映射文件中SQL语句id一一对应
接口中的方法与映射文件中SQL语句id一一对应
cache - 配置给定命名空间的缓存
cache-ref – 从其他命名空间引用缓存配置
resultMap –用来描述数据库结果集和对象的对应关系
resultMap属性
id:
resultMap的唯一标识
resultMap的唯一标识
type:
Java实体类
resultMap子元素
id
一般对应数据库中该行的主键id,设置此项可提高MyBatis性能
一般对应数据库中该行的主键id,设置此项可提高MyBatis性能
result
映射到JavaBean的某个“简单类型”属性
映射到JavaBean的某个“简单类型”属性
association
映射到JavaBean的某个“复杂类型”属性,比如JavaBean类
映射到JavaBean的某个“复杂类型”属性,比如JavaBean类
collection
映射到JavaBean的某个“复杂类型”属性,比如集合
映射到JavaBean的某个“复杂类型”属性,比如集合
insert – 映射插入语句
update – 映射更新语句
delete – 映射删除语句
select – 映射查询语句
resultType和resultMap
resultType直接表示返回类型
基本数据类型
复杂数据类型
复杂数据类型
resultMap 对外部resultMap的引用
数据库字段信息与对象属性不一致
复杂的联合查询,自由控制映射结果
二者不能同时存在,本质上都是Map数据结构
动态SQL
where+if
set+if
foreach_array
foreach_list
foreach_map
choose
Spring
控制反转(IoC:Inversion of Control ) 也称为依赖注入(DI:Dependency Injection )
什么是依赖
A类中的方法中,实例化了B类的对象并调用其方法以完成特定的功能,我们就说A类依赖于B类
什么是高度耦合
程序不具备优良的可扩展性,可维护新,依赖较多,称之为高度耦合
依赖注入/反转控制的作用
用来降低程序代码之间的耦合度
所需要的jar包
commons-logging
spring-beans
spring-context
spring-core
spring-expression
applicationContext.xml配置文件
<bean>标签
使用<bean>标签来定义Bean(可以称为组件,实际就是java类)的实例
id属性:表示Bean实例的名称
class属性:表示Bean实例的类型
<property>标签
使用<property>标签给属性赋值
name属性:对应java类当中的属性
value属性:只能赋值基本类型和String类型,类类型,不可以
ref属性:用于类类型,已注入定义好的Bean
SpringBean属性赋值是通过调用属性的setter方法实现的,这种做法称为设值注入
<constructor-arg>标签
构造注入
一个<constructor-arg>元素表示构造方法的一个参数,且使用时不区分顺序。
当构造方法的参数出现混淆,无法区分是,可以通过index属性制定该参数的位置索引。位置从0开始
type属性可以用来制定参数类型
<context:component-scan base-package="com" />
扫描注解标注类
核心对象
ApplicationContext是一个接口,负责读取Spring 配置文件,管理对象加载,生成,维护Bean和Bean对象之间的依赖关系,负责Bean的生命周期等.
ClassPathXmlApplicationContext是ApplicationContext接口的实现类,用于从classpath路径中读取Spring配置文件
IOC/DI注解
@Compoent("userDao")
作用与在applicationContext.xml配置文件中配置编写了<bean id="userDao" class="dao.UserDao">
@Repository("") 用于标注Dao类
@Service("")用于标注业务类
@Controller("")用于标注控制器类
@Autowrited
实现Bean的装配
使用这个注解,可以省略setter方法
component-scan标签扫描注解标注类,base-package属性制定需要扫描的包,多个用逗号隔开
@Resource注解于@Autowrited相似
构造注入
一个元素表示构造方法的一个参数,且使用时不区分顺序
通过元素的index 属性可以指定该参数的位置索引,位置从0 开始。
元素还提供了type 属性用来指定参数的类型,避免字符串和基本数据类型的混淆。
面向切面编程(AOP:Aspect Oriented Programming)
所谓面向切面编程,是一种通过预编译和运行期动态代理的方式实现在不修改源代码的情况下给程序动态添加功能的技术
AOP的目标:让我们可以“专心做事”
AOP原理
将复杂的需求分解出不同方面,将散布在系统中的公共功能集中解决
采用代理机制组装起来运行,在不改变原程序的基础上对代码段进行增强处理,增加新的功能
AOP相关术语
增强处理(Advice)
前置增强
后置增强
环绕增强、异常抛出增强、最终增强等类型
前置增强
后置增强
环绕增强、异常抛出增强、最终增强等类型
切入点(Pointcut)
连接点(Join Point)
切面(Aspect)
目标对象(Target object)
AOP代理(AOP proxy)
织入(Weaving)
举例1,使用AOP 实现日志输出
(1)在项目中添加springAop相关jar包
aopalliance
aspectjweaver
spring-aop
(2)编写前置增强和后置增强实现日志功能
public class UserServiceImpl {
public void addUser(){
System.out.println("在UserServiceImpl中执行了addUser方法");
}
}
public void addUser(){
System.out.println("在UserServiceImpl中执行了addUser方法");
}
}
public class UserServiceLogger {
private static final Logger log =Logger.getLogger(UserServiceLogger.class);
/**
* 代表前置增强方法
* @param jp
*/
public void before(JoinPoint jp){
log.info("调用了:"+jp.getTarget()+"的"+jp.getSignature().getName()
+"方法。方法入参:"+Arrays.toString(jp.getArgs())
);
}
public void afterReturning(JoinPoint jp,Object result){
log.info("调用"+jp.getTarget()+"的"+jp.getSignature().getName()+"方法。返回值是:"+result);
}
}
private static final Logger log =Logger.getLogger(UserServiceLogger.class);
/**
* 代表前置增强方法
* @param jp
*/
public void before(JoinPoint jp){
log.info("调用了:"+jp.getTarget()+"的"+jp.getSignature().getName()
+"方法。方法入参:"+Arrays.toString(jp.getArgs())
);
}
public void afterReturning(JoinPoint jp,Object result){
log.info("调用"+jp.getTarget()+"的"+jp.getSignature().getName()+"方法。返回值是:"+result);
}
}
(3)编写Spring配置文件,对业务方法进行增强处理 <bean id="userService" class="com.bdqn.service.UserServiceImpl"></bean>
<bean id="userServiceLogger" class="com.bdqn.aop.UserServiceLogger"></bean>
<aop:config>
<aop:pointcut expression="execution(public void addUser())"
id="pointcut" />
<aop:aspect ref="userServiceLogger">
<aop:before method="before" pointcut-ref="pointcut" />
<aop:after-returning method="afterReturning"
pointcut-ref="pointcut" returning="result" />
</aop:aspect>
</aop:config>
<aop:config>
<aop:pointcut expression="execution(public void addUser())"
id="pointcut" />
<aop:aspect ref="userServiceLogger">
<aop:before method="before" pointcut-ref="pointcut" />
<aop:after-returning method="afterReturning"
pointcut-ref="pointcut" returning="result" />
</aop:aspect>
</aop:config>
(4)编写代码,调用
public static void main(String[] args) {
// TODO Auto-generated method stub
ApplicationContext app = new ClassPathXmlApplicationContext("applicationContext.xml");
UserServiceImpl userService = (UserServiceImpl)app.getBean("userService");
userService.addUser();
}
// TODO Auto-generated method stub
ApplicationContext app = new ClassPathXmlApplicationContext("applicationContext.xml");
UserServiceImpl userService = (UserServiceImpl)app.getBean("userService");
userService.addUser();
}
举例2,使用注解标注切面
SpringMVC
jsp Model1模式
(及jsp页面直接嵌入小脚本写java代码)
(及jsp页面直接嵌入小脚本写java代码)
jspModel2模式
(在Model1的基础上,加入servlet和JavaBean)
(在Model1的基础上,加入servlet和JavaBean)
子主题
0 条评论
下一页