首页
Search
1
redis的下载和安装
57 阅读
2
Vue的异步操作
56 阅读
3
java连接redis
44 阅读
4
redis得基本操作
40 阅读
5
网络设备的描述
39 阅读
vue
redis
网络基础
mybatis
Spring
登录
Search
标签搜索
vue
redis
mybatis
limei
累计撰写
21
篇文章
累计收到
390
条评论
首页
栏目
vue
redis
网络基础
mybatis
Spring
页面
搜索到
9
篇与
的结果
2023-10-13
Spring整合mybaties事务案例(纯注解)
spring整合mybatis事务案例首先 需要下载需要的sql:sql下载案例目录结构 1.实体类和jdbc.properties文件 2.dao层编写 3.service层接口和实现 4.config目录下编写 5.注解测试UserServiceTest运行 pom.xml 1.实体类和jdbc.properties文件package com.limei.domain; import java.io.Serializable; public class Account implements Serializable { private Integer id; private String name; private Double money; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Double getMoney() { return money; } public void setMoney(Double money) { this.money = money; } @Override public String toString() { return "Account{" + "id=" + id + ", name='" + name + '\'' + ", money=" + money + '}'; } } <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.limei.aop</groupId> <artifactId>Spring_aop</artifactId> <version>1.0-SNAPSHOT</version> <dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>5.1.9.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>5.1.9.RELEASE</version> </dependency> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.5.3</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.47</version> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.1.16</version> </dependency> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis-spring</artifactId> <version>1.3.0</version> </dependency> <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjweaver</artifactId> <version>1.9.4</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-test</artifactId> <version>5.1.9.RELEASE</version> </dependency> </dependencies> </project>2.dao层编写package com.limei.dao; import org.apache.ibatis.annotations.Param; import org.apache.ibatis.annotations.Update; import java.util.List; public interface AccountDao { /** * 入账操作 * @param name 入账用户名 * @param money 入账金额 */ @Update("update account set money = money + #{money} where name = #{name}") void inMoney(@Param("name") String name, @Param("money") Double money); /** * 出账操作 * @param name 出账用户名 * @param money 出账金额 */ @Update("update account set money = money - #{money} where name = #{name}") void outMoney(@Param("name") String name, @Param("money") Double money); } 3.service层接口和实现package com.limei.service; import org.springframework.transaction.annotation.Isolation; import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Transactional; import java.io.IOException; import java.util.List; @Transactional(isolation = Isolation.DEFAULT) public interface AccountService { /** * 转账操作 * @param outName 出账用户名 * @param inName 入账用户名 * @param money 转账金额 */ @Transactional( readOnly = false, timeout = -1, isolation = Isolation.DEFAULT, rollbackFor = {}, noRollbackFor = {}, propagation = Propagation.REQUIRES_NEW ) public void transfer(String outName, String inName, Double money); } package com.limei.service.impl; import com.limei.dao.AccountDao; import com.limei.service.AccountService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @Service("accountService") public class AccountServiceImpl implements AccountService { @Autowired private AccountDao accountDao; /** * 转账操作 * * @param outName 出账用户名 * @param inName 入账用户名 * @param money 转账金额 */ public void transfer(String outName, String inName, Double money) { accountDao.inMoney ( outName,money); int i=1/0; accountDao.outMoney ( inName,money ); } } 4.config目录下编写package com.limei.config; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Import; import org.springframework.context.annotation.PropertySource; import org.springframework.transaction.annotation.EnableTransactionManagement; @Configuration @ComponentScan("com.limei") @PropertySource("classpath:jdbc.properties") @Import({JDBCConfig.class,MyBatisConfig.class}) @EnableTransactionManagement public class SpringConfig { } package com.limei.config; import org.mybatis.spring.SqlSessionFactoryBean; import org.mybatis.spring.mapper.MapperScannerConfigurer; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import javax.sql.DataSource; public class MyBatisConfig { @Bean public SqlSessionFactoryBean getSqlSessionFactoryBean(@Autowired DataSource dataSource){ SqlSessionFactoryBean ssfb = new SqlSessionFactoryBean(); ssfb.setTypeAliasesPackage("com.limei.domain"); ssfb.setDataSource(dataSource); return ssfb; } @Bean public MapperScannerConfigurer getMapperScannerConfigurer(){ MapperScannerConfigurer msc = new MapperScannerConfigurer(); msc.setBasePackage("com.limei.dao"); return msc; } } package com.limei.config; import com.alibaba.druid.pool.DruidDataSource; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.jdbc.datasource.DataSourceTransactionManager; import org.springframework.transaction.PlatformTransactionManager; import javax.sql.DataSource; public class JDBCConfig { @Value("${jdbc.driver}") private String driver; @Value("${jdbc.url}") private String url; @Value("${jdbc.username}") private String userName; @Value("${jdbc.password}") private String password; @Bean("dataSource") public DataSource getDataSource(){ DruidDataSource ds = new DruidDataSource(); ds.setDriverClassName(driver); ds.setUrl(url); ds.setUsername(userName); ds.setPassword(password); return ds; } @Bean public PlatformTransactionManager getTransactionManager(DataSource dataSource){ return new DataSourceTransactionManager(dataSource); } } 5.注解测试UserServiceTest运行 package com.limei.service; import com.limei.config.SpringConfig; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; //设定spring专用的类加载器 @RunWith(SpringJUnit4ClassRunner.class) //设定加载的spring上下文对应的配置 @ContextConfiguration(classes = SpringConfig.class) public class UserServiceTest { @Autowired private AccountService accountService; @Test public void testTransfer(){ accountService.transfer ( "张三","李四",100D ); } }6.pom.xml <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.limei.aop</groupId> <artifactId>Spring_aop</artifactId> <version>1.0-SNAPSHOT</version> <dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>5.1.9.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>5.1.9.RELEASE</version> </dependency> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.5.3</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.47</version> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.1.16</version> </dependency> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis-spring</artifactId> <version>1.3.0</version> </dependency> <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjweaver</artifactId> <version>1.9.4</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-test</artifactId> <version>5.1.9.RELEASE</version> </dependency> </dependencies> </project>
2023年10月13日
20 阅读
1 评论
1 点赞
2023-09-26
Spring事务
1.事物的介绍 2.事务管理 3.事务控制案例(编程式) 4.aop改造事务(编程式) 5.声明式事务(XML格式) 6.tx-method的详解和传播行为 7.声明式事务改造(注解) 1.事物的介绍1.1 什么是事务?事务指数据库中多个操作合并在一起形成的操作序列1.2事务的作用1.当数据库操作序列中个别操作失败时,提供一种方式使数据库状态恢复到正常状态(A),保障数据库即使在异常状态下仍能保持数据一致性(C)(要么操作前状态,要么操作后状态)。2.当出现并发访问数据库时,在多个访问间进行相互隔离,防止并发访问操作结果互相干扰(I)。事务特征(ACID)原子性(Atomicity)指事务是一个不可分割的整体,其中的操作要么全执行或全不执行一致性(Consistency)事务前后数据的完整性必须保持一致隔离性(Isolation)事务的隔离性是多个用户并发访问数据库时,数据库为每一个用户开启的事务,不能被其他事务的操作数据所干扰,多个并发事务之间要相互隔离持久性(Durability)持久性是指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来即使数据库发生故障也不应该对其有任何影响1.3事务的隔离级脏读:允许读取未提交的信息原因:Read uncommitted-解决方案: (表级读锁)不可重复读:读取过程中单个数据发生了变化解决方案: Repeatable read (行级写锁)幻读:读取过程中数据条目发生了变化解决方案: Serializable(表级写锁)2.事物管理2.1Spring事务核心对象J2EE开发使用分层设计的思想进行,对于简单的业务层转调数据层的单一操作,事务开启在业务层或者数据层并无太大差别,当业务中包含多个数据层的调用时,需要在业务层开启事务,对数据层中多个操作进行组合并归属于同一个事务进行处理Spring为业务层提供了整套的事务解决方案PlatformTransactionManagerTransactionDefinitionTransactionStatus2.2 PlatformTransactionManager平台事务管理器实现类DataSourceTransactionManager 适用于Spring JDBC或MyBatisHibernateTransactionManager 适用于Hibernate3.0及以上版本JpaTransactionManager 适用于JPAJdoTransactionManager 适用于JDOJtaTransactionManager 适用于JTAJPA(Java Persistence API)Java EE 标准之一,为POJO提供持久化标准规范,并规范了持久化开发的统一API,符合JPA规范的开发可以在不同的JPA框架下运行JDO(Java Data Object )是Java对象持久化规范,用于存取某种数据库中的对象,并提供标准化API。与JDBC相比,JDBC仅针对关系数据库进行操作,JDO可以扩展到关系数据库、文件、XML、对象数据库(ODBMS)等,可移植性更强JTA(Java Transaction API)Java EE 标准之一,允许应用程序执行分布式事务处理。与JDBC相比,JDBC事务则被限定在一个单一的数据库连接,而一个JTA事务可以有多个参与者,比如JDBC连接、JDO 都可以参与到一个JTA事务中此接口定义了事务的基本操作获取事务 :TransactionStatus getTransaction(TransactionDefinition definition)提交事务 :void commit(TransactionStatus status) 回滚事务 :void rollback(TransactionStatus status)2.3 TransactionDefinition此接口定义了事务的基本信息获取事务定义名称String getName()获取事务的读写属性boolean isReadOnly()获取事务隔离级别int getIsolationLevel()获事务超时时间int getTimeout()获取事务传播行为特征int getPropagationBehavior()2.4 TransactionStatus此接口定义了事务在执行过程中某个时间点上的状态信息及对应的状态操作3.事务控制案例(编程式)首先 需要下载需要的sql:sql下载案例目录结构银行转账业务说明:银行转账操作中,涉及从A账户到B账户的资金转移操作。数据层仅提供单条数据的基础操作,未设计多账户间的业务操作。 实体类和jdbc的编写 dao层和AccountDao.xml编写 service层编写 app的编写 applicationContext.xml编写 pom.xml 实体类和jdbc的编写package com.limei.domain; import java.io.Serializable; public class Account implements Serializable { private Integer id; private String name; private Double money; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Double getMoney() { return money; } public void setMoney(Double money) { this.money = money; } @Override public String toString() { return "Account{" + "id=" + id + ", name='" + name + '\'' + ", money=" + money + '}'; } } jdbc.driver=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql://localhost:3306/lianxi jdbc.username=root jdbc.password=123456dao层和AccountDao.xml编写package com.limei.dao; import org.apache.ibatis.annotations.Param; import java.util.List; public interface AccountDao { /** * 入账操作 * @param name 入账用户名 * @param money 入账金额 */ void inMoney(@Param("name") String name, @Param("money") Double money); /** * 出账操作 * @param name 出账用户名 * @param money 出账金额 */ void outMoney(@Param("name") String name, @Param("money") Double money); } <?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.limei.dao.AccountDao"> <update id="inMoney"> update account set money = money + #{money} where name = #{name} </update> <update id="outMoney"> update account set money = money - #{money} where name = #{name} </update> </mapper>service层编写package com.limei.service; import java.util.List; public interface AccountService { /** * 转账操作 * @param outName 出账用户名 * @param inName 入账用户名 * @param money 转账金额 */ public void transfer(String outName, String inName, Double money); } package com.limei.service.impl; import com.limei.dao.AccountDao; import com.limei.domain.Account; import com.limei.service.AccountService; import org.springframework.jdbc.datasource.DataSourceTransactionManager; import org.springframework.transaction.PlatformTransactionManager; import org.springframework.transaction.TransactionDefinition; import org.springframework.transaction.TransactionStatus; import org.springframework.transaction.support.DefaultTransactionDefinition; import javax.sql.DataSource; public class AccountServiceImpl implements AccountService { private AccountDao accountDao; public void setAccountDao(AccountDao accountDao) { this.accountDao = accountDao; } private DataSource dataSource; public void setDataSource(DataSource dataSource) { this.dataSource = dataSource; } public void transfer(String outName, String inName, Double money) { //开启事务 PlatformTransactionManager ptm = new DataSourceTransactionManager (dataSource); //事务定义 TransactionDefinition td = new DefaultTransactionDefinition (); //事务状态 TransactionStatus ts = ptm.getTransaction(td); accountDao.inMoney(outName,money); int i = 1/0; accountDao.outMoney(inName,money); //提交事务 ptm.commit(ts); } }aop的编写import com.limei.service.AccountService; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class App { public static void main(String[] args) { ApplicationContext ctx = new ClassPathXmlApplicationContext ("applicationContext.xml"); AccountService accountService = (AccountService) ctx.getBean("accountService"); accountService.transfer("李四","张三",100D); } }applicationContext.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 https://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/aop https://www.springframework.org/schema/aop/spring-aop.xsd"> <context:property-placeholder location="classpath:*.properties"/> <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"> <property name="driverClassName" value="${jdbc.driver}"/> <property name="url" value="${jdbc.url}"/> <property name="username" value="${jdbc.username}"/> <property name="password" value="${jdbc.password}"/> </bean> <bean id="accountService" class="com.limei.service.impl.AccountServiceImpl"> <property name="accountDao" ref="accountDao"/> <property name="dataSource" ref="dataSource"/> </bean> <bean class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="dataSource"/> <property name="typeAliasesPackage" value="com.limei.domain"/> </bean> <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <property name="basePackage" value="com.limei.dao"/> </bean> </beans>pom.xml<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.limei.aop</groupId> <artifactId>Spring_aop</artifactId> <version>1.0-SNAPSHOT</version> <dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>5.1.9.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>5.1.9.RELEASE</version> </dependency> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.5.3</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.47</version> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.1.16</version> </dependency> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis-spring</artifactId> <version>1.3.0</version> </dependency> <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjweaver</artifactId> <version>1.9.4</version> </dependency> </dependencies> </project>4.aop改造事务(编程式)使用AOP控制事务将业务层的事务处理功能抽取出来制作成AOP通知,利用环绕通知运行期动态织入。在limei下创建aop,然后在aop下创建TxAdvice类。package com.limei.aop; import org.aspectj.lang.ProceedingJoinPoint; import org.springframework.jdbc.datasource.DataSourceTransactionManager; import org.springframework.transaction.PlatformTransactionManager; import org.springframework.transaction.TransactionDefinition; import org.springframework.transaction.TransactionStatus; import org.springframework.transaction.support.DefaultTransactionDefinition; import javax.sql.DataSource; public class TxAdvice { private DataSource dataSource; public void setDataSource(DataSource dataSource) { this.dataSource = dataSource; } public Object transactionManager(ProceedingJoinPoint pjp) throws Throwable { //开启事务 PlatformTransactionManager ptm = new DataSourceTransactionManager(dataSource); //事务定义 TransactionDefinition td = new DefaultTransactionDefinition(); //事务状态 TransactionStatus ts = ptm.getTransaction(td); Object ret = pjp.proceed(pjp.getArgs()); //提交事务 ptm.commit(ts); return ret; } } }配置AOP通知类,并注入dataSource。<bean id="txAdvice" class="com.itheima.aop.TxAdvice"> <property name="dataSource" ref="dataSource"/> </bean>使用环绕通知将通知类织入到原始业务对象执行过程中<aop:config> <aop:pointcut id="pt" expression="execution(* *..transfer(..))"/> <aop:aspect ref="txAdvice"> <aop:around method="tx" pointcut-ref="pt"/> </aop:aspect> </aop:config>5.声明式事务(XML格式)在事务控制案例中的 applicationContext.xml中增加以下配置:<!--开启事务--> <bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource"/> </bean> <!--使用tx命名空间配置事务专属通知类--> <tx:advice id="txAdvice" transaction-manager="txManager"> <tx:attributes> <tx:method name="*" read-only="false" /> <tx:method name="get*" read-only="true" /> <tx:method name="find*" read-only="true" /> </tx:attributes> </tx:advice> <!--使用aop:advisor在AOP配置中引用事务专属通知类--> <aop:config> <aop:pointcut id="pt" expression="execution(* com.limei.service.*Service.*(..))"/> <aop:advisor advice-ref="txAdvice" pointcut-ref="pt"/> </aop:config>aop:advice与aop:advisor区别aop:advice配置的通知类可以是普通java对象,不实现接口,也不使用继承关系aop:advisor配置的通知类必须实现通知接口MethodBeforeAdviceAfterReturningAdviceThrowsAdvice6.tx-method的详解和传播行为tx配置----tx:method事务的传播行为7.声明式事务改造(注解)可以在上述AccountService接口中 添加事务,替换applicationContext.xml 中的事务@Transactional名称:@Transactional类型:方法注解,类注解,接口注解位置:方法定义上方,类定义上方,接口定义上方作用:设置当前类/接口中所有方法或具体方法开启事务,并指定相关事务属性范例:@Transactional( readOnly = false, timeout = -1, isolation = Isolation.DEFAULT, rollbackFor = {ArithmeticException.class, IOException.class}, noRollbackFor = {}, propagation = Propagation.REQUIRES_NEW )tx:annotation-driven在applicationContext.xml中添加下面这段代码名称:tx:annotation-driven类型:标签归属:beans标签作用:开启事务注解驱动,并指定对应的事务管理器范例:<tx:annotation-driven transaction-manager="txManager"/>
2023年09月26日
26 阅读
1 评论
0 点赞
2023-09-18
AOP的入门和案例(注解)
1.AOP的配置 2.AOP的注解驱动 3.综合案例 AOP的配置注解开发AOP制作步骤在XML格式基础上导入坐标(伴随spring-context坐标导入已经依赖导入完成)开启AOP注解支持配置切面@Aspect定义专用的切入点方法,并配置切入点@Pointcut为通知方法配置通知类型及对应切入点@Before注解开发AOP注意事项1.切入点最终体现为一个方法,无参无返回值,无实际方法体内容,但不能是抽象方法2.引用切入点时必须使用方法调用名称,方法后面的()不能省略3.切面类中定义的切入点只能在当前类中使用,如果想引用其他类中定义的切入点使用“类名.方法名()”引用4.可以在通知类型注解后添加参数,实现XML配置中的属性,例如after-returning后的returning属性AOP的注解驱动AOP注解驱动名称:@EnableAspectJAutoProxy类型:注解位置:Spring注解配置类定义上方作用:设置当前类开启AOP注解驱动的支持,加载AOP注解格式:@Configuration @ComponentScan("com.limei") @EnableAspectJAutoProxy public class SpringConfig { }综合案例首先 需要下载需要的sql:sql下载案例目录结构 实体类和jdbc的编写 config编写 dao层编写 service层编写 aop的编写 测试类编写 pom.xml 实体类和jdbc的编写package com.limei.domain; import java.io.Serializable; public class Account implements Serializable { private Integer id; private String name; private Double money; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Double getMoney() { return money; } public void setMoney(Double money) { this.money = money; } @Override public String toString() { return "Account{" + "id=" + id + ", name='" + name + '\'' + ", money=" + money + '}'; } } jdbc.driver=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql://localhost:3306/lianxi jdbc.username=root jdbc.password=123456config编写package com.limei.config; import com.alibaba.druid.pool.DruidDataSource; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import javax.sql.DataSource; public class JDBCConfig { @Value("${jdbc.driver}") private String driver; @Value("${jdbc.url}") private String url; @Value("${jdbc.username}") private String userName; @Value("${jdbc.password}") private String password; @Bean("dataSource") public DataSource getDataSource(){ DruidDataSource ds = new DruidDataSource(); ds.setDriverClassName(driver); ds.setUrl(url); ds.setUsername(userName); ds.setPassword(password); return ds; } } package com.limei.config; import org.mybatis.spring.SqlSessionFactoryBean; import org.mybatis.spring.mapper.MapperScannerConfigurer; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import javax.sql.DataSource; public class MyBatisConfig { @Bean public SqlSessionFactoryBean getSqlSessionFactoryBean(@Autowired DataSource dataSource){ SqlSessionFactoryBean ssfb = new SqlSessionFactoryBean(); ssfb.setTypeAliasesPackage("com.limei.domain"); ssfb.setDataSource(dataSource); return ssfb; } @Bean public MapperScannerConfigurer getMapperScannerConfigurer(){ MapperScannerConfigurer msc = new MapperScannerConfigurer(); msc.setBasePackage("com.limei.dao"); return msc; } } package com.limei.config; import com.limei.aop.RunTimeMonitorAdvice; import com.limei.config.JDBCConfig; import com.limei.config.MyBatisConfig; import org.springframework.context.annotation.*; @Configuration @ComponentScan ( "com" ) @PropertySource("classpath:jdbc.properties") @Import({JDBCConfig.class, MyBatisConfig.class}) @EnableAspectJAutoProxy public class SpringConfig { }dao层编写package com.limei.dao; import com.limei.domain.Account; import org.apache.ibatis.annotations.Delete; import org.apache.ibatis.annotations.Insert; import org.apache.ibatis.annotations.Select; import org.apache.ibatis.annotations.Update; import java.util.List; public interface AccountDao { @Insert("insert into account(name,money)values(#{name},#{money})") void save(Account account); @Delete("delete from account where id = #{id} ") void delete(Integer id); @Update("update account set name = #{name} , money = #{money} where id = #{id} ") void update(Account account); @Select("select * from account") List<Account> findAll(); @Select("select * from account where id = #{id}") Account findById(Integer id); }service层编写package com.limei.service; import com.limei.domain.Account; import java.util.List; public interface AccountService { void save(Account account); void delete(Integer id); void update(Account account); List<Account> findAll(); Account findById(Integer id); } package com.limei.service.impl; import com.limei.dao.AccountDao; import com.limei.domain.Account; import com.limei.service.AccountService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.List; @Service("accountService") public class AccountServiceImpl implements AccountService { @Autowired private AccountDao accountDao; public void save(Account account) { accountDao.save(account); } public void update(Account account){ accountDao.update(account); } public void delete(Integer id) { accountDao.delete(id); } public Account findById(Integer id) { return accountDao.findById(id); } public List<Account> findAll() { return accountDao.findAll(); } } aop的编写package com.limei.aop; import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.Signature; import org.aspectj.lang.annotation.Around; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Pointcut; import org.springframework.stereotype.Component; @Component @Aspect public class RunTimeMonitorAdvice { //切入点,监控业务层接口 @Pointcut("execution(* com.limei.service.*Service.find*(..))") public void pt(){ } @Around("pt()") public Object runtimeAround(ProceedingJoinPoint pjp) throws Throwable { //获取执行签名信息 Signature signature = pjp.getSignature(); //通过签名获取执行类型(接口名) String className = signature.getDeclaringTypeName(); //通过签名获取执行操作名称(方法名) String methodName = signature.getName(); //原始方法的调用 Object ret=pjp.proceed (pjp.getArgs ()); //执行时长累计值 long sum = 0L; for (int i = 0; i < 10000; i++) { //获取操作前系统时间beginTime long startTime = System.currentTimeMillis(); //原始操作调用 pjp.proceed(pjp.getArgs()); //获取操作后系统时间endTime long endTime = System.currentTimeMillis(); sum += endTime-startTime; } //打印信息 System.out.println(className+":"+methodName+" (万次)run:"+sum+"ms"); return ret; } } 测试类编写package com.limei.service; import com.limei.config.SpringConfig; import com.limei.domain.Account; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import java.util.List; //设定spring专用的类加载器 @RunWith(SpringJUnit4ClassRunner.class) //设定加载的spring上下文对应的配置 @ContextConfiguration(classes = SpringConfig.class) public class UserServiceTest { @Autowired private AccountService accountService; @Test public void testFindById(){ Account ac = accountService.findById(1); System.out.println(ac); } @Test public void testFindAll(){ List<Account> list = accountService.findAll(); // System.out.println(list); } } pom.xml<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.limei.aop</groupId> <artifactId>Spring_aop</artifactId> <version>1.0-SNAPSHOT</version> <dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>5.1.9.RELEASE</version> </dependency> <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjweaver</artifactId> <version>1.9.4</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.47</version> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.1.16</version> </dependency> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.5.3</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>5.1.9.RELEASE</version> </dependency> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis-spring</artifactId> <version>1.3.0</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-test</artifactId> <version>5.1.9.RELEASE</version> </dependency> </dependencies> </project>
2023年09月18日
32 阅读
2 评论
0 点赞
2023-09-10
AOP的快速入门(XML)
1.AOP的简介 2.AOP相关概念 3.AOP的通知类型5种 4.AOP入门案例 AOP的简介AOP(Aspect Oriented Programing)面向切面编程,一种编程范式,隶属于软工范畴,指导开发者如何组织程序结构AOP弥补了OOP的不足,基于OOP基础之上进行横向开发uOOP规定程序开发以类为主体模型,一切围绕对象进行,完成某个任务先构建模型uAOP程序开发主要关注基于OOP开发中的共性功能,一切围绕共性功能进行,完成某个任务先构建可能遇到的所有共性功能(当所有功能都开发出来也就没有共性与非共性之分)AOP作用伴随着AOP时代的降临,可以从各个行业的标准化、规范化开始入手,一步一步将所有共性功能逐一开发完毕,最终以功能组合来完成个别业务模块乃至整体业务系统的开发目标:将软件开发由手工制作走向半自动化/全自动化阶段,实现“插拔式组件体系结构”搭建AOP优势提高代码的可重用性业务代码编码更简洁业务代码维护更高效业务功能扩展更便捷AOP的相关概念Joinpoint(连接点):就是方法Pointcut(切入点):就是挖掉共性功能的方法Advice(通知):就是共性功能,最终以一个方法的形式呈现Aspect(切面):就是共性功能与挖的位置的对应关系Target(目标对象):就是挖掉功能的方法对应的类产生的对象,这种对象是无法直接完成最终工作的Weaving(织入):就是将挖掉的功能回填的动态过程Proxy(代理):目标对象无法直接完成工作,需要对其进行功能回填,通过创建原始对象的代理对象实现Introduction(引入/引介) :就是对原始对象无中生有的添加成员变量或成员方法AOP开发过程开发阶段(开发者完成)正常的制作程序将非共性功能开发到对应的目标对象类中,并制作成切入点方法将共性功能独立开发出来,制作成通知在配置文件中,声明切入点在配置文件中,声明切入点与通知间的关系(含通知类型),即切面运行阶段(AOP完成)Spring容器加载配置文件,监控所有配置的切入点方法的执行当监控到切入点方法被运行,使用代理机制,动态创建目标对象的代理对象,根据通知类别,在代理对象的对应位置将通知对应的功能织入,完成完整的代码逻辑并运行AOP的通知类型5种前置通知:原始方法执行前执行,如果通知中抛出异常,阻止原始方法运行应用:数据校验格式:<aop:aspect ref="adviceId"> <aop:before method="methodName" pointcut="……"/> </aop:aspect>说明:一个aop:aspect标签中可以配置多个aop:before标签基本属性:method :在通知类中设置当前通知类别对应的方法pointcut :设置当前通知对应的切入点表达式,与pointcut-ref属性冲突pointcut-ref :设置当前通知对应的切入点id,与pointcut属性冲突后置通知:原始方法执行后执行,无论原始方法中是否出现异常,都将执行通知 应用:现场清理格式:<aop:aspect ref="adviceId"> <aop:after method="methodName" pointcut="……"/> </aop:aspect>说明:一个aop:aspect标签中可以配置多个aop:after标签返回后通知:原始方法正常执行完毕并返回结果后执行,如果原始方法中抛出异常,无法执行 应用:返回- 格式:<aop:aspect ref="adviceId"> <aop:after-returning method="methodName" pointcut="……"/> </aop:aspect>说明:一个aop:aspect标签中可以配置多个aop:after-returning标签值相关数据处理抛出异常后通知:原始方法抛出异常后执行,如果原始方法没有抛出异常,无法执行 应用:对原始方法中出现的异常信息进行处理格式:<aop:aspect ref="adviceId"> <aop:after-throwing method="methodName" pointcut="……"/> </aop:aspect>说明:一个aop:aspect标签中可以配置多个aop:after-throwing标签环绕通知:在原始方法执行前后均有对应执行执行,还可以阻止原始方法的执行 应用:十分强大,可以做任何事情格式:<aop:aspect ref="adviceId"> <aop:around method="methodName" pointcut="……"/> </aop:aspect>说明:一个aop:aspect标签中可以配置多个aop:around标签环绕通知的开发方式环绕通知是在原始方法的前后添加功能,在环绕通知中,存在对原始方法的显式调用public Object around(ProceedingJoinPoint pjp) throws Throwable { Object ret = pjp.proceed(); return ret; }环绕通知方法相关说明:方法须设定Object类型的返回值,否则会拦截原始方法的返回。如果原始方法返回值类型为void,通知方 也可以设定返回值类型为void,最终返回null方法需在第一个参数位置设定ProceedingJoinPoint对象,通过该对象调用proceed()方法,实现对原始方法的调用。如省略该参数,原始方法将无法执行使用proceed()方法调用原始方法时,因无法预知原始方法运行过程中是否会出现异常,强制抛出Throwable对象,封装原始方法中可能出现的异常信息AOP的入门案例案例目录结构 接口和接口实现类 AOP的通知类 xml配置 启动类 接口和接口实现类编写package com.limei.service; public interface UserService { public void save(int i,int m ); } package com.limei.service.impl; import com.limei.service.UserService; public class UserServiceImpl implements UserService { public void save(int i,int m) { //0.将共性功能抽取出来 //System.out.println("共性功能"); System.out.println("user service running..."+i+","+m); } } AOP的通知类package com.limei.aop; import org.aspectj.lang.JoinPoint; public class AOPAdvice { public void function(JoinPoint jp){ Object[] args = jp.getArgs (); System.out.println("共性功能。。。"+args[0]); } public void before(int x,int y){ System.out.println ("before..."+x+","+y); } } 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:p="http://www.springframework.org/schema/p" xmlns:context="http://www.springframework.org/schema/context" xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation="http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/aop https://www.springframework.org/schema/aop/spring-aop.xsd"> <!--3.开启AOP命名空间--> <bean id="userService" class="com.limei.service.impl.UserServiceImpl"/> <!--2.配置共性功能成功spring控制的资源--> <bean id="myAdvice" class="com.limei.aop.AOPAdvice"/> <!--4.配置AOP--> <aop:config> <!--5.配置切入点--> <aop:pointcut id="pt" expression="execution(* *..*(..))"/><!--关键字(访问修饰符 返回值 包名.类名.方法名(参数) 异常名)--> <!--6.配置切面(切入点与通知的关系)--> <aop:aspect ref="myAdvice"> <!--7.配置具体的切入点对应通知中那个操作方法--> <aop:before method="function" pointcut-ref="pt"/> <aop:before method="before" pointcut="execution(* *..*(int,int))&&args(x,y)"></aop:before> </aop:aspect> </aop:config> </beans>启动类import com.limei.service.UserService; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class App { public static void main(String[] args) { ApplicationContext ctx = new ClassPathXmlApplicationContext ( "applicationContext.xml" ); UserService userService = (UserService) ctx.getBean ( "userService" ); userService.save (666,777); } }
2023年09月10日
20 阅读
0 评论
0 点赞
2023-08-25
spring(IOC)整合mybatis案例(注解方式)
spring整合mybatis案例首先需要sql:sql结构下载。 1.实体类和jdbc.properties文件 2.编写业务层接口与实现类 3.编写数据层接口 4.编写原来的xml为注解方式 5.main方法运行 6.注解测试UserServiceTest运行 案例目录结构实体类Accountpackage com.limei.domain; import java.io.Serializable; public class Account implements Serializable { private Integer id; private String name; private Double money; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Double getMoney() { return money; } public void setMoney(Double money) { this.money = money; } @Override public String toString() { return "Account{" + "id=" + id + ", name='" + name + '\'' + ", money=" + money + '}'; } } jdbc.propertiesjdbc.driver=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql://localhost:3306/lianxi jdbc.username=root jdbc.password=1234562.编写业务层接口与实现类package com.limei.service; import com.limei.domain.Account; import java.util.List; public interface AccountService { void save(Account account); void delete(Integer id); void update(Account account); List<Account> findAll(); Account findById(Integer id); } package com.limei.service.impl; import com.limei.dao.AccountDao; import com.limei.domain.Account; import com.limei.service.AccountService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.List; @Service("accountService") public class AccountServiceImpl implements AccountService { @Autowired private AccountDao accountDao; public void save(Account account) { accountDao.save(account); } public void update(Account account){ accountDao.update(account); } public void delete(Integer id) { accountDao.delete(id); } public Account findById(Integer id) { return accountDao.findById(id); } public List<Account> findAll() { return accountDao.findAll(); } } 3.编写数据层接口package com.limei.dao; import com.limei.domain.Account; import org.apache.ibatis.annotations.Delete; import org.apache.ibatis.annotations.Insert; import org.apache.ibatis.annotations.Select; import org.apache.ibatis.annotations.Update; import java.util.List; public interface AccountDao { @Insert("insert into account(name,money)values(#{name},#{money})") void save(Account account); @Delete("delete from account where id = #{id} ") void delete(Integer id); @Update("update account set name = #{name} , money = #{money} where id = #{id} ") void update(Account account); @Select("select * from account") List<Account> findAll(); @Select("select * from account where id = #{id} ") Account findById(Integer id); }4.编写原来的xml为注解方式package com.limei.config; import com.alibaba.druid.pool.DruidDataSource; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import javax.sql.DataSource; public class JDBCConfig { @Value("${jdbc.driver}") private String driver; @Value("${jdbc.url}") private String url; @Value("${jdbc.username}") private String userName; @Value("${jdbc.password}") private String password; @Bean("dataSource") public DataSource getDataSource(){ DruidDataSource ds = new DruidDataSource(); ds.setDriverClassName(driver); ds.setUrl(url); ds.setUsername(userName); ds.setPassword(password); return ds; } } .package com.limei.config; import org.mybatis.spring.SqlSessionFactoryBean; import org.mybatis.spring.mapper.MapperScannerConfigurer; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import javax.sql.DataSource; public class MyBatisConfig { @Bean public SqlSessionFactoryBean getSqlSessionFactoryBean(@Autowired DataSource dataSource){ SqlSessionFactoryBean ssfb = new SqlSessionFactoryBean(); ssfb.setTypeAliasesPackage("com.limei.domain"); ssfb.setDataSource(dataSource); return ssfb; } @Bean public MapperScannerConfigurer getMapperScannerConfigurer(){ MapperScannerConfigurer msc = new MapperScannerConfigurer(); msc.setBasePackage("com.limei.dao"); return msc; } } package com.limei.config; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Import; import org.springframework.context.annotation.PropertySource; @Configuration @ComponentScan("com.limei") @PropertySource("classpath:jdbc.properties") @Import({JDBCConfig.class,MyBatisConfig.class}) public class SpringConfig { }5.main方法运行Test.javaimport com.limei.config.SpringConfig; import com.limei.domain.Account; import com.limei.service.AccountService; import org.springframework.context.ApplicationContext; import org.springframework.context.annotation.AnnotationConfigApplicationContext; public class Test { public static void main(String[] args) { // ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml"); // AccountService accountService = (AccountService) ctx.getBean("accountService"); // Account ac = accountService.findById(2); // System.out.println(ac); ApplicationContext ctx = new AnnotationConfigApplicationContext ( SpringConfig.class); AccountService accountService = (AccountService) ctx.getBean("accountService"); Account ac = accountService.findById(2); System.out.println(ac); } }6.注解测试UserServiceTest运行package limei.service; import com.limei.config.SpringConfig; import com.limei.domain.Account; import com.limei.service.AccountService; import org.junit.Assert; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import java.util.List; //设定spring专用的类加载器 @RunWith(SpringJUnit4ClassRunner.class) //设定加载的spring上下文对应的配置 @ContextConfiguration(classes = SpringConfig.class) public class UserServiceTest { @Autowired private AccountService accountService; @Test public void testFindById(){ Account ac = accountService.findById(2); // System.out.println(ac); Assert.assertEquals("李四",ac.getName()); } @Test public void testFindAll(){ List<Account> list = accountService.findAll(); Assert.assertEquals(7,list.size()); } }
2023年08月25日
16 阅读
0 评论
0 点赞
1
2