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>