本文将从IOC;AOP;(这两者都是一种编程思想);spring整合MyBatis框架;事务这四个最重要的层面展开
 而用框架,不管是spring还是其他的,说白了就是上环境,上依赖
    <dependency>       <groupId>org.springframework</groupId>       <artifactId>spring-context</artifactId>       <version>5.2.5.RELEASE</version>     </dependency>控制反转,即将对象的创建权限和对象之间的依赖关系交给spring框架的容器
 其实我的理解就像是做饭:
 每次做饭都要买菜,择菜切菜,准备好佐料然后才是上锅炒,有时候没电气了还要先缴费,吃完了还得收拾桌子。
 想想要是每次做都只管炒菜,其他的不管,爽不爽?spring就是干这个的,保证电气水充足,佐料都有,,买菜择菜洗菜就好比是根据产品经理的需求创建业务对象(注意不是写实体类),而这个也就是IOC,
 接着话茬,吃完饭或者正在吃的要加量,就是后期运维,收拾碗筷就是产品下架了。
 好了,有了我的抛砖,相信初学者会很容易理解。
正转:由程序员进行对象的创建和依赖注入称为正转.程序员说了算.
 反转:交由spring框架,也就是IOC
<bean id="stu" class="com.huijixu.bean.Students"></bean><property name="" value=""></property><constructor-arg name="" value=""></constructor-arg>还有按照下标的,意义不大也不常用,大家有兴趣可以自行查找很简单
<property name="myname" value=""></property><bean id="Students" class="..."></bean>内的,那就是找是Students类的前提下,xml中对象名名称为myname的对象自动引用注入这种方式在中小项目中常用,本人认为注解比xml整洁美观
在spring的配置文件applicationContext.xml中一定要添加包扫描,不添加包扫描spring就不知道去哪里找你写的注解,
注解创建对象@Component :实体类@Service (k可以添加事务管理):ServiceImple实现类@Controller:控制类@Repository:数据访问层实现类对象创建
注解给对象赋值@Value:八种基本类型+String@Autowired:一般用于service层实现类中对于dao层实现类的对象引用类型注入@Qualifier("名称") 当应用类型有别名时,它和@Autowried成套使用
当项目体量逐步增大时,合理拆分易于缩小问题代码范围,通知在开发过程中易于成员间避免出现类似“幻读”的情况
按功能模块:
 book;users;lead;
 按层:mapper 、service、 controller
 本人习惯于后者,因为这样可以和三层架构保持统一
 <import resource="applicationContest_service.xml"></import> <import resource="applicationContest_mapper.xml"></import> ....一次性:
<import resource="applicationContest_*.xml"></import><bean id="someService"class="com.huijixu.s01.SomeServiceImpl"></bean>强烈建议新手cv!!
class,pom.xml,sql语句中,经常会出现大量重复的代码片段,而又不能在抽取细分,而这些又是轻易不会改变的,这时候就可以起别名(或者叫做全局变量)
建立SQL表 -->搭建环境(pom文件,各种基础配置文件)-->
 构建实体类-->mapper-->service-->controller-->
 测试-->前后端绑定-->测试
这是本人的习惯顺序,有条理可以让开发有条不紊,即使出错了也有检查的大致判断,更是程序员基本素养
写完一个功能,测一个功能,没毛病了再下一个,不然各个功能模块的bug一起报,不好调试
一言以蔽之:上接口使开发更美好
@Before@AfterAroundThrows<dependency>       <groupId>org.springframework</groupId>       <artifactId>spring-aspects</artifactId>       <version>5.2.5.RELEASE</version>     </dependency>execution(访问权限  方法返回值  方法的声明(参数) 异常类型)*标识任意..标识所有execution( * com.huijixu.service.impl..*(..)) 表示以任意访问权限任意返回值类型在com.huijixu.service.impl包下的任意class的任意方法名的任意参数的目标方法为切入点advice@Before@AfterReturning@Around@After1)建表
 2)新建项目,选择quickstart模板
 3)修改目录
 4)修改pom.xml文件,添加相关的依赖,spring依赖已经在前文贴出,下面是mybatis,mysql ,jdbc依赖
