通用Mapper都可以极大的方便开发人员。可以随意的按照自己的需要选择通用方法,还可以很方便的开发自己的通用方法。极其方便的使用MyBatis单表的增删改查。
那么已经有了MyBatis Generator可以生成SQL语句,为什么还需要通用Mapper?
使用MyBatis Generator生成器生成的Entity实体类和Mapper接口及Mapper XML文件是一一对应的,SQL语句也是根据实体类的属性生成的。随着需求的变化,可能需要对某些Entity实体类增加或者删除一些属性,那么实体类对应的Mapper XML也就需要进行手动修改,这就会导致一系列的错误
而使用通用Mapper就避免了实体类属性变化的时候同时需要手动修改Mapper XML文件,通用Mapper会自动根据实体类的属性生成响应的SQL,不需要再生成Mapper XML就可以实现基本的增删改查以及查询
一、搭建框架 - Mybatis整合Spring
在数据库创建两张表分别是porsche和t_teacher
SET NAMES utf8mb4; SET FOREIGN_KEY_CHECKS = 0; -- ---------------------------- -- Table structure for porsche -- ---------------------------- DROP TABLE IF EXISTS `porsche`; CREATE TABLE `porsche` ( `por_id` int(11) NOT NULL AUTO_INCREMENT, `por_name` char(100) CHARACTER SET gb2312 COLLATE gb2312_chinese_ci DEFAULT NULL, `por_price` double DEFAULT NULL, `por_stock` int(11) DEFAULT NULL, PRIMARY KEY (`por_id`) USING BTREE ) ENGINE=InnoDB AUTO_INCREMENT=13 DEFAULT CHARSET=gb2312; -- ---------------------------- -- Records of porsche -- ---------------------------- BEGIN; INSERT INTO `porsche` VALUES (1, 'Panamera', 970000, 90); INSERT INTO `porsche` VALUES (2, 'Cayenne', 910000, 100); INSERT INTO `porsche` VALUES (3, 'Macan', 550000, 80); INSERT INTO `porsche` VALUES (4, 'Taycay 2022', 880000, 50); INSERT INTO `porsche` VALUES (5, 'Porsche 911', 1270000, 40); INSERT INTO `porsche` VALUES (6, 'Porsche 718', 540000, 70); INSERT INTO `porsche` VALUES (7, '918 Spyder', 13380000, 10); INSERT INTO `porsche` VALUES (8, 'Cayman', 720000, 30); INSERT INTO `porsche` VALUES (9, 'Boxster', 670000, 110); INSERT INTO `porsche` VALUES (10, 'Carrera GT', 6450000, 20); INSERT INTO `porsche` VALUES (11, 'Taycan Tubo S', 880000, 140); INSERT INTO `porsche` VALUES (12, 'Taycan 2023', 880000, 120); COMMIT; DROP TABLE IF EXISTS `t_teacher`; CREATE TABLE `t_teacher` ( `id` int(11) NOT NULL AUTO_INCREMENT, `teacher_name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL, `class_name` varchar(255) DEFAULT NULL, `address` varchar(255) DEFAULT NULL, `birth_date` date DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=58 DEFAULT CHARSET=utf8; -- ---------------------------- -- Records of t_teacher -- ---------------------------- BEGIN; INSERT INTO `t_teacher` VALUES (1, 'stark', '三年二班', '浦东', '2022-02-13'); INSERT INTO `t_teacher` VALUES (2, 'steve', '三年三班', '静安', '2022-02-12'); INSERT INTO `t_teacher` VALUES (3, 'clint', '三年四班', '黄埔', '2022-02-11'); INSERT INTO `t_teacher` VALUES (4, 'banner', '三年二班', '静安', '2022-02-16'); INSERT INTO `t_teacher` VALUES (5, 'thor', '三年四班', '浦东', '2022-02-16'); INSERT INTO `t_teacher` VALUES (6, 'strange', '三年三班', '黄埔', '2022-02-16'); SET FOREIGN_KEY_CHECKS = 1; 复制代码
新建一个maven项目common-mapper,在pom.xml中添加Spring和MyBatis以及数据库驱动的相关依赖
<properties> <spring-version>5.3.13</spring-version> </properties> <dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-beans</artifactId> <version>${spring-version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>${spring-version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-test</artifactId> <version>${spring-version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-aop</artifactId> <version>${spring-version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-aspects</artifactId> <version>${spring-version}</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>test</scope> </dependency> <dependency> <groupId>commons-logging</groupId> <artifactId>commons-logging</artifactId> <version>1.2</version> </dependency> <!--spring jdbc依赖--> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>${spring-version}</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.16</version> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.1.14</version> </dependency> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.5.7</version> </dependency> <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> <version>1.2.3</version> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.16.18</version> <scope>provided</scope> </dependency> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis-spring</artifactId> <version>2.0.7</version> </dependency> </dependencies> 复制代码
在resources目录下新建Spring配置文件application.xml,并整合MyBatis
<?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:util="http://www.springframework.org/schema/util" xmlns:p="http://www.springframework.org/schema/p" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.3.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd http://www.alibaba.com/schema/stat http://www.alibaba.com/schema/stat.xsd http://www.springframework.org/schema/tool http://www.springframework.org/schema/tool/spring-tool.xsd"> <!--包扫描配置--> <context:component-scan base-package="com.citi"> </context:component-scan> <!--引用外部配置文件--> <context:property-placeholder location="classpath:db.properties"></context:property-placeholder> <!--数据库连接池配置--> <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}"/> <property name="initialSize" value="${jdbc_initialSize}"/> <property name="maxActive" value="${jdbc_maxActive}"/> </bean> <bean id="sqlSessionFactoryBean" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="configLocation" value="classpath:mybatis-config.xml"></property> <property name="dataSource" ref="dataSource"></property> <property name="mapperLocations" value="classpath:mappers/*.xml"></property> </bean> <!--Dao层接口加入到Spring容器--> <bean id="mapperScannerConfigurer" class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <!--指定接口所在的包--> <property name="basePackage" value="com.citi.mapper"></property> </bean> <!--事务管理器配置--> <bean id="dataSourceTransactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource"></property> </bean> <!--开启基于注解的配置模式--> <tx:annotation-driven transaction-manager="dataSourceTransactionManager" /> </beans> 复制代码
在resource目录下新建MyBatis配置文件mybatis-config.xml,只需要settings标签即可。
<?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> <settings> <setting name="mapUnderscoreToCamelCase" value="true"/> </settings> </configuration> 复制代码
在resources目录下创建数据库连接信息配置文件db.properties
jdbc_driver=com.mysql.cj.jdbc.Driver jdbc_url=jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf8&autoReconnect=true&useSSL=false&serverTimezone=Asia/Shanghai jdbc_username=root jdbc_password=root jdbc_initialSize=10 jdbc_maxActive=20 复制代码
resources目录下创建日志配置,用于在控制台打印出执行的SQL
<?xml version="1.0" encoding="UTF-8"?> <configuration> <appender name="console" class="ch.qos.logback.core.ConsoleAppender"> <encoder> <pattern>[%thread] %d{HH:mm:ss.SSS} %-5level %logger{36} - %msg%n</pattern> </encoder> </appender> <root level="debug"> <appender-ref ref="console"/> </root> </configuration> 复制代码
新建entity包,增加实体类Porsche和Teacher
@Data public class Porsche { private Integer porId; private String porName; private Double porPrice; private Integer porStock; } 复制代码
@Data public class Teacher { private Integer id; private String name; // 执教的年级 private String grade; private String address; private Date birthDate; } 复制代码
新增mapper包,增加PorscheMapper接口和TeacherMapper接口
public interface PorscheMapper { Porsche getPorscheById(); } 复制代码
public interface TeacherMapper { } 复制代码
在resources目录下创建mappers文件夹,新增PorscheMapper.xml
<?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.citi.mapper.PorscheMapper"> <select id="getPorscheById" resultType="com.citi.entity.Porsche"> select * from porsche where por_id = #{id} </select> </mapper>