目录
一、AOP 的注解方式
1.定义切面类
@Aspect 用来定义当前类是切面类。
2.定义通知类型
@Before
@AfterReturing
@Around
@After
@AfterThrowing
3.步骤
1)新建 MyAspect 切面类,然后在切面类上面,使用 @Aspect 注解标注当前类是切面类。
@Component(value = "myAspect")
@Aspect
public class MyAspect {
}
2)新建 UserDao 接口类和 UserDaoImpl 实现类。并添加 save 和 update 方法。
@Override
public void save() throws Exception {
System.out.println("我是 save() 方法");
}
@Override
public void update() throws Exception {
System.out.println("我是 update() 方法");
}
3)在切面类中,添加对应的增强方法。
// 作为前置通知,切入到某个指定的方法中,进行增强
@Before(value = "execution(public void com.neuedu.dao.impl.UserDaoImpl.save())")
public void hello() {
System.out.println("我是增强后的内容..");
}
@Around(value = "execution(public void com.neuedu.dao.impl.UserDaoImpl.update())")
public void arround(ProceedingJoinPoint joinpoint) {
System.out.println("环绕通知 ----- 前面执行");
try {
// 在中间,需要把目标对象的方法也执行一遍
joinpoint.proceed();
} catch (Throwable e) {
e.printStackTrace();
}
System.out.println("环绕通知 ----- 后面执行");
}
4.如果切入表达式,大部分都是一样的话,则可考虑抽取处理啊,简单利用
1)先抽取出来
@Pointcut(value = "execution(public void com.neuedu.dao.impl.UserDaoImpl.save())")
public void userSave() {}
@Pointcut(value = "execution(public void com.neuedu.dao.impl.UserDaoImpl.update())")
public void userUpdate() {}
2)进行使用:类名.方法名()
@Before(value = "MyAspect.userSave()")
@Around(value = "MyAspect.userUpdate()")
二、Spring 的 JDBC 模板
1.简单理解 JDBC 流程
2.在数据库中,创建一张表
Create table stu (
Id int primary key auto_increment,
Name varchar(50),
Age int
);
3.给项目导包,搭建环境。
1)启动包 mysql-connector-java-5.1.43-bin.jar
2)Spring 中所有相关的包:spring-jdbc、spring-tx
4.添加一个配置文件:db.properties,主要用来存储数据库连接的信息。
5.测试
public void fun1() throws Exception {
// 1. 创建数据源对象
DriverManagerDataSource ds = new DriverManagerDataSource();
// 数据库的驱动
ds.setDriverClassName("com.mysql.jdbc.Driver");
// 连接数据库的地址
// 如果数据库是本地的话,则可以简写为:jdbc:mysql:///jss
ds.setUrl("jdbc:mysql://127.0.0.1:33066/jss?serverTimezone=UTC");
// 用户名
ds.setUsername("root");
// 密码
ds.setPassword("1234");
// 2. 创建模板类
JdbcTemplate template = new JdbcTemplate(ds);
// 3. 完成数据的添加
template.update("insert into stu values(1, 'cuihua', 18.8)");
}
但是,我们现在学了 Spring 之后,就不再建议大家通过 new 的方式去管理了。我们应该将所有的创建都交给 Spring 去管理。接着,我们使用 Spring 来处理数据源和模板的创建和使用。
6.编辑 spring-beans.xml 文件,添加数据源相关信息。
<!-- 将连接数据库的动作,交给 Spring 去管理
以后,我们只要是配置数据源,都统一给 id 值,设置为 dataSource
-->
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://127.0.0.1:33066/jss?serverTimezone=UTC"/>
<property name="username" value="root"/>
<property name="password" value="1234"/>
</bean>
7.编辑 spring-beans.xml 文件,添加模板相关信息。
<!-- 将 JdbcTemplate 模板交给 Spring 管理 -->
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="dataSource"/>
</bean>
8.测试
因为我们需要使用 template 模板,则需要通过注入的方式获取。
// 注入
@Resource
private JdbcTemplate template;
@Test
public void fun2() throws Exception {
template.update("insert into stu values(null, ?, ?)", "花花", 1000);
}
三、使用 Spring 整合第三方数据源
其实,就跟我们在家吃饭用的碗一样,不是吃完就丢掉。而是,吃完之后洗干净消毒,然后下顿饭再拿来用。
接着,主要介绍两个比较优秀的第三方的数据源工具,这两个东西是人家把功能封装好的小框架,可以直接添加到项目中进行使用的。在使用的时候,一样是需要设置一些数据库的基本信息,然后还可以设置一些数据池中的相关量。
比如,我们学习的Hibernate 持久层框架,底层用到的数据源就是 C3P0.
1.DBCP
记得添加下面两个 jar 包:
commons-dbcp2-2.5.0-bin.zip
commons-pool2-2.6.0-bin.zip
<!-- 配置 DBCP 数据源 -->
<bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://127.0.0.1:33066/jss?serverTimezone=UTC"/>
<property name="username" value="root"/>
<property name="password" value="1234"/>
</bean>
2.C3P0
需要添加一个 jar 包:c3p0
官网:https://www.mchange.com/projects/c3p0/
需要多导入 mchange-commons-java-0.2.3.4.jar 文件一起使用
注意:如果 c3p0 是跟 Spring 项目一期使用的话,则需要选择 springsource 资源中的版本。
<!-- 配置 C3P0 数据源 -->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass" value="com.mysql.jdbc.Driver"/>
<property name="jdbcUrl" value="jdbc:mysql://127.0.0.1:33066/jss?serverTimezone=UTC"/>
<property name="user" value="root"/>
<property name="password" value="1234"/>
</bean>
四、JDBC 模板的使用
1.修改
template.update("update stu set name = ? where id = ?", "春花", 1);
2.删除
template.update("delete from stu where id = ?", 5);
3.查询一条记录
User user = template.queryForObject("select * from stu where id = ?", new BeanMapper(), 1);
System.out.println(user);
4.查询所有记录
// 方式2:查询所有的数据
List<User> list2 = template.query("select * from stu", new BeanMapper());
for (User user : list2) {
System.out.println(user);
}
// 方式1: 查询所有的数据
List<Map<String, Object>> list = template.queryForList("select * from stu");
for (Map<String, Object> map : list) {
// map.keySet() 用于获取所有的 key
for (String key : map.keySet()) {
// 通过 key 获取到对应的 value 值
System.out.print(map.get(key));
}
// 相当于换行效果
System.out.println();
}
五、事务
只要记住一句话:执行意见事情,要么一期成功,要么一期不成功。
比如,转账。
A 给 B 转账 1000 块。
如果 B 收到,则 A 账户中应该少 1000。
如果 B 未收到,则 A 账户中不变。
在执行转账的时候,万一银行的系统出现故障,刚好转账进行到中段,此时只要不能完全成功,数据应该回滚到原始状态。简单理解,就是什么都没发生过。
在开发中,我们的事务处理,一般情况都建议在 Service 层中进行。
在操作事务的时候,以前的做法大致如下:
1)开启事务
2)执行事务
3)提交事务
4)如果有异常出现,则回滚事务,将数据复原
现在如果使用 Spring 来处理事务,其实非常简单。
1)配置事务管理器
<!-- 配置事务管理器 transactionManager
需要跟数据源一起使用
-->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
2)开启事务驱动注解
<tx:annotation-driven transaction-manager="transactionManager"/>
3)在需要使用事务的类上(也就是 service 层),使用 @Transactional 注解即可。
注意,@Transactional 注解既可以作用在类上,也可以在类中单独的方法上实现事务。
附:关于 MySQL 8 的使用
1.安装 MySQL 8 版本需要注意的问题
参考:https://blog.csdn.net/u012278016/article/details/80539205
2.MySQL8 使用需要使用最新版本的驱动。
参考:mysql-connector-java-8.0.11.jar
3.在设置 URL 的时候
参考:"jdbc:mysql://127.0.0.1:3306/jss?serverTimezone=UTC"