MyBaits第一天

Spring AOP原理

Spring AOP 采用动态代理技术实现。(AutoProxy)

如果Spring中的组件启用aop配置,容器返回的对象是一个原有组件的子类对象,子类对象方法将父类方法全部重写,在重写方法中调用切面组件功能和原有组件功能。

img

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框架。

  1. MyBatis封装功能有以下几点:

    • 封装了获取连接、获取statement、设置参数、执行sql、释放连接一系列过程
    • 封装了将ResultSet查询结果映射成实体对象过程
    • 封装了将SQL语句使用XML定义
    • 封装了将多表查询结果映射成实体对象过程
    • 封装了一些延迟加载和缓存特性

    不足:分页封装效率低下,需要使用pageHelper组件优化。

结构

img

基本使用

  1. 搭建Mybatis环境

    • 导入mybatis和驱动jar包
    • 引入sqlmap-config.xml配置文件
  2. 编写实体类(属性名和字段名保持一致)

  3. 定义SQL语句

    < select id="" parameterType="" resultType="">

    < insert id="" parameterType="">

  4. 获取SqlSession对象执行SQL

    • selectList
    • selectOne
    • insert
    • update
    • delete

扩展应用

  1. 打开底层日志输出

    在sqlmap-config.xml主配置文件中定义下面参数

    <!-- 控制打印底层执行过程 -->
    <settings>
        <setting name="logImpl" value="STDOUT_LOGGING"/>
    </settings>
    
  2. 类型别名

    定义SQL语句时,parameterType和resultType可以使用类型别名。

    MyBatis框架内部定义了一批别名,开发者也可以自定义。

    • 内部预定的别名

      img

    • 开发自定义别名

      在sqlmap-config.xml中追加别名定义

      <typeAliases>
          <typeAlias type="cn.xdl.entity.Evaluation" alias="evaluation"/>
      </typeAliases>
      

      在SQL定义中,parameterType和resultType就可以使用alias名字。

  3. java.sql.SQLException: 无效的列类型: 1111

    原因:SQL中#{xx}取值为null时,就会产生上述异常。

    如果允许null值做参数,需要在#{}标识中执行jdbcType属性,属性值如下:

    img

    例如:#{user_id,jdbcType=NUMERIC}、#{title,jdbcType=VARCHAR}等

  4. ${}和#{}区别

    • #{}采用预编译SQL执行;${}采用Statement非预编译执行
    • #{}安全、${}容易被注入式攻击
    • 能使用#{}就不要用${}
    • 表名或字段名变化值就需要采用${}
    • 如果是一个参数值,用${_parameter}获取
  5. Mapper映射器

    Mapper映射器是按一定规则编写出的接口,Mybatis可以根据映射器接口自动创建出对象,然后对SQL进行操作。

    映射器规则如下:

    • 接口方法名与SQL定义的id属性一致
    • 接口参数类型与SQL定义的parameterType属性保持一致
    • 接口返回类型,多行查询用List、单行查询用resultType属性类型、增删改用void或int
    • SQL定义文件元素的namespace属性需要指定为“包名.映射器接口名”
    • 使用sqlSession.getMapper(映射器接口.class);获取映射器对象,然后利用方法调用SQL操作
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值