<!--jdbc --> <dependency>       <groupId>org.springframework</groupId>       <artifactId>spring-jdbc</artifactId>       <version>5.2.5.RELEASE</version>     </dependency> 	<!--myBaits --> <dependency>       <groupId>org.mybatis</groupId>       <artifactId>mybatis</artifactId>       <version>3.5.6</version>     </dependency> 	<!--mysql驱动 --> 	 <dependency>       <groupId>mysql</groupId>       <artifactId>mysql-connector-java</artifactId>       <version>8.0.28</version>     </dependency> 	 <!--alibaba druid 连接池-->     <dependency>       <groupId>com.alibaba</groupId>       <artifactId>druid</artifactId>       <version>1.1.12</version>     </dependency> 	<!--mybatis集成spring --> 	<dependency>       <groupId>org.mybatis</groupId>       <artifactId>mybatis-spring</artifactId>       <version>1.3.1</version>     </dependency>5)添加MyBatis相应的模板,下面贴出自用的SqlMapperConfig.xml & XXXMapper.xml模板供大家使用
```
<!--读取属性文件中数据库的配置--> <properties resource="db.properties"></properties> <!--设置日志输出语句,显示相应操作的sql语名--> <settings>     <setting name="logImpl" value="STDOUT_LOGGING"/> </settings> <typeAliases>     <package name="com.bjpowernode.pojo"></package> </typeAliases> <environments default="development">     <environment id="development">         <transactionManager type="JDBC"/>         <dataSource type="POOLED">             <property name="driver" value="com.mysql.jdbc.Driver"/>             <property name="url"                       value="jdbc:mysql://localhost:3308/ssm?useSSL=false&serverTimezone=UTC&allowPublicKeyRetrieval=true"/>             <property name="username" value="root"/>             <property name="password" value="123456"/>         </dataSource>     </environment> </environments> <mappers>     <package name="mapper文件所在的包名"></package> </mappers>
 ```
 <!-- XXXMapper.xml模板--> <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"         "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.xxxxx.mapper.interface">  <!-- 就是接口的完全限定名,注意新手一定要右键 -> copy reference -> cv 防止不必要的错误-->  </mapper>6)添加MyBatis核心配置文件SqlMapConfig.xml,并拷贝jdbc.propertiest属性文件到resources目录下
 同样给大家给书出。jdbc.properties,部分朋友可能会因为spring版本问题会报更新的错,虽然不影响使用但是影响美观哈哈,所以我的驱动加了'cj.'
jdbc.driverClassName=com.mysql.cj.jdbc.Driver jdbc.url=jdbc:mysql://localhost:3306/ssm?useUnicode=true&characterEncoding=utf8 jdbc.username=yours mysql username jdbc.password= yours password7)添加applicationContext_mapper.xml
 8)添加applicationContext_service.xml
 9)添加实体类
 10)添加mapper包,添加xxxMapper接口和xxxxMapper.xml文件并开发  (注意几个配套问题:文件名,方法名。。。)
 11)添加service包,添加xxxService接口和xxxxServiceImpl实现类
 12)添加测试类进行功能测试
大白话就是,我不成,你也别想成,两个关联动作同时失败或者成功。保证数据的唯一性,一致性,原子性,隔离性;
 <dependency>       <groupId>org.springframework</groupId>       <artifactId>spring-tx</artifactId>       <version>5.2.5.RELEASE</version>     </dependency>REPETABLE_READ:可重复读,这里简单提一嘴就是他可以解决脏读,不可重复读,但存在幻读多个事务之间的合并,互斥等都可以通过设置事务的传播特性来解决
其中B是嵌套在A中的事务
ean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">     <!--因为事务必须关联数据库处理,所以要配置数据源-->     <property name="dataSource" ref="dataSource"></property>  </bean> <tx:annotation-driven transaction-manager="transactionManager"></tx:annotation-driven>下面以curd给出配置事物的代码
```
<!--配置事务切面--> <tx:advice id="myadvice" transaction-manager="transactionManager">     <tx:attributes>         <tx:method name="*select*" read-only="true"/>         <tx:method name="*find*" read-only="true"/>         <tx:method name="*search*" read-only="true"/>         <tx:method name="*get*" read-only="true"/>         <tx:method name="*insert*" propagation="REQUIRED" no-rollback-for="ArithmeticException"/>         <tx:method name="*add*" propagation="REQUIRED"/>         <tx:method name="*save*" propagation="REQUIRED" no-rollback-for="ArithmeticException"/>         <tx:method name="*set*" propagation="REQUIRED"/>         <tx:method name="*update*" propagation="REQUIRED"/>         <tx:method name="*change*" propagation="REQUIRED"/>         <tx:method name="*modify*" propagation="REQUIRED"/>         <tx:method name="*delete*" propagation="REQUIRED"/>         <tx:method name="*remove*" propagation="REQUIRED"/>         <tx:method name="*drop*" propagation="REQUIRED"/>         <tx:method name="*clear*" propagation="REQUIRED"/>         <tx:method name="*" propagation="SUPPORTS"/>     </tx:attributes> </tx:advice> <!--绑定切面和切入点--> <aop:config>     <aop:pointcut id="mycut" expression="execution(* com.bjpowernode.service.impl.*.*(..))"></aop:pointcut>     <aop:advisor  advice-ref="myadvice" pointcut-ref="mycut"></aop:advisor> </aop:config>```
@Transactional@Transactional(propagation = Propagation.REQUIRED,//事务的传播特性
 noRollbackForClassName = "ArithmeticException", //指定发生什么异常不回滚,使用的是异常的名称
 noRollbackFor = ArithmeticException.class,//指定发生什么异常不回滚,使用的是异常的类型
 rollbackForClassName = "",//指定发生什么异常必须回滚
 rollbackFor = ArithmeticException.class,//指定发生什么异常必须回滚
 timeout = -1, //连接超时设置,默认值是-1,表示永不超时
 readOnly = false, //默认是false,如果是查询操作,必须设置为true.
 isolation = Isolation.DEFAULT//使用数据库自已的隔离级别
有写错的地方希望大佬们海涵指出!!