【Mybatis】SP01 通用Mapper 环境搭建
基本介绍
通用Mapper是Mybatis的插件之一,作用是自动生成CRUD的SQL语句
官方地址与介绍:
https://gitee.com/free
https://gitee.com/free/Mapper/wikis/1.1-java?parent=1.integration
前置技术依赖:
Spring
Mybatis
案例准备
创建数据库:
CREATE DATABASE common_mapper CREATE TABLE `tabple_emp` ( `emp_id` int NOT NULL AUTO_INCREMENT , `emp_name` varchar(500) NULL , `emp_salary` double(15,5) NULL , `emp_age` int NULL , PRIMARY KEY (`emp_id`) ); INSERT INTO `tabple_emp` (`emp_name`, `emp_salary`, `emp_age`) VALUES ('tom', '1254.37', '27'); INSERT INTO `tabple_emp` (`emp_name`, `emp_salary`, `emp_age`) VALUES ('jerry', '6635.42', '38'); INSERT INTO `tabple_emp` (`emp_name`, `emp_salary`, `emp_age`) VALUES ('bob', '5560.11', '40'); INSERT INTO `tabple_emp` (`emp_name`, `emp_salary`, `emp_age`) VALUES ('kate', '2209.11', '22'); INSERT INTO `tabple_emp` (`emp_name`, `emp_salary`, `emp_age`) VALUES ('justin', '4203.15', '30');
创建Maven工程:
POM坐标:
<dependencies> <!-- Jdbc --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.20</version> </dependency> <!-- DataSource --> <dependency> <groupId>com.zaxxer</groupId> <artifactId>HikariCP</artifactId> <version>3.4.5</version> </dependency> <!-- Test --> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.13</version> <scope>test</scope> </dependency> <!-- log --> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.17</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> <version>1.7.30</version> </dependency> <!-- tools --> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.12</version> </dependency> <!-- mybatis-common mapper --> <dependency> <groupId>tk.mybatis</groupId> <artifactId>mapper</artifactId> <version>4.0.0-beta3</version> </dependency> <!-- Mybatis --> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.5.5</version> </dependency> <!-- mybatis + spring BridgePack --> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis-spring</artifactId> <version>2.0.4</version> </dependency> <!-- Spring --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-test</artifactId> <version>5.2.8.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-orm</artifactId> <version>5.2.8.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>5.2.8.RELEASE</version> </dependency> <dependency> <groupId>cglib</groupId> <artifactId>cglib</artifactId> <version>2.2</version> </dependency> <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjweaver</artifactId> <version>1.9.5</version> </dependency> </dependencies>
创建实体类:
package cn.dzz.entity; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; import java.io.Serializable; /** * @author DaiZhiZhou * @file Common-Mapper * @create 2020-08-27 9:54 */ @Data @AllArgsConstructor @NoArgsConstructor public class Employee implements Serializable { private static final long serialVersionUID = 5868379669175721936L; private Integer emp_id; private String emp_name; private Double emp_salary; private Integer emp_age; }
配置连接信息:
db.properties
jdbc.driverClassName=com.mysql.cj.jdbc.Driver jdbc.url=jdbc:mysql://127.0.0.1:3306/common_mapper?serverTimezone=GMT jdbc.username=root jdbc.password=123456
日志打印
# Global logging configuration log4j.rootLogger=DEBUG, stdout # MyBatis logging configuration... log4j.logger.org.mybatis.example.BlogMapper=TRACE # Console output... log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.layout=org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n
Mybatis-Config.xml
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration> </configuration>
SpringXML容器配置:
<?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" xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:p="http://www.springframework.org/schema/p" xmlns:c="http://www.springframework.org/schema/c" xmlns:tx="http://www.springframework.org/schema/tx" 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 http://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd" > <context:property-placeholder location="classpath:db.properties"/> <bean id="dataSource" class="com.zaxxer.hikari.HikariDataSource" destroy-method="close"> <property name="driverClassName" value="${jdbc.driverClassName}"/> <property name="jdbcUrl" value="${jdbc.url}" /> <property name="username" value="${jdbc.username}"/> <property name="password" value="${jdbc.password}"/> </bean> <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="configLocation" value="classpath:mybatis/MybatisConfiguration.xml"/> <property name="dataSource" ref="dataSource" /> </bean> <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <property name="basePackage" value="cn.dzz.mapper"/> </bean> <!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - --> <context:component-scan base-package="cn.dzz.service" /> <bean id="TxManger" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource" /> </bean> <aop:config> <aop:advisor advice-ref="txAdvice" pointcut="execution(* *..*Service.*(..))"/> </aop:config> <tx:advice id="txAdvice" transaction-manager="TxManger"> <tx:attributes> <tx:method name="query*" read-only="true"/> <tx:method name="insert*" rollback-for="java.lang.Exception" propagation="REQUIRES_NEW"/> <tx:method name="delete*" rollback-for="java.lang.Exception" propagation="REQUIRES_NEW"/> <tx:method name="update*" rollback-for="java.lang.Exception" propagation="REQUIRES_NEW"/> </tx:attributes> </tx:advice> </beans>
测试数据源访问:
package cn.dzz.test; import lombok.extern.slf4j.Slf4j; 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 javax.sql.DataSource; import java.sql.Connection; /** * @author DaiZhiZhou * @file Common-Mapper * @create 2020-08-27 10:22 */ @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations = "classpath:Spring-Mybatis.xml") @Slf4j public class CommonMapperTest { @Autowired private DataSource dataSource; @Test public void connectionTest() throws Exception{ Connection connection = dataSource.getConnection(); log.info(connection.toString()); connection.close(); } }
日志打印结果:
INFO [main] - HikariPool-1 - Starting... DEBUG [main] - HikariPool-1 - Added connection com.mysql.cj.jdbc.ConnectionImpl@14dda234 INFO [main] - HikariPool-1 - Start completed. INFO [main] - HikariProxyConnection@1218519094 wrapping com.mysql.cj.jdbc.ConnectionImpl@14dda234
整合Common-Mapper操作:
替换MapperScanConfigurer的Bean配置
<bean class="tk.mybatis.spring.mapper.MapperScannerConfigurer"> <property name="basePackage" value="cn.dzz.mapper"/> </bean>
编写EmployeeMapper接口:
package cn.dzz.mapper; import cn.dzz.entity.Employee; import tk.mybatis.mapper.common.Mapper; /** * 具体操作数据库Mapper接口,需要继承核心的通用的接口 * 同时注入泛型的类型,类型即这个Mapper接口的实体类类型 * @author DaiZhiZhou * @file Common-Mapper * @create 2020-08-27 10:30 */ public interface EmployeeMapper extends Mapper<Employee> { }
查看这个通用Mapper的信息:
@RegisterMapper public interface Mapper<T> extends BaseMapper<T>, ExampleMapper<T>, RowBoundsMapper<T>, Marker { }
其中Mapper接口又继承了BaseMapper & ExampleMapper & RowBoundsMapper & Mark
基础、样例、行界、标记
@RegisterMapper public interface BaseMapper<T> extends BaseSelectMapper<T>, BaseInsertMapper<T>, BaseUpdateMapper<T>, BaseDeleteMapper<T> { }
基础Mapper接口又继承了基础的CRUDMapper。。。
到最后的具体的Maper则是提供了一个接口方法:
@RegisterMapper public interface SelectOneMapper<T> { @SelectProvider( type = BaseSelectProvider.class, method = "dynamicSQL" ) T selectOne(T var1); }
也就是通用Mapper的Mapper接口提供了单表的所有尽可能的CRUD接口方法
我们的自定义Mapper接口 继承Mapper接口之后规定实体泛型的类型,
然后就具备了这些方法,不需要我们自己手写了