Spring + MyBatis

 MyBatis

        ORM(对象-关系映射):完成对象数据关系型数据映射的机制称为对象-关系映射

        (1)MyBatis是一个ORM框架,也是一个持久层框架;MyBatis封装了JDBC,将数据库中的表数据自动封装到对象中。这样就可以以面向对象的方式操作数据了。

        (2)MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及结果集的检索,使用简单的XML或注解用于配置和原始映射,将接口和JAVA的POJOS映射称数据库中的记录。

        优点:开发工作量变小了,可以将精力集中在业务逻辑的处理上,代码精简易读。

Spring

Spring两大核心

① IOC/DI(控制反转/依赖注入)

概述:将依赖对象的创建和赋值(装配)由程序内部交给了外部容器(对象的控制权有程序交给了外部容器)

作用:解除了模块之间的耦合(完全耦合),让面向接口编程落实到实处

② AOP(面向切面编程)

实现原理:代理模式(动态代理)

作用:不改变核心业务代码的情况下增加额外的功能,这些功能一般都是日志管理,事务控制,权限管理等

AOP是面向对象编程的补充也是依赖注入的补充

把程序重复的代码抽取出来,在需要执行的时候,使用动态代理的技术,在不修改源代码的基础上,对我们的已有方法进行增强

 Spring容器的两种类型

① ApplicationContext:在自身被实例化一次完成所有的Bean的创建,大多数时候使用这种方法,称之为积极加载

形式:

ApplicationContext applicationContext
=newClassPathXmlApplicationContext("applicationContext.xml");   

优点:可以在spring核心配置文件解析时,检查xml的正确性
缺点:xml解析时间长,就一开始占用较大的内存

② BeanFactory:采用延迟加载Bean,直到第一次使用getBean()方法获取Bean实例才会创建Bean

形式:

BeanFactory factory
=new XmlBeanFactory(new ClassPathResource("applicationContext.xml"));

        优点:XML解析时间段,占用的内存小

        缺点:不可以在Spring核心配置文件解析时,检查XML的正确性

Spring实例化Bean的三种方式

① 构造方法(默认)

<bean id="userDao" class="com.neusoft.springday2.dao.UserDaoImpl"></bean>
public interface IUserDao {
    public void getName();
}
public class UserDaoImpl implements  IUserDao {
    public  UserDaoImpl(){
        System.out.println("UserDaoImpl--构造方法");
    }
    @Override
    public void getName() {
        System.out.println("UserDaoImpl--getName");
    }
}

② 静态工厂方法

        工厂中的所有方法都是静态方法

        class:工厂类

        factory-method:工厂中返回bean实例的静态方法

<bean id="userDao" class="com.neusoft.springday2.factory.DaoFactory" factory-method="getUserDao"></bean>
public class DaoFactory {

    public static IUserDao getUserDao(){
        System.out.println("静态工厂getUserDao");
        return new UserDaoImpl();
    };
}

③ 实例工厂方法

        工厂中的所有方法都是成员方法

        先配置工厂bean

        再通过工厂中的实例方法获取次Bean实例

        factory-bean:指定工厂bean

        factory-method:工厂中返回此bean实例的成员方法

<bean id="userDao"  factory-bean="daoFactory1" factory-method="getUserDao"></bean>
public class DaoFactory1 {

    public IUserDao getUserDao(){
        System.out.println("实例工厂");
        return new UserDaoImpl();
    }
}

Spring依赖注入的三种方式

                构造方法注入、设值注入(属性注入)、接口注入(侵入性强)

① 构造方法注入

constructor-arg:构造方法的参数

必要属性:

        name:构造方法中的参数名

        value:简单的类型:String类型或包装类

        或ref:pojo类型:比如userDaoImpl,引用spring容器中的bean的id

可选属性:

        index:构造方法中的参数索引,索引从0开始

        type:指定注入值得类型

注意:

        ① spring给bean装配赋值时都是String类型,在注入值时会自动调用spring内部提供的数据类型转换器将传入的数据换成参数指定的包装类型,所以建议所有类中的成员变量都是用包装类

        ② 构造方法中的参数只有一个时,name可以省略

public class Teacher {
    private String teaName;
    private Integer teaAge;
    private IUserDao userDao;
}
<bean id="t1" class="com.neusoft.springday2.pojo.Teacher">
    <constructor-arg name="teaAge" value="20"></constructor-arg>
    <constructor-arg name="teaName" value="lisi"></constructor-arg>
</bean>

<!--将UserDaoImpl管理进容器-->
<bean id="userDao" class="com.neusoft.springday2.dao.UserDaoImpl"></bean>
        <!--public Teacher(IUserDao dao)-->

<bean id="t2"  class="com.neusoft.springday2.pojo.Teacher">
    <constructor-arg  ref="userDao"></constructor-arg>
</bean>
<!--public Teacher(String teaName, Integer teaAge)-->

<bean id="t3" class="com.neusoft.springday2.pojo.Teacher">
    <constructor-arg index="0" value="lisi" ></constructor-arg>
    <constructor-arg index="1" value="20" type="java.lang.Integer"></constructor-arg>
</bean>

 设值注入:

        调用set方法赋值:  

        Teacher t1=new Teacher();
        t1.setTeaAge(20);
        t1.setTeaName("lisi");
        System.out.println(t1);.

property:属性

        必要属性:

                name:属性名,setter和getter方法去掉set剩下的英文单词首字符小写,比如setTeaName对应teaName

                value:简单类型:Stirng类型或包装类

                或ref:pojo类型:比如userDaoImpl,引用spring容器中的bean的id

public class Teacher {
    private String teaName;
    private Integer teaAge;
    private IUserDao userDao;



    public Teacher(IUserDao dao){
        this.userDao=dao;
    }

    public Teacher(){

    }

    public IUserDao getUserDao() {
        return userDao;
    }

    public void setUserDao(IUserDao userDao) {
        this.userDao = userDao;
    }

    public Teacher(String teaName, Integer teaAge) {
        this.teaName = teaName;
        this.teaAge = teaAge;
    }

    public String getTeaName() {
        return teaName;
    }

    public void setTeaName(String teaName) {
        this.teaName = teaName;
    }

    public Integer getTeaAge() {
        return teaAge;
    }

    public void setTeaAge(Integer teaAge) {
        this.teaAge = teaAge;
    }

    @Override
    public String toString() {
        return "Teacher{" +
                "teaName='" + teaName + '\'' +
                ", teaAge=" + teaAge +
                ", userDao=" + userDao +
                '}';
    }

    public static void main(String[] args) {

//       构造方法
        Teacher t=new Teacher("zhangsan",10);
        System.out.println(t);

//        setter方法
        Teacher t1=new Teacher();
        t1.setTeaAge(20);
        t1.setTeaName("lisi");
        System.out.println(t1);
    }


}
<bean id="t4" class="com.neusoft.springday2.pojo.Teacher">
       <property name="teaName" value="zhangsan"></property>
       <property name="teaAge" value="10"></property>
       <!--<property name="userDao" ref="userDao"></property>-->
       <property name="userDao">
            <ref bean="userDao"></ref>
       </property>
</bean>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值