7.spring相关配置
程序员文章站
2022-07-14 20:11:19
...
一.application
<?xml version="1.0" encoding="UTF-8"?>
<!-- #############################【功能引入】############################################## -->
<!--
beans 整个配置文件的根节点, 包含一个或多个bean元素
##最基本的命名空间定义
xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
##拓展的命名空间
//启动自动扫描或注释装配时命名空间
xmlns:context="http://www.springframework.org/schema/context"
//启用AOP功能时命名空间
xmlns:aop="http://www.springframework.org/schema/aop"
//启动声明事务时命名空间
xmlns:tx="http://www.springframework.org/schema/tx"
//启动配置bean实例命名空间
xmlns:bean="http://www.springframework.org/schema/beans"
##与上述命名空间定义配套的schema约束文件转载路径
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-版本号.xsd //beans
http://www.springframework.org/schema/context //context
http://www.springframework.org/schema/context/spring-context-版本号.xsd
http://www.springframework.org/schema/aop //aop
http://www.springframework.org/schema/aop/spring-aop-版本号.xsd
http://www.springframework.org/schema/tx //aop
http://www.springframework.org/schema/tx/spring-aop-版本号.xsd
"
-->
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:bean="http://www.springframework.org/schema/beans"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.2.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.2.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-4.2.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-4.2.xsd">
<!-- #############################【功能启动配置】############################################## -->
<!-- 引入xx.properties配置文件
属性:location:配置文件路径, 建议加上classpath: 前缀
属性:system-properties-mode 写上NEVER, 不使用环境变量中的配置参数
-->
<context:property-placeholder location="" system-properties-mode="NEVER"/>
<!-- 开启注解处理器 -->
<context:annotation-config/>
<!--
开启组件自动扫描:配置有 @Service @Controller @Component @Repository都为扫描对象
属性:base-package: 扫描包路径,多个包使用[,]分隔开
-->
<context:component-scan base-package=""/>
<!-- 开启居于@AspectJ切面的注解处理器 -->
<aop:aspectj-autoproxy/>
<!-- #############################【Bean实例创建配置】############################################## -->
<!--
使用class属性指定类的默认构造器创建单实例bean, 名称由id属性指定:
注意:建议显示写出公共的无参数构造器
-->
<bean id="Bean实例名称" class="Bean类的全限定类名"/>
<!--
属性:scope 设置bean有效作用范围
取值:singleton : 单例模式,全局中唯一一份Bean实例
prototype : 原型模式,每次获取创建新的Bean实例
request : 请求模式,一次http请求,创建 一次bean,仅在当前请求中有效
session : 会话模式,一次http请求,创建一次bean, 仅在当前请求中的session有效
global session:全局会话模式, 仅仅在基于portlet的web应用中才有意义,
bean被限定于全局portlet Session的生命周期范围内, 在web中等价于session
-->
<bean id="Bean实例名称" class="Bean类的全限定类名" scope="prototype"/>
<!--
init-method : 对象实例化后,调用该方法执行初始化操作
destroy-method : 对象销毁时调用该方法执行收尾操作
-->
<bean id="Bean实例名称" class="Bean类的全限定类名"
init-method="初始化时调用方法名"
destroy-method="对象销毁时调用的方法名"/>
<!--
属性:lazy-init:延时初始化, 通过改变器值设置初始化时间
默认情况下,容器BeanFactory在使用到bean时才创建bean
默认情况下,容器ApplicationContext在启动时创建bean
-->
<bean id="Bean实例名称" class="Bean类的全限定类名" lazy-init="default"/>
<!-- #############################【Bean实例属性赋值】############################################## -->
<!-- property 标签用于对Bean实例中的属性进行赋值,对于基本数据类型的值可直接指定,而ref表示对其他bean实例的引用 -->
<bean id="Bean实例名称" class="Bean类的全限定类名">
<property name="Bean类中属性名称" ref="要引用的Bean名称"/>
<property name="Bean类中属性名称" value="直接指定属性值"/>
<property name="Bean类中属性名称">
<!-- 创建一个内容匿名Bean实例赋值给指定的属性, 该匿名Bean实例无法被外界访问 -->
<bean class="Bean类全名"/>
</property>
<!--
set标签用于创建一个Set类型的实例赋值给指定的set类型属性, Set实例中的元素通过value
或者ref子标签指定, 对于基本数据类型的元素可有value标签生成, 如果需要引用其他Bean实例
做Set元素的话,可由ref标签指定
-->
<property name="Bean类中Set类型属性名称">
<set>
<value>set中元素(基本数据)</value>
<ref bean="要引用的bean的名称"/>
</set>
</property>
<!-- list标签用于创建List类型的实例赋值给指定的list类型属性 -->
<property name="Bean类中List类型属性名称">
<list>
<value>list中的元素</value>
<ref bean="要引用的bean的名称"/>
</list>
</property>
<!--
map标签用于创建Map类型实例赋值给指定的Map类型属性, map实例中的元素通过
entry子标签指定, Map元素的键由entry标签的key属性直接指定, 值可以由
value 或者ref标签指定
-->
<property name="Bean类中Map类型属性名称">
<map>
<entry key="map元素的key">
<value>map元素的value</value>
</entry>
<entry key="map元素的key">
<ref bean="要引用的Bean名称"/>
</entry>
</map>
</property>
<!-- 创建一个Properties类型的实例赋值给指定Properties类型属性 -->
<property name="Bean类Properties类型属性名称">
<props>
<!--
Properties 实例中的属性想元素由prop标签生成,属性项元素的键由key属性指定
属性想的元素的值可放置在prop标签体中
-->
<prop key="properties元素的key">properties元素的value</prop>
</props>
</property>
<property name="Bean类中要初始化为null属性名称">
<!-- null标签用于给赋值null值的属性进行赋null值 -->
<null/>
</property>
</bean>
<!-- #############################【Bean构造器赋值】############################################## -->
<bean id="Bean实例名称" class="Bean类的全限定类名">
<!--
通过传入的相应的构造参数进行Bean实例化, constructor-arg标签用于指定一个构造器参数
其index属性表名当前第几个构造参数(从0开始),type属性声明构造器参数的类型,构造参数的值如果是
基本类型可由value属性直接指定,如果是引用类型,则又ref属性指定
-->
<constructor-arg index="从0开始的***" type="构造参数的类型" value="构造参数的值"/>
<constructor-arg index="从0开始的***" type="构造参数的类型" ref="要引用的bean名称"/>
</bean>
<!-- #############################【AOP配置】############################################## -->
<bean id="目标对象名称" class="目标对象类全名"/>
<bean id="切面实例名称" class="切面类全名"/>
<aop:config>
<aop:aspect id="切面ID" ref="要引用的切面实例名称">
<aop:pointcut id="切入点名称" expression="切入点正则表达式" />
<aop:before pointcut-ref="切入点名称" method="切面类中用作前置通知的方法名"/>
<aop:after-returning pointcut-ref="切入点名称" method="切面类中用作后置通知的方法名"/>
<aop:after-throwing pointcut-ref="切入点名称" method="切面类中用作异常置通知的方法名"/>
<aop:after pointcut-ref="切入点名称" method="切面类中用作最终置通知的方法名"/>
<aop:around pointcut-ref="切入点名称" method="切面类中用作环绕置通知的方法名"/>
</aop:aspect>
</aop:config>
<!-- #############################【事务配置】############################################## -->
<!-- 配置事务管理器 -->
<bean id="事务管理器实例名称" class="事务管理器类全名">
<property name="数据源属性名" ref="要引用的数据源实例名称"/>
</bean>
<!-- 配置一个事务通知 -->
<tx:advice id="事务通知名称" transaction-manager="事务管理器实例名称">
<tx:attributes>
<!-- 方法以get/select/query开头,不使用事务 -->
<tx:method name="get*" read-only="true" propagation="NOT_SUPPORTED"/>
<tx:method name="select*" read-only="true" propagation="NOT_SUPPORTED"/>
<tx:method name="query*" read-only="true" propagation="NOT_SUPPORTED"/>
<!-- 其他方法以默认事务进行 -->
<tx:method name="*"/>
</tx:attributes>
</tx:advice>
<!-- 使用AOP技术实现事务管理 -->
<aop:config>
<aop:pointcut id="事务切入点名称" expression="事务切入点正则表达式" />
<aop:advisor advice-ref="事务通知名称" pointcut-ref="事务切入点名称"/>
</aop:config>
</beans>
二.MyBatis
一. mybatis执行流程:
- 配置总配置文件(mybatis-config.xml):
- 导入db.properties
- 配置事务管理
- 配置数据源
- 引入Mapper文件
- 配置映射文件(xxxMpper.xml)
- 制定映射规则
- crud操作
涉及到动态sql: where sql trim if
- 启动框架与执行
- 加载总配置文件
- 创建SqlSessionFactory
- 创建SqlSession对象
- 执行curd操作
- 提交事务
- 关闭资源
二. 关系映射
- 一对一
例子:QQ号(QQNumber)与(QQZone)
class QQNumber(){
QQZone zone = ....
}
class QQZone(){}
-
多对一
- 例子:员工(多:Employee)与 部门(一:Department)
class Employee{ Department dept = ... } class Department{ }
- 映射:
额外SQL方式:
<resultMap type="Employee" id="BaseResultMap1"> <association property="dept" javaType="Department" column="dept_id" select="xxx.xxx.DepartmentMapper.get"> </association> </resultMap> sql: select * from Employee
内联方式:
<resultMap type="Employee" id="BaseResultMap"> <association property="dept" javaType="Department"> <id column="d_id" property="id"/> <result column="d_name" property="name"/> </association> </resultMap> sql: select e.*, d.id d_id, d.name d_name from Employee e join Department d on e.dept_id = d.id
-
一对多
- 例子:部门(一:Department)与员工(多:Employee)
class Department{ List<Employee> es = ..... } class Employee{ }
- 映射:
额外sql:
<resultMap type="Department" id="BaseResultMap"> <collection property="es" ofType="Employee" column="id" select="xxx.xx.EmployeeMapper.getEmplByDeptId" /> </resultMap> sql: select * from Department
内联方式:
<resultMap type="Department" id="BaseResultMap2"> <collection property="es" ofType="Employee" column="id"> <id column="e_id" property="id"/> <result column="e_name" property="name"/> </collection> </resultMap> sql: select d.*, e.id as e_id, e.name as e_name from t_department d JOIN t_employee e on d.id = e.dept_id where d.id = #{id};
-
多对多
- 例子:学生(多:Student)与老师(多:Teacher)
class Student { private List<Teacher> ts = new ArrayList<>(); } public class Teacher { }
- 映射:
额外sql方式:
<resultMap type="Student" id="BaseResultMap"> <collection property="ts" ofType="Teacher" column="id" select="xx.xx.TeacherMapper.getTeacherByStuId"/> </resultMap> getTeacherByStuId : 通过 student_teacher表查 sql: select * from Student
内联方式:
<resultMap type="Student" id="BaseResultMap2"> <collection property="ts" ofType="Teacher"> <id column="t_id" property="id"/> <result column="t_name" property="name"/> </collection> </resultMap> sql: select s.*, t.id t_id, t.name t_name from student s join student_teacher st on s.id = st.stu_id on teacher t on st.tea_id = t.id