一、SpringIOC
1.不同的类之间建立依赖关系,比如Person类依赖于Car类,组合方法:
①.传统方式
//1、创建业务对象person
Person person = new Person(null, null);
person.setName("小明");
//2、创建业务对象person所依赖的对象car
Car car = new Car();
car.setBrand("法拉利");
//3、把依赖对象和业务对象组合起来
**person.setCar(car);** //将car作为这个person类的属性进行注入,car变成了person的一部分
②.通过配置文件属性注入
<bean id="person" class="demo.Person">
<!-- 属性注入 -->
<!-- <property name="name" value="小明"></property>
<property name="car" ref="car1"></property>
③.构造器注入
构造器注入和属性注入都是再bean标签下进行的
④.一般情况下我们采用属性注入的方式进行,构造器注入略显臃肿,但是构造器注入会可以决定注入顺序。
2.标签注解(通过标签装配)
1.resposity标注数据库相关类,service标示服务层组件类,controller标识控制层组件类,这三个是用来**“备用”的注解,先写好,等到用到时通过注解进行处理。
2.标注之后在不指定名字的情况下,类名默认为小写。
3.@autowird按照类型进行装配,@source按照名字进行装配。着两个是用来“用”**的注解。
3.调用顺序
controller层调用service层,service层调用Dao层
4.SpringIOC通过配置管理容器中的bean
1.标签注解之后需要在配置文件中加入“context:component-scan”
使用的方式:
①在各层加入注解
②在使用之前加入注解,定义变量,此时属性自动注入
如:
@Resource
private CourseService courseservice;
注解:通过标签仅仅是进行装配,若要属性注入,还需要在配置文件中
2.xml配置文件的方式:
①属性注入
要求有无参构造函数、set方法
②构造器注入
要求有有参构造函数
5.关于SpringIOC的理解:
通过配置文件将类进行了打包,并且指定id名称,还可以对其进行赋值操作。赋值操作需要在配置文件中进行。
############################################################################################################
二、Spring Aop
1.SpringAop
SpringAop面向方法进行编程,在调用方法时当我们需要给该方法附加上某种功能的时候,就需要在切面类中进行处理。
通过切入点表达式来进行需要附加功能的方法的指示。
1.切入点表达式,通过切入点表达式进行处理,可以实现在某些方法之前加上前置、后置通知(JDK形势下需要进行接口的实现)。
2.切入点表达式是用来查找固定位置的。
execution(方法的返回值类型、方法名)
例:execution(public int 包名.类名.方法名)
3.SpringAop步骤:
1.接口实现
2.配置文件:<aop:aspectj-autoproxy proxy-target-class=“true”></aop:aspectj-autoproxy>
true需要使用cglib库
3.在通知的那个类加@Aspect注解
2.spring2项目步骤
1.jar包:aop,aspects:版本相同
2.目标方法的实现:MathInterImpul(实现接口).加减乘除法。需要加@component注解
3.通知/增强:Timetool类.方法
指定切入点,
加注解标识通知类型(@before、@after)
4.配置文件:扫描包,让注解生效;配置aspectJ让注解生效
5.获得目标类的对象,用一个接口去接收
############################################################################################################
3.Spring事务
开始步骤:
1.jar包:数据库包mysql,spring-tx事务支持的jar包,c3p0,
spring-jdbc,junit
2.选上tx命名空间
3.注解扫描,管理类的对象
4.配置数据源信息
①数据源配置
<!-- 数据源配置信息 c3p0 需要mysql-connector-java 5.1.8和c3p0 0.9.1.2这两个jar-->
<bean id="*dataSource*" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass" value="${driverClass}"/>
<property name="jdbcUrl" value="${jdbcUrl}"/>
<property name="user" value="${user}"/>
<property name="password" value="${password}"/>
②配置JDBC模板
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="*dataSource*"></property>
</bean>
③为数据源添加事务管理器
<!-- 为数据源添加事务管理器 -->
<bean id="dataSourceTransactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="*dataSource*"></property>
</bean>
④加载事务注解支持,和③中事务管理器相关
<!-- 加载事务注解支持 -->
<tx:annotation-driven transaction-manager="dataSourceTransactionManager"/>
2.受事务管理的语句要么全部执行成功,要么一条也不执行成功
3. 加入@Test测试后,可以进行Junit测试,并且可以不含有main方法
############################################################################################################
三、mybatis(ibatis是其前身)
使用mybatis框架可以简化数据库操作
1.步骤
1.创建Java Project,导入MyBatis jar包、依赖包、数据库驱动包
2.创建数据库和表
3.创建持久化类(POJO)
4.创建MyBatis映射文件Mapper.xml,编写SQL语句
5.创建MyBatis核心映射文件Config.xml,配置数据库连接信息及映射文件
6.创建测试类,测试运行结果,创建测试类的步骤:
①读取配置文件
②根据配置文件构建SqlSessionFactory
③通过SqlSessionFactory创建SqlSession
④使用SqlSession对象操作数据库,包括增删查改以及提交事务
⑤关闭SqlSession
2.toString返回类的字符串描述,查询数据库返回的数据类型是实体类型
2.标签
1.配置文件中的标签(标签之间需要有顺序):
properites标签用于将内部的文件外部化,例如在项目中将数据库相关文件放置于一个专门的文件中
typealiase标签用于给文件起别名,一是直接指定一个类设定别名,第二个是指定一个包设定别名,别名设置为首字母小写。
<typeAliases>
<typeAlias type="com.qst.po.Employee" alias="employee"/>
</typeAliases>
mappers标签用于将映射文件引入,有两种方式,一种是类路径引入,第二一种是包名引入(需要接口,接口中的函数要根据映射文件中的sql问来进行书写(返回值类型、名称、参数要对应))。
<mappers>
<!-- 使用类路径引入 -->
<mapper resource="com/qst/mapper/EmployeeMapper.xml" />
<mapper resource="com/qst/mapper/EmployeeTaskMapper.xml" />
<!-- 使用包名引入 -->
<!-- <package name="com.qst.mapper"/> -->
</mappers>
2.映射文件标签
mapper标签下的"insert,update,delate"执行后返回代表操作整条数据的整数
sql标签下定义可重用的SQL代码片段,也就是对一长串片段进行重新命名。再次用到时,方便使用。
resultMap标签进行映射,将数据库中的属性和实体类的属性建立关系
3.映射关系
一对一:
雇员和工牌一对一关联
private WorkCard workCard;
一对多:
雇员和员工任务一对多关联
private List<EmployeeTask> EmployeeTaskList;
多对多:
雇员和角色多对多关联:
private List<Role> roleList;
{
关系数据库中夺标之间的三种映射关系:
一对一:在任意一方引入对方主键作为外键
一对多:在多的一方添加一的一方主键作为外键
多对多:产生中间关系表,引入两张表的主键作为外键,两个主键成为联合主键或者使用新的字段作为主键。
}
创建子查询步骤:
1.创建员工类(1)、员工任务类(多)
2.在员工表中加入一个属性:员工任务集合
3.书写员工类映射文件、员工任务类映射文件
4.在主查询映射文件中查询建立映射关系(当进行主查询的过程中同时进行子查询)
5.在配置文件中进行类路径引入
子查询主要文件代码:
员工映射文件:
<mapper namespace="com.qst.mapper.EmployeeMapper">
//子查询映射关键
<resultMap type="com.qst.po.Employee" id="employeeRelationMap">
<collection property="employeeTaskList" ofType="com.qst.po.EmployeeTask"
column="empid" select="com.qst.mapper.EmployeeTaskMapper.selectEmployeeTaskById">
</collection>
</resultMap>
<!-- 根据id精确查询单条数据 -->
<select id="selectEmployeeById" resultMap="employeeRelationMap" parameterType="Integer">
select * from tb_employee where empid = #{empid}
</select>
</mapper>
员工任务映射文件:
<mapper namespace="com.qst.mapper.EmployeeTaskMapper">
<!-- 根据id精确查询单条数据 -->
<select id="selectEmployeeTaskById" resultType="com.qst.po.EmployeeTask" parameterType="Integer">
select * from tb_employee_task where empid = #{empid}
</select>
</mapper>
4.动态查询
动态查询有很多标签,比如
if:判断语句
choose(otherwise,when):多条件分支判断(switch、case、default)
where、trim、set:特殊字符问题
foreach:循环语句
bind:模糊查询
具体分析:
trim标签:在其内的语句中选择多条。可以为sql语句加上前缀、后缀以及去除包含内容前后的特殊字符串。
trim标签拼接上的字段实现了相关的功能,trim标签下的if是多个进行拼接的。
<update id="updateTrimTest" parameterType="employee">
update tb_employee
<trim prefix="set" suffixOverrides="," suffix="where empid = #{empid}">
<if test="name!=null and name!=''">
name=#{name},
</if>
<if test="gender!=null and gender!=''">
gender=#{gender},
</if>
<if test="position!=null and position!=''">
position = #{position},
</if>
</trim>
</update>**加粗样式**
choose(otherwise,when)标签:只选择一个进行拼接
where标签:能够智能的处理sql文中的and、or
set标签:包含的内容为空时将会出错,如果标签内语句结尾(多余)有“逗号”,则会将“逗号”忽略。
**foreach标签:**主要用在用在构建in条件中,它可以在sql语句中迭代一个集合(未进行实际测试。。。。。。。。。。。。。。。。)
**bind标签:**主要用来模糊查询
1.用下面的方式进行模糊查询往往移植性不太好,虽然在sql中能够运行出来,但是在oracle中无法运行。
<select id="selectEmployeeByName" parameterType="String" resultType="com.qst.po.Employee">
select * from tb_employee where name like concat('%',#{name},'%')
</select>
2.${ }标签容易让数据库遭到攻击
3.所以最合适的还是bind标签进行模糊查询
映射文件:
<select id="selectBindTest" parameterType="employee" resultType="com.qst.po.Employee">
<bind name="test_name1" value="'%'+name+'%'"/>
select * from tb_employee where name like #{test_name1}
</select>
测试类:
Employee employee = new Employee();
employee.setName("王");
List<Employee> employeeList = sqlSession.selectList("selectBindTest", employee);
for (Employee employee1 : employeeList) {
System.out.println(employee1);
}
###################################################
###################################################
通过注解传递多个参数:
注解中的属性和映射文件中的属性相同即可。
映射文件:
<!-- 通过注解传递多个参数(一般适合传递参数较少的情况) -->
<update id="updateAnnotationTest">
update tb_employee
set gender=#{gender}
where empid = #{empid}
</update>
接口:
public void updateAnnotationTest(@Param("gender") Integer gender1,@Param("empid") Integer empid1);
测试类:
EmployeeMapper employeeMapper = sqlSession.getMapper(EmployeeMapper.class);
employeeMapper.updateAnnotationTest(0, 10);