Spring AOP原理
Spring AOP 采用动态代理技术实现。(AutoProxy)
如果Spring中的组件启用aop配置,容器返回的对象是一个原有组件的子类对象,子类对象方法将父类方法全部重写,在重写方法中调用切面组件功能和原有组件功能。
Spring采用的动态代理技术有两类。
-
cglib工具包
默认目标组件没有接口采用。原理采用继承方式生成子类。
public class Xxxx extends EvaluationControlller{ //重写父类方法 public Object xxx(){ //调用切面组件功能 //调用原有组件功能super.xxx(); } }
-
JDK Proxy API
默认目标组件有接口采用。原理采用接口实现方式生成代理类。
public class Xxxx implements EvaluationDao{ //实现接口方法 public Object findById(){ //调用切面组件功能 //调用原有组件功能 } }
-
强制采用CGLIB方式
<aop:aspectj-autoproxy proxy-target-class=“true”/>
追加proxy-target-class="true"属性。
MyBatis
简介
MyBatis是一个数据库访问框架,用于简化数据库操作代码。
MyBatis前身是iBATIS框架。
-
MyBatis封装功能有以下几点:
- 封装了获取连接、获取statement、设置参数、执行sql、释放连接一系列过程
- 封装了将ResultSet查询结果映射成实体对象过程
- 封装了将SQL语句使用XML定义
- 封装了将多表查询结果映射成实体对象过程
- 封装了一些延迟加载和缓存特性
不足:分页封装效率低下,需要使用pageHelper组件优化。
结构
基本使用
-
搭建Mybatis环境
- 导入mybatis和驱动jar包
- 引入sqlmap-config.xml配置文件
-
编写实体类(属性名和字段名保持一致)
-
定义SQL语句
< select id="" parameterType="" resultType="">
< insert id="" parameterType="">
-
获取SqlSession对象执行SQL
- selectList
- selectOne
- insert
- update
- delete
扩展应用
-
打开底层日志输出
在sqlmap-config.xml主配置文件中定义下面参数
<!-- 控制打印底层执行过程 --> <settings> <setting name="logImpl" value="STDOUT_LOGGING"/> </settings>
-
类型别名
定义SQL语句时,parameterType和resultType可以使用类型别名。
MyBatis框架内部定义了一批别名,开发者也可以自定义。
-
内部预定的别名
-
开发自定义别名
在sqlmap-config.xml中追加别名定义
<typeAliases> <typeAlias type="cn.xdl.entity.Evaluation" alias="evaluation"/> </typeAliases>
在SQL定义中,parameterType和resultType就可以使用alias名字。
-
-
java.sql.SQLException: 无效的列类型: 1111
原因:SQL中#{xx}取值为null时,就会产生上述异常。
如果允许null值做参数,需要在#{}标识中执行jdbcType属性,属性值如下:
例如:#{user_id,jdbcType=NUMERIC}、#{title,jdbcType=VARCHAR}等
-
${}和#{}区别
- #{}采用预编译SQL执行;${}采用Statement非预编译执行
- #{}安全、${}容易被注入式攻击
- 能使用#{}就不要用${}
- 表名或字段名变化值就需要采用${}
- 如果是一个参数值,用${_parameter}获取
-
Mapper映射器
Mapper映射器是按一定规则编写出的接口,Mybatis可以根据映射器接口自动创建出对象,然后对SQL进行操作。
映射器规则如下:
- 接口方法名与SQL定义的id属性一致
- 接口参数类型与SQL定义的parameterType属性保持一致
- 接口返回类型,多行查询用List、单行查询用resultType属性类型、增删改用void或int
- SQL定义文件元素的namespace属性需要指定为“包名.映射器接口名”
- 使用sqlSession.getMapper(映射器接口.class);获取映射器对象,然后利用方法调用SQL操作