1.Mybatis
1.1 Mybatis是什么
mybatis是一种持久层框架,它是半自动的支持orm(对象关系映射)的框架,mybatis避免了几乎所有的jdbc代码、设置参数和获取结果集,开发者只用关注sql语句本身
1.2 Mybatis的优点
(1)mybatis免费开源
(2)与jdbc相比,它减少了绝大多数的jdbc代码
(3)mybatis支持将sql写在xml中,支持编写动态sql语句,和程序逻辑代码分离,减低了耦合度,便于统一管理和优化,提高了代码的可重用性
(4)mybatis提供映射标签,支持对象与数据库中的orm字段关系映射
1.3 Mybatis的缺点
(1)编写sql语句的工作量较大,对开发人员编写sql语句有一定功底要求
(2)sql语句依赖数据库,导致移植性较差,不能随意更换数据库
1.4 搭建一个Mybatis项目的步骤
(1)引用架包:mybatis、mysql
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.13</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.31</version>
</dependency>
(2)创建全局配置文件:mybatis-config.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"https://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<properties resource="db.properties"></properties>
<settings>
<setting name="cacheEnabled" value="true"/>
</settings>
<plugins>
<!-- 注册拦截器-->
<!-- 分页插件-->
<!-- <plugin interceptor="com.github.pagehelper.PageInterceptor"></plugin>-->
<plugin interceptor="com.huang.plugins.MyPlugin"></plugin>
<plugin interceptor="com.huang.plugins.MyPageHelper"></plugin>
</plugins>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="url"
value="jdbc:mysql://localhost:3306/my_erp?serverTimeZone=asia/shanghai&rewriteBatchedStatements=true"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="mapper/MaterialMapper.xml"/>
<mapper resource="mapper/CategoryMapper.xml"/>
<mapper class="com.huang.dao.SupplierMapper"/>
</mappers>
</configuration>
(3)创建实体类,dao接口
(4)创建mapper文件:Mapper.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--namespace:命名空间-->
<mapper namespace="">
</mapper>
(5)加载全局文件
private static SqlSessionFactory sqlSessionFactory = null;
String resource = "mybatis-config.xml";
InputStream inputStream = null;
try {
inputStream = Resources.getResourceAsStream(resource);
} catch (IOException e) {
throw new RuntimeException(e);
}
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession sqlSession = sqlSessionFactory.openSession(true);
SupplierMapper mapper = sqlSession.getMapper(SupplierMapper.class);
1.5 Mapper.xml文件常用标签
select标签,insert标签,update标签,delete标签,此外还有foreach,where标签,if标签等标签可以生成动态sql语句
1.6 关联查询
关联查询使用resultMap元素,用来解决实体属性名和数据库表字段名不一致的问题(起别名),可以将查询结果映射成实体对象
在使用查询语句时要在上面加一个resultMap标签
<resultMap id="materialMap1" type="com.huang.entity.Material">
<id property="id" column="id"></id>
<result property="name" column="cname"></result>
</resultMap>
<select id="query1" resultMap="materialMap1">
select * from material
</select>
多对一
在resultMap标签中加入<association>标签
一对多
在resultMap标签中加入<collection>标签
1.7 Mybatis缓存
mybatis缓存分为一级缓存和二级缓存。
一级缓存是基于HashMap的本地缓存,一级缓存默认开启,范围为一次sqlsession,当sqlsession刷新或者关闭时候,缓存会清除。
二级缓存是全局缓存,需要手动开启和配置,它的范围为Mapper级别,也使用HashMap存储
一级缓存缓存的是sql语句,二级缓存缓存的是结果对象,二级缓存的优先级高于一级缓存。
1.8 注解
除使用Mapper.xml文件写sql语句外,mybatis还有一种在dao接口中注解写sql语句的方式
需要在全局配置中注册:
<mappers>
<!-- 全类名-->
<mapper class="com.mrlang.dao.SupplierMapper"/>
</mappers>
1.9 插件
mybatis允许在映射语句执行过程中进行拦截调用其他方法。
步骤:
(1)创建拦截接口
(2)创建类实现接口
(3)在全局配置中注册拦截器插件
<plugins>
<plugin interceptor="interceptor.MyPlugin"></plugin>
<!-- <plugin interceptor="com.github.pagehelper.PageInterceptor"></plugin>-->
</plugins>
通过拦截器可以实现分页功能
Mysql事务
2.1 什么是事务
事务是一组操作的集合,要么一起执行,要么不执行
2.2 事务的四大特征
ACID:
原子性:事务是一个不可分割的单位,要么一起执行,要么一起不执行
一致性:事务执行前后数据总体保持一致
隔离性:一个事务的执行不能被另一个事务干扰
持久性:事务一旦执行完毕,数据库中的数据就会发生改变,存储在磁盘上
2.3 事务并发操作时可能会引发的问题
脏读:一个事务进行了数据修改操作,但并未提交,另一个事务能看到未提交的修改后的数据
不可重复读:一个事务进行了两次读操作,另一个事务在这期间进行了修改操作,第一个事务两次读的数据不一样
幻读:一个事务进行了读操作,另一个事务进行了修改操作,第一个事务进行修改操作的时候报错,再次读的时候和第一次读的状态一样
2.4 事务的隔离级别
读未提交
读已提交
可重复读
串行化
2.5 操作事务的命令
-
start transaction; 开启事务
-
commit; 提交
-
rollback; 回滚
Spring
3.1 什么是Spring?
Spring是一种轻量型的控制反转和面向切面的框架,它是为了解决企业开发的复杂性而设计的
3.2 什么是IOC?
IOC是控制反转,是一种编程思想:对象的创建由原来的new创建交给Spring容器创建
控制:控制对象的创建,对象的生命周期的管理,依赖关系管理
反转:原来是程序创建,现在是第三方容器创建
DI:依赖注入,是ioc思想的一种体现,对象间的依赖关系交给Spring容器负责注入
3.3 如何创建一个Spring项目
(1)创建maven工程
(2)添加架包:spring-beans、spring-core、spring-context
(3)创建全局配置
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd">
</beans>
(4)创建dao接口和实现类
3.4 依赖注入
(1)属性注入:bean中加入<property>标签
(2)构造注入:类中要有无参和有参构造,bean中加入<constructor>标签
(3)自动装配:bean标签中加入autowire属性
3.5 基于注解的设置bean
在全局配置中加入注解扫描
<?xml version="1.0" encoding="UTF-8"?>
<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"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<!-- 注解扫描-->
<context:component-scan base-package="com.mrlang"/>
</beans>
用注解添加bean:@Component、@Repository、@Service、@Controller
用注解添加依赖:@Autowired、@Resource、@Qualifier
3.6 什么是AOP
AOP是面向切面编程,是对面向对象思想的补充,AOP是横向扩展,将共性问题的解决方案单独抽象出来,利用横切技术切入系统中,底层实现是动态代理
连接点:指要被动态代理的方法
切入点:是对连接点的描述,是正则表达式
通知:指代理的方法,对切入点的增强
3.7 xml实现AOP
(1)引入依赖包:spring-aop,spring-aspects
(2)定义切面类
(3)在切面类中定义通知方法
(4)在xml中配置
<?xml version="1.0" encoding="UTF-8"?>
<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"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/aop
https://www.springframework.org/schema/aop/spring-aop.xsd">
<!-- 注解扫描-->
<context:component-scan base-package="com.huang"/>
<!-- <bean id="userDaoImpl" class="com.huang.dao.UserDaoImpl"></bean>-->
<!-- <bean id="userServiceImpl" class="com.huang.service.UserServiceImpl">-->
<!-- <property name="userDao" ref="userDaoImpl"></property>-->
<!-- </bean>-->
<!-- <bean id="userServiceImpl" class="com.huang.service.UserServiceImpl">-->
<!-- <constructor-arg name="userDao" ref="userDaoImpl"></constructor-arg>-->
<!-- </bean>-->
<!-- <bean id="userServiceImpl" class="com.huang.service.UserServiceImpl" autowire="byType"></bean>-->
<!-- <bean id="myAop" class="com.huang.aop.MyAop"></bean>-->
<!-- <aop:config>-->
<!-- <aop:aspect ref="myAop">-->
<!-- <aop:pointcut id="one" expression="execution(* com.huang.service.UserServiceImpl.query())"/>-->
<!-- <aop:before method="startTran" pointcut-ref="one"></aop:before>-->
<!-- <aop:after method="endTran" pointcut-ref="one"></aop:after>-->
<!-- </aop:aspect>-->
<!-- </aop:config>-->
<aop:aspectj-autoproxy />
</beans>
3.8 基于注解实现AOP
在xml文件中启用注解代理
<aop:aspectj-autoproxy />
3.9 使用注解配置容器类
@Configuration
@ComponentScan("com.huang")
@EnableAspectJAutoProxy
public class App {
@Bean
public UserService one() {
return new UserServiceImpl1();
}
}
@Configuration是Spring框架中的一个注解,用于表示一个Java类是Spring应用程序上下文的配置类。
@ComponentScan开启组成扫描注解,表示一个目录下可以使用注解
@EnableAspectJAutoProxy表示可以启用AOP代理