目录
一:基本概念撰述
1. SqlSessionFactory对象,只有创建了SqlSessionFactory对象,才能调用openSession()方法得到SqlSession对象。
2. dao接口的代理对象,例如StudentDao接口,需要的代理对象为:SqlSeesion.getMapper(StudentDao.class)。
3. 数据源DataSource对象,使用一个更强大、功能更多的连接池对象代替mybatis自己的PooledDataSource。
二:将Mybatis与Spring集成的相关操作步骤
1:对pom.xml文件添加相关依赖
2:创建xml文件
3.通过插件自动生成代码
4.使用注解式开发开发方式完成开发
@Repository:将Mapper类扫描后注入到Spring上下文(IOC)中定义成bean对象,通常作用在Mapper层
@Service:将实现类扫描后注入到Spring上下文(IOC)中定义成bean对象,通常作用在service的实现类上(非接口)
@Controller:将Controller类扫描后注入到Spring上下文(IOC)中定义成bean对象,通常作用在控制层,将在Spring MVC中使用
@Component:是一个泛化的概念,仅仅表示spring中的一个组件(Bean),可以作用在任何层次
@Scope:模式声明(singleton单模|prototype多模)
@Autowired:将自动在代码上下文与其匹配(默认是类型匹配)的Bean,并自动注入到相应的地方
@Resource:
@Resource后面没有任何内容,默认通过name属性去匹配bean,找不到再按type去匹配
指定了name或者type则根据指定的类型去匹配bean
指定了name和type则根据指定的name和type去匹配bean,任何一个不匹配都将报错
@Transactional:在方法调用之前开启事务,在方法调用之后提交事务或者回滚事务,可以添加定任意地方
5.Spring Test+Junit完美组合
6. 使用AOP编程完成分页
一:基本概念撰述
将 MyBatis 与 Spring 进行整合,主要解决的问题就是将SqlSessionFactory 对象交由 Spring 来管理。所以,该整合,只需要将SqlSessionFactory 的对象生成器 SqlSessionFactoryBean 注册在 Spring 容器中,再将其注入给 Dao 的实现类即可完成整合。
实现 Spring 与 MyBatis 的整合常用的方式:扫描的 Mapper 动态代理Spring 像插线板一样,mybatis 框架是插头,可以容易的组合到一起。插线板 spring 插上 mybatis,两个框架就是一个整体。
使用mybatis,需要创建mybatis框架中的某些对象,使用这些对象,就可以使用mybatis提供的功能了。
对于mybatis执行sql语句,需要用到的对象有:
1. SqlSessionFactory对象,只有创建了SqlSessionFactory对象,才能调用openSession()方法得到SqlSession对象。
2. dao接口的代理对象,例如StudentDao接口,需要的代理对象为:SqlSeesion.getMapper(StudentDao.class)。
3. 数据源DataSource对象,使用一个更强大、功能更多的连接池对象代替mybatis自己的PooledDataSource。
二:将Mybatis与Spring集成的相关操作步骤
1:对pom.xml文件添加相关依赖
在Mybatis与Spring集成中所需要添加依赖如下:
①:添加spring相关依赖(5.0.2.RELEASE)
- spring-core
- spring-beans
- spring-context
- spring-orm
- spring-tx
- spring-aspects
- spring-web
//Spring版本
<spring.version>5.0.2.RELEASE</spring.version>
<!--1)spring核心依赖-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${spring.version}</version>
</dependency>
<!--spring ioc依赖 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>${spring.version}</version>
</dependency>
<!--spring 扩展依赖 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<!--2)spring dao层依赖-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-orm</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>${spring.version}</version>
</dependency>
<!--3)aop相关依赖 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
<version>${spring.version}</version>
</dependency>
<!--4)spring web相关依赖 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>${spring.version}</version>
</dependency>
<!--5) spring test相关依赖 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>${spring.version}</version>
</dependency>
注意:spring 5.0.1.RELEASE有冲突
②: 添加mybatis相关依赖
- mybatis核心:mybatis(3.4.5)
- Mybatis分页:pagehelper(5.1.2)
<!--mybatis-->
<mybatis.version>3.4.5</mybatis.version>
<!--pagehelper-->
<pagehelper.version>5.1.2</pagehelper.version>
<!--mybatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>${mybatis.version}</version>
</dependency>
<!--pagehelper-->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>${pagehelper.version}</version>
</dependency>
③:spring整合mybatis(1.3.1)
<!--mybatis与spring的集成依赖-->
<mybatis.spring.version>1.3.1</mybatis.spring.version>
<!--mybatis与spring的集成依赖-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>${mybatis.spring.version}</version>
</dependency>
④:添加dbcp2连接池
- commons-dbcp2(2.1.1)
- commons-pool2(2.4.3)
<!--dbcp2连接池-->
<commons.dbcp2.version>2.1.1</commons.dbcp2.version>
<commons.pool2.version>2.4.3</commons.pool2.version>
<!--dbcp2连接池-->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-dbcp2</artifactId>
<version>${commons.dbcp2.version}</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
<version>${commons.pool2.version}</version>
</dependency>
⑤:添加日志配置(2.9.1)
- log4j-core
- log4j-api
- log4j-web
<!--log4j2-->
<log4j2.version>2.9.1</log4j2.version>
<!--核心log4j2jar包-->
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>${log4j2.version}</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>${log4j2.version}</version>
</dependency>
⑥: 其他
- junit(4.12)
- javax.servlet-api(4.0.0)
<!--junit+servlet-->
<junit.version>4.13</junit.version>
<servlet.version>4.0.1</servlet.version>
<!--junit+servlet-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>${junit.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>${servlet.version}</version>
</dependency>
完整版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.tangyuan</groupId>
<artifactId>ssm</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>war</packaging>
<name>ssm Maven Webapp</name>
<!-- FIXME change it to the project's website -->
<url>http://www.example.com</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<!--junit+servlet-->
<junit.version>4.13</junit.version>
<servlet.version>4.0.1</servlet.version>
<!--spring-->
<spring.version>5.0.2.RELEASE</spring.version>
<!--mybatis-->
<mybatis.version>3.4.5</mybatis.version>
<!--mybatis与spring的集成依赖-->
<mybatis.spring.version>1.3.1</mybatis.spring.version>
<!--mysql-->
<mysql.version>5.1.44</mysql.version>
<!--dbcp2连接池-->
<commons.dbcp2.version>2.1.1</commons.dbcp2.version>
<commons.pool2.version>2.4.3</commons.pool2.version>
<!--log4j2-->
<log4j2.version>2.9.1</log4j2.version>
<!--lombok-->
<lombok.version>1.18.12</lombok.version>
<!--pagehelper-->
<pagehelper.version>5.1.2</pagehelper.version>
</properties>
<dependencies>
<!--junit+servlet-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>${junit.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>${servlet.version}</version>
</dependency>
<!--1)spring核心依赖-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${spring.version}</version>
</dependency>
<!--spring ioc依赖 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>${spring.version}</version>
</dependency>
<!--spring 扩展依赖 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<!--2)spring dao层依赖-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-orm</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>${spring.version}</version>
</dependency>
<!--3)aop相关依赖 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
<version>${spring.version}</version>
</dependency>
<!--4)spring web相关依赖 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>${spring.version}</version>
</dependency>
<!--5) spring test相关依赖 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>${spring.version}</version>
</dependency>
<!--mysql-->
<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>${mysql.version}</version>
</dependency>
<!--mybatis -->
<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>${mybatis.version}</version>
</dependency>
<!--pagehelper-->
<!-- https://mvnrepository.com/artifact/com.github.pagehelper/pagehelper -->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>${pagehelper.version}</version>
</dependency>
<!--mybatis与spring的集成依赖-->
<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis-spring -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>${mybatis.spring.version}</version>
</dependency>
<!--dbcp2连接池-->
<!-- https://mvnrepository.com/artifact/org.apache.commons/commons-dbcp2 -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-dbcp2</artifactId>
<version>${commons.dbcp2.version}</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.commons/commons-pool2 -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
<version>${commons.pool2.version}</version>
</dependency>
<!--核心log4j2jar包-->
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>${log4j2.version}</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>${log4j2.version}</version>
</dependency>
<!--web工程需要包含log4j-web,非web工程不需要-->
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-web</artifactId>
<version>${log4j2.version}</version>
</dependency>
<!--lombok-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${lombok.version}</version>
<scope>provided</scope>
</dependency>
</dependencies>
<build>
<finalName>ssm</finalName>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.7.0</version>
<configuration>
<source>${maven.compiler.source}</source>
<target>${maven.compiler.target}</target>
<encoding>${project.build.sourceEncoding}</encoding>
</configuration>
</plugin>
<plugin>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-maven-plugin</artifactId>
<version>1.3.2</version>
<dependencies>
<!--使用Mybatis-generator插件不能使用太高版本的mysql驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>${mysql.version}</version>
</dependency>
</dependencies>
<configuration>
<overwrite>true</overwrite>
</configuration>
</plugin>
</plugins>
</build>
</project>
2:创建xml文件
(1):spring.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"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<!--引入mybatis与spring的集成配置 -->
<import resource="spring-mybatis.xml"/>
</beans>
(2):spring-mybatis.xml(重点文件:mybatis与spring的集成配置)
①:开启注解式开发,并指定扫描包的位置
<!--注解式开发 -->
<!-- 注解驱动 -->
<context:annotation-config/>
<!-- 用注解方式注入bean,并指定查找范围:com.tangyuan及子子孙孙包-->
<context:component-scan base-package="com.tangyuan"/>
②:引入外部jdbc配置文件
<context:property-placeholder location="classpath:jdbc.properties"/>
③:配置dbcp2数据库连接池
<bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource"
destroy-method="close">
<property name="driverClassName" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
<!--初始连接数-->
<property name="initialSize" value="${jdbc.initialSize}"/>
<!--最大活动连接数-->
<property name="maxTotal" value="${jdbc.maxTotal}"/>
<!--最大空闲连接数-->
<property name="maxIdle" value="${jdbc.maxIdle}"/>
<!--最小空闲连接数-->
<property name="minIdle" value="${jdbc.minIdle}"/>
<!--设置为-1时,如果没有可用连接,连接池会一直无限期等待,直到获取到连接为止。-->
<!--如果设置为N(毫秒),则连接池会等待N毫秒,等待不到,则抛出异常-->
<property name="maxWaitMillis" value="${jdbc.maxWaitMillis}"/>
</bean>
④:实现spring和mybatis整合
<!--4. spring和MyBatis整合 -->
<!--1) 创建sqlSessionFactory-->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<!-- 指定数据源 -->
<property name="dataSource" ref="dataSource"/>
<!-- 自动扫描XxxMapping.xml文件,**任意路径 -->
<property name="mapperLocations" value="classpath*:com/tangyuan/**/mapper/*.xml"/>
<!-- 指定别名 -->
<property name="typeAliasesPackage" value="com/tangyuan/**/model"/>
<!--配置pagehelper插件-->
<property name="plugins">
<array>
<bean class="com.github.pagehelper.PageInterceptor">
<property name="properties">
<value>
helperDialect=mysql
</value>
</property>
</bean>
</array>
</property>
<!--配置mybatis相关参数-->
<property name="configuration">
<bean class="org.apache.ibatis.session.Configuration">
<!--开启驼峰命名-->
<!--若没有,则带有下划线的字段统统返回null值-->
<property name="mapUnderscoreToCamelCase" value="true"></property>
</bean>
</property>
</bean>
<!--2) 自动扫描com/tangyuan/**/mapper下的所有XxxMapper接口(其实就是DAO接口),并实现这些接口,-->
<!-- 即可直接在程序中使用dao接口,不用再获取sqlsession对象-->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<!--basePackage 属性是映射器接口文件的包路径。-->
<!--你可以使用分号或逗号 作为分隔符设置多于一个的包路径-->
<property name="basePackage" value="com/tangyuan/**/mapper"/>
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
</bean>
ps:第四步操作用来替代以前的MybatisSessionFactoryUtils文件,让代码更加简洁明了,如果对此文件感兴趣的,可以参考以下博客:
Mybatis 快速入门第一节 入门基础_靖康之耻的博客-CSDN博客MVC全名是ModelViewCotroller,是模型(model)——视图(view)——控制器(controller)的缩写,是一种软件设计典范,用一种业务逻辑、数据、界面显示分离的方法组织代码自定义MVCSSMaction(中转站-----servlet类)controller(控制层)biz(业务逻辑处理层)servicedao(数据访问层)mapperIXxxDAO.java(接口)XxxMapper.java(接口)XxxDAOImpl.java(实现类)...https://blog.csdn.net/qq_61313896/article/details/125969558
⑤:开启注解式事物配置
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>
<!--tx 环绕通知-->
<tx:annotation-driven transaction-manager="transactionManager" />
ps:第五步操作用来替代以前的junit4单元测试的操作代码,让测试更加便捷,如果有感兴趣的,可以参考以前的博客:
Mybatis 快速入门第一节 入门基础_靖康之耻的博客-CSDN博客MVC全名是ModelViewCotroller,是模型(model)——视图(view)——控制器(controller)的缩写,是一种软件设计典范,用一种业务逻辑、数据、界面显示分离的方法组织代码自定义MVCSSMaction(中转站-----servlet类)controller(控制层)biz(业务逻辑处理层)servicedao(数据访问层)mapperIXxxDAO.java(接口)XxxMapper.java(接口)XxxDAOImpl.java(实现类)...https://blog.csdn.net/qq_61313896/article/details/125969558 将dbcp2数据库连接池通过ref方式注入到事物管理器中,只要拿到数据源,就能进行事务开启
⑥:开启动态代理
<aop:aspectj-autoproxy/>
外部jdbc配置文件如下:
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/db_shopping?useUnicode=true&characterEncoding=UTF-8&useSSL=false
jdbc.username=root
jdbc.password=1234
jdbc.initialSize=10
jdbc.maxTotal=100
jdbc.maxIdle=50
jdbc.minIdle=10
jdbc.maxWaitMillis=-1
我的spring-mybatis.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:tx="http://www.springframework.org/schema/tx"
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/tx http://www.springframework.org/schema/tx/spring-tx.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd">
<!--1.开启注解式开发,并指定扫描包的位置 -->
<!--注解式开发 -->
<!-- 注解驱动 -->
<context:annotation-config/>
<!-- 用注解方式注入bean,并指定查找范围:com.tangyuan及子子孙孙包-->
<context:component-scan base-package="com.tangyuan"/>
<!--2.引入外部jdbc配置文件-->
<context:property-placeholder location="classpath:jdbc.properties"/>
<!--3.配置dbcp2数据库连接池-->
<bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource"
destroy-method="close">
<property name="driverClassName" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
<!--初始连接数-->
<property name="initialSize" value="${jdbc.initialSize}"/>
<!--最大活动连接数-->
<property name="maxTotal" value="${jdbc.maxTotal}"/>
<!--最大空闲连接数-->
<property name="maxIdle" value="${jdbc.maxIdle}"/>
<!--最小空闲连接数-->
<property name="minIdle" value="${jdbc.minIdle}"/>
<!--设置为-1时,如果没有可用连接,连接池会一直无限期等待,直到获取到连接为止。-->
<!--如果设置为N(毫秒),则连接池会等待N毫秒,等待不到,则抛出异常-->
<property name="maxWaitMillis" value="${jdbc.maxWaitMillis}"/>
</bean>
<!--4.实现spring和mybatis整合 -->
<!--4. spring和MyBatis整合 -->
<!--1) 创建sqlSessionFactory-->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<!-- 指定数据源 -->
<property name="dataSource" ref="dataSource"/>
<!-- 自动扫描XxxMapping.xml文件,**任意路径 -->
<property name="mapperLocations" value="classpath*:com/tangyuan/**/mapper/*.xml"/>
<!-- 指定别名 -->
<property name="typeAliasesPackage" value="com/tangyuan/**/model"/>
<!--配置pagehelper插件-->
<property name="plugins">
<array>
<bean class="com.github.pagehelper.PageInterceptor">
<property name="properties">
<value>
helperDialect=mysql
</value>
</property>
</bean>
</array>
</property>
<!--配置mybatis相关参数-->
<property name="configuration">
<bean class="org.apache.ibatis.session.Configuration">
<!--开启驼峰命名-->
<!--若没有,则带有下划线的字段统统返回null值-->
<property name="mapUnderscoreToCamelCase" value="true"></property>
</bean>
</property>
</bean>
<!--2) 自动扫描com/tangyuan/**/mapper下的所有XxxMapper接口(其实就是DAO接口),并实现这些接口,-->
<!-- 即可直接在程序中使用dao接口,不用再获取sqlsession对象-->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<!--basePackage 属性是映射器接口文件的包路径。-->
<!--你可以使用分号或逗号 作为分隔符设置多于一个的包路径-->
<property name="basePackage" value="com/tangyuan/**/mapper"/>
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
</bean>
<!--5.开启注解式事物配置-->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>
<!--tx 环绕通知-->
<tx:annotation-driven transaction-manager="transactionManager" />
<!--6.开启动态代理-->
<aop:aspectj-autoproxy/>
</beans>
3.通过插件自动生成代码
插件的配置请参考以前的博客:
Mybatis 快速入门第一节 入门基础_靖康之耻的博客-CSDN博客MVC全名是ModelViewCotroller,是模型(model)——视图(view)——控制器(controller)的缩写,是一种软件设计典范,用一种业务逻辑、数据、界面显示分离的方法组织代码自定义MVCSSMaction(中转站-----servlet类)controller(控制层)biz(业务逻辑处理层)servicedao(数据访问层)mapperIXxxDAO.java(接口)XxxMapper.java(接口)XxxDAOImpl.java(实现类)...https://blog.csdn.net/qq_61313896/article/details/125969558
generatorConfig.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE generatorConfiguration PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
"http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd" >
<generatorConfiguration>
<!-- 引入配置文件 -->
<properties resource="jdbc.properties"/>
<!--指定数据库jdbc驱动jar包的位置-->
<classPathEntry location="E:\repository\mvn-repository\mysql\mysql-connector-java\5.1.44"/>
<!-- 一个数据库一个context -->
<context id="infoGuardian">
<!-- 注释 -->
<commentGenerator>
<property name="suppressAllComments" value="true"/><!-- 是否取消注释 -->
<property name="suppressDate" value="true"/> <!-- 是否生成注释代时间戳 -->
</commentGenerator>
<!-- jdbc连接 -->
<jdbcConnection driverClass="${jdbc.driver}"
connectionURL="${jdbc.url}" userId="${jdbc.username}" password="${jdbc.password}"/>
<!-- 类型转换 -->
<javaTypeResolver>
<!-- 是否使用bigDecimal, false可自动转化以下类型(Long, Integer, Short, etc.) -->
<property name="forceBigDecimals" value="false"/>
</javaTypeResolver>
<!-- 01 指定javaBean生成的位置 -->
<!-- targetPackage:指定生成的model生成所在的包名 -->
<!-- targetProject:指定在该项目下所在的路径 -->
<javaModelGenerator targetPackage="com.tangyuan.model"
targetProject="src/main/java">
<!-- 是否允许子包,即targetPackage.schemaName.tableName -->
<property name="enableSubPackages" value="false"/>
<!-- 是否对model添加构造函数 -->
<property name="constructorBased" value="true"/>
<!-- 是否针对string类型的字段在set的时候进行trim调用 -->
<property name="trimStrings" value="false"/>
<!-- 建立的Model对象是否 不可改变 即生成的Model对象不会有 setter方法,只有构造方法 -->
<property name="immutable" value="false"/>
</javaModelGenerator>
<!-- 02 指定sql映射文件生成的位置 -->
<sqlMapGenerator targetPackage="com.tangyuan.mapper"
targetProject="src/main/resources">
<!-- 是否允许子包,即targetPackage.schemaName.tableName -->
<property name="enableSubPackages" value="false"/>
</sqlMapGenerator>
<!-- 03 生成XxxMapper接口 -->
<!-- type="ANNOTATEDMAPPER",生成Java Model 和基于注解的Mapper对象 -->
<!-- type="MIXEDMAPPER",生成基于注解的Java Model 和相应的Mapper对象 -->
<!-- type="XMLMAPPER",生成SQLMap XML文件和独立的Mapper接口 -->
<javaClientGenerator targetPackage="com.tangyuan.mapper"
targetProject="src/main/java" type="XMLMAPPER">
<!-- 是否在当前路径下新加一层schema,false路径com.oop.eksp.user.model, true:com.oop.eksp.user.model.[schemaName] -->
<property name="enableSubPackages" value="false"/>
</javaClientGenerator>
<!-- 配置表信息 -->
<!-- schema即为数据库名 -->
<!-- tableName为对应的数据库表 -->
<!-- domainObjectName是要生成的实体类 -->
<!-- enable*ByExample是否生成 example类 -->
<!--<table schema="" tableName="t_book" domainObjectName="Book"-->
<!--enableCountByExample="false" enableDeleteByExample="false"-->
<!--enableSelectByExample="false" enableUpdateByExample="false">-->
<!--<!– 忽略列,不生成bean 字段 –>-->
<!--<!– <ignoreColumn column="FRED" /> –>-->
<!--<!– 指定列的java数据类型 –>-->
<!--<!– <columnOverride column="LONG_VARCHAR_FIELD" jdbcType="VARCHAR" /> –>-->
<!--</table>-->
<!-- <table schema="" tableName="t_customer" domainObjectName="Customer"
enableCountByExample="false" enableDeleteByExample="false"
enableSelectByExample="false" enableUpdateByExample="false">
<!– 忽略列,不生成bean 字段 –>
<!– <ignoreColumn column="FRED" /> –>
<!– 指定列的java数据类型 –>
<!– <columnOverride column="LONG_VARCHAR_FIELD" jdbcType="VARCHAR" /> –>
</table>
<table schema="" tableName="t_order" domainObjectName="Order"
enableCountByExample="false" enableDeleteByExample="false"
enableSelectByExample="false" enableUpdateByExample="false">
<!– 忽略列,不生成bean 字段 –>
<!– <ignoreColumn column="FRED" /> –>
<!– 指定列的java数据类型 –>
<!– <columnOverride column="LONG_VARCHAR_FIELD" jdbcType="VARCHAR" /> –>
</table>-->
<!-- <table schema="" tableName="t_news" domainObjectName="News"
enableCountByExample="false" enableDeleteByExample="false"
enableSelectByExample="false" enableUpdateByExample="false">
<!– 忽略列,不生成bean 字段 –>
<!– <ignoreColumn column="FRED" /> –>
<!– 指定列的java数据类型 –>
<!– <columnOverride column="LONG_VARCHAR_FIELD" jdbcType="VARCHAR" /> –>
</table>
<table schema="" tableName="t_category" domainObjectName="Category"
enableCountByExample="false" enableDeleteByExample="false"
enableSelectByExample="false" enableUpdateByExample="false">
<!– 忽略列,不生成bean 字段 –>
<!– <ignoreColumn column="FRED" /> –>
<!– 指定列的java数据类型 –>
<!– <columnOverride column="LONG_VARCHAR_FIELD" jdbcType="VARCHAR" /> –>
</table>
<table schema="" tableName="t_news_category" domainObjectName="NewsCategory"
enableCountByExample="false" enableDeleteByExample="false"
enableSelectByExample="false" enableUpdateByExample="false">
<!– 忽略列,不生成bean 字段 –>
<!– <ignoreColumn column="FRED" /> –>
<!– 指定列的java数据类型 –>
<!– <columnOverride column="LONG_VARCHAR_FIELD" jdbcType="VARCHAR" /> –>
</table>-->
</context>
</generatorConfiguration>
4.使用注解式开发开发方式完成开发
问题:若要将mapper类注入到Spring IOC上下文容器中,方式有哪几种?
方式一:在spring-mybatis.xml文件中添加以下代码:(手动注入)
<bean id="bookMapper" class="com.tangyuan.mapper.BookMapper"></bean>
方式二:运用@Repository注解方式在mapper接口上定义:(自动注入)
因为在spring-mybatis.xm中开启了注解式开发,所以可以使用注解方式来开发
-
@Repository:将Mapper类扫描后注入到Spring上下文(IOC)中定义成bean对象,通常作用在Mapper层
package com.tangyuan.mapper;
import com.tangyuan.model.Book;
import org.springframework.stereotype.Repository;
import java.util.List;
//将BookMapper扫描后注入到Spring上下文(IOC)中定义成bean对象
//<bean id="" name="bookMapper"></bean>
@Repository
public interface BookMapper {
int deleteByPrimaryKey(Integer bid);
int insert(Book record);
int insertSelective(Book record);
Book selectByPrimaryKey(Integer bid);
int updateByPrimaryKeySelective(Book record);
int updateByPrimaryKey(Book record);
List<Book> queryBookPager(Book book);
}
-
@Service:将实现类扫描后注入到Spring上下文(IOC)中定义成bean对象,通常作用在service的实现类上(非接口)
package com.tangyuan.service.impl;
import com.tangyuan.service.IBookService;
import org.springframework.stereotype.Service;
/**
* @author 唐渊
* @create 2022-07-24 21:46
*/
@Service
// @Service:通常作用在业务层 与上面作用一样
// 将BookServiceImpl扫描后注入到Spring上下文(IOC)中定义成bean对象 作用于Service层的实现类上(非接口类)
public class BookServiceImpl implements IBookService {
}
-
@Controller:将Controller类扫描后注入到Spring上下文(IOC)中定义成bean对象,通常作用在控制层,将在Spring MVC中使用
package com.tangyuan.Controller;
import org.springframework.stereotype.Controller;
/**
* @author 唐渊
* @create 2022-07-27 15:31
*/
@Controller
public class IndexController {
}
-
@Component:是一个泛化的概念,仅仅表示spring中的一个组件(Bean),可以作用在任何层次
可以作用于任意一层中,将所指定的接口或类注入到Spring上下文(IOC)中定义成bean对象
温馨提示:可以将上面四个注解方式看做setter方法,定义方式后,将其扫描后注入到Spring上下文(IOC)中定义成bean对象
-
@Scope:模式声明(singleton单模|prototype多模)
-
@Autowired:将自动在代码上下文与其匹配(默认是类型匹配)的Bean,并自动注入到相应的地方
@Resource:
-
@Resource后面没有任何内容,默认通过name属性去匹配bean,找不到再按type去匹配
-
指定了name或者type则根据指定的类型去匹配bean
-
指定了name和type则根据指定的name和type去匹配bean,任何一个不匹配都将报错
温馨提示:可以将上面两个注解方式看做getter方法,定义方式后,将从Spring IOC上下文容器中获取指定的bean对象,相当于Spring中的DI(依赖注入)
package com.tangyuan.service.impl;
import com.tangyuan.mapper.BookMapper;
import com.tangyuan.service.IBookService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
/**
* @author 唐渊
* @create 2022-07-24 21:46
*/
@Service
// @Service:通常作用在业务层 与上面作用一样
// 将BookServiceImpl扫描后注入到Spring上下文(IOC)中定义成bean对象 作用于Service层的实现类上(非接口类)
public class BookServiceImpl implements IBookService {
//自动注入
//Spring中的DI(依赖注入)
//@Autowired 根据类型匹配
@Resource //@Resource后面没有任何内容,默认通过name属性去匹配bean,找不到再按type去匹配,如果找不到,就报错
private BookMapper bookMapper;
//手动注入
// public BookMapper getBookMapper() {
// return bookMapper;
// }
//
// public void setBookMapper(BookMapper bookMapper) {
// this.bookMapper = bookMapper;
// }
}
-
@Transactional:在方法调用之前开启事务,在方法调用之后提交事务或者回滚事务,可以添加定任意地方
@Transactional //在方法调用之前开启事务,在方法调用之后提交事务或者回滚事务
@Override
public int insert(Book record) {
//开启
return bookMapper.insert(record);
//提交或者回滚
}
5.Spring Test+Junit完美组合
①: 在工程的pom文件中增加spring-test的依赖
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>${spring.version}</version>
</dependency>
②:创建BaseTestCase,并在该类上加上两个注解
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations={"classpath:applicationContext.xml"})
package com.tangyuan.service.impl;
import org.junit.runner.RunWith;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
/**
* @author 唐渊
* @create 2022-07-27 11:32
*/
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"classpath:spring.xml"})
public class BaseTest {
}
6. 使用AOP编程完成分页
以前的分页代码封装繁琐,所以我们现在特地地使用AOP编程中的环绕通知来对以前的分页代码进行简化
若对以前的分页代码有兴趣的,可以参考以前的博客:
Mybatis 快速入门之 动态sql和分页_靖康之耻的博客-CSDN博客1)在BookMapper类定义方法(2)在BookMapper.xml文件中进行sql语句的编写/*有参构造方法*/(3)在iBookService类编写代码(4)实现接口所定义的方法@Override}(5)进行junit4单元测试@Test//查询返回结果集适合使用返回值是自定义实体类的情况适合使用返回值的数据类型是非自定义的,即jdk的提供的类型println);}测试结果如下查看sql语句//分页查询@Override}...https://blog.csdn.net/qq_61313896/article/details/125981873?spm=1001.2014.3001.5501
特意编写一个类,来存放用环绕通知修改的分页代码:
package com.tangyuan.aspect;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.tangyuan.util.PageBean;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.stereotype.Component;
import java.util.List;
/**
* @author 唐渊
* @create 2022-07-25 9:46
*/
@Component
@Aspect
public class PageAspect {
//环绕通知:前+后
//切入点:* *..*Service.*Pager(..) 代表多个连接点集合
//* 代表方法返回值不限
//*.. 代表包名不限
//*Service 代表以service结尾的类或者是接口
//*Pager 代表以Pager结尾的方法
// (..) 代表方法的参数不限
//适配器:通知+切入点
@Around(value = "execution(* *..*Service.*Pager(..))")
public Object invoke(ProceedingJoinPoint joinPoint) throws Throwable {
//获取目标的执行参数
Object[] params = joinPoint.getArgs();
//定义pagebean对象
PageBean pageBean = null;
//循环参数
for (Object param : params) {
//判断参数的类型是否是pagebean
if (param instanceof PageBean) {
pageBean = (PageBean) param;
break;
}
}
//判断是否分页
if (null != pageBean && pageBean.isPagination())
PageHelper.startPage(pageBean.getPage(), pageBean.getRows());
//执行目标方法
Object returnValue = joinPoint.proceed(params);
if (null != pageBean && pageBean.isPagination()){
if (returnValue instanceof List){
List list = (List) returnValue;
PageInfo pageInfo = new PageInfo(list);
pageBean.setTotal(pageInfo.getTotal()+"");
}
}
return returnValue;
}
}
方法测试:
@Test
public void queryBookPager(){
PageBean pageBean=new PageBean();
List<Book> books = bookService.queryBookPager(Book.builder().build(),pageBean);
System.out.println("总记录数:"+pageBean.getTotal());
books.forEach(System.out::println);
}
}
测试结果:
查看sql语句:
本人刚涉及此方面,博客可能有些地方不好,欢迎各位大佬前来一起讨论斧正