Java28:MYBATIS 一MyBatis简介简介MyBatis 是一款优秀的持久层框架它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作持久层框架比对JDBCsql 夹杂在java代码中耦合度高导致硬编码内伤维护不易且实际开发需求中sql有变化频繁修改的情况多见代码冗长开发效率低Hibernate操作便捷开发效率高程序中长复杂sql需要绕过框架内部自动生成的sql不容易做特殊处理基于全映射的全自动框架大量字段的Pojo 进行部分映射比较困难反射操作太多导致数据库性能下降MyBatis轻量级性能出色sql 和java编码分开功能边界清晰。java代码专注业务sql语句专注数据开发效率稍逊与Hibernate 但是完全能够接受开发效率HibernateMybatisJDBC运行效率JDBCMybatisHibernate二 Mybatis 入门案例步骤一.创建项目并配置依赖dependency groupIdorg.mybatis/groupId artifactIdmybatis/artifactId version3.5.11/version /dependency dependency groupIdmysql/groupId artifactIdmysql-connector-java/artifactId version8.0.25/version /dependency dependency groupIdorg.junit.jupiter/groupId artifactIdjunit-jupiter-api/artifactId version5.10.0/version /dependency步骤二准备数据库数据create table t_emp(emp_id int auto_increment,emp_name varchar(20),emp_salary double(10,5),primary key(emp_id));insert into t_emp (emp_name,emp_salary)values(zhangsan,2000.00),(students ,3000.00),(wanger,4000.00)select * from t_emp步骤三准备实体类和mapper接口实体类public class Employee { private int empId; private String empName; private double empSalary;}mapper接口package com.cn.mybatis.mapper; import com.cn.mybatis.pojo.Employee; public interface EmployeeMapper { //根据编号查询员工 Employee queryById(int id); //根据编号删除员工 int deleteById(int id); }步骤四创建Mapper.xml 配置文件编写对应sql?xml version1.0 encodingUTF-8 ? !DOCTYPE mapper PUBLIC -//mybatis.org//DTD Mapper 3.0//EN https://mybatis.org/dtd/mybatis-3-mapper.dtd !-- namespacemapper对应接口的全限定符-- mapper namespacecom.cn.mybatis.mapper.EmployeeMapper !-- 声明标签sql语句crud select insert update delete 每个标签对应接口的一个方法方法的一个实现 注意mapper接口不能重载因为mapper.xml 无法识别根据方法名识别 id对应接口方法名称resultType为方法返回值 -- select idqueryById resultTypecom.cn.mybatis.pojo.Employee select emp_id empId ,emp_name empName, emp_salary empSalary from t_emp where emp_id#{id} /select !-- id 为接口的方法名 resultType 为方法的返回值-- delete iddeleteById delete from t_emp where emp_id#{id} /delete /mapper步骤五编写mybatis 配置文件加载 数据库信息和mapper.xml 配置文件?xml version1.0 encodingUTF-8 ? !DOCTYPE configuration PUBLIC -//mybatis.org//DTD Config 3.0//EN http://mybatis.org/dtd/mybatis-3-config.dtd configurationenvironments defaultdevelopmentenvironment iddevelopment transactionManager typeJDBC/ dataSource typePOOLED property namedriver valuecom.mysql.cj.jdbc.Driver/ property nameurl valuejdbc:mysql://localhost:3306/studb?useUnicodetrueamp;characterEncodingutf-8amp;useSSLfalseamp;serverTimezone GMT/ property nameusername valueroot/ property namepassword valueroot/ /dataSource/environment /environments mappersmapper resourcemapper/EmployeeMapper.xml//mappers /configuration步骤六测试public class MybatisFirstTest { Test public void test1() throws IOException { //1.读取外部配置文件 InputStream resourceAsStream Resources.getResourceAsStream(mybatis-config.xml); //2.创建sqlSessionFactory SqlSessionFactory sqlSessionFactory new SqlSessionFactoryBuilder().build(resourceAsStream); //3.根据sqlSessionFactory 创建sqlSession每次业务创建一个用完就释放 SqlSession sqlSession sqlSessionFactory.openSession(); //4.获取接口的代理对象调用代理对象的方法就会查找mapper接口的方法 EmployeeMapper mapper sqlSession.getMapper(EmployeeMapper.class); Employee employee mapper.queryById(1); System.out.println(employee); //5.提交事务和关闭资源 sqlSession.commit(); sqlSession.close(); } }三单表查询功能mybatis 官网地址MyBatiy映射s 3 | Introduction – mybatis1.配置日志控制台打印settings !-- 配置控制台打印输出-- setting namelogImpl valueSTDOUT_LOGGING/ /settings2.取值符号$与#的区别#{key}占位符赋值 emp_id? ?赋值${key}字符串拼接 emp_id id推荐使用#{key}防止【注入攻击】的问题总结动态值使用#{key}动态的列名 容器名 关键字${key} 只能替代值的位置不能替代的容器名标签列名sql关键字3.类型传入mapper接口public interface EmployeeMapper { //根据编号查询员工 Employee queryById(int id); //根据编号删除员工 int deleteById(int id); //根据员工工资查询 ListEmployee queryBySalary(double salary); //插入员工数据 int insertEmp(Employee emp); //根据员工工资和姓名查询员工 ListEmployee queryBySalaryandName(Param(a)String name,Param(b) double salary); //插入员工数据传入key为name和salary int insertEmp2(Map data); }mapper.xml!-- 场景1.传入简单的类型key 随便写-- delete iddeleteById delete from t_emp where emp_id#{akldfjaskfd} /delete !-- 场景2.传入单个实体类key属性名即可-- insert idinsertEmp insert into t_emp (emp_name ,emp_salary)values (#{empName},#{empSalary}) /insert !-- 场景3.传入多个简单类型 key 不能取形参名 方法1注解指定Param注解 指定多个简单参数的keykeyParam(value值) 推荐 where emp_name#{a}and emp_salary#{b} 方法2mybatis默认机制形参从左到右默认 arg0 arg1 where emp_name#{arg0}and emp_salary#{arg1} -- select idqueryBySalaryandName resultTypecom.cn.mybatis.pojo.Employee select emp_id empId ,emp_name empName, emp_salary empSalary from t_emp where emp_name#{a}and emp_salary#{b} /select !-- 场景4.传入map集合keymap的key即可-- insert idinsertEmp2 insert into t_emp (emp_name ,emp_salary)values (#{name},#{salary}) /insert4.类型返回mapper接口public interface EmployeeMapper { //根据编号查询员工姓名 String queryNameById(int id); //根据编号查询员工工资 Double querySalaryById(int id); //返回单个自定义实体类 Employee queryEmployeeById(int id ); //查询部门最高工资姓名和平均工资 MapString ,Object selectEmpNameAndMaxSalary(); // 根据传入的工资查询员工 ListString queryNameBySalary(double salary); //查询全部员工 ListEmployee queryAllEmployee(); } mapper.xmlmapper namespacecom.cn.learn.pojo.EmployeeMapper !-- 场景1返回单个简单类型如何指定 resultType的写法 resultType 语法 1.类的全限定符号 2 别名简称 mybatis 给我们提供了72种默认的别名 这些都是我们常用的java数据类型 基本数据类型 int double - _int _double 包装数据类型 Integer Double - int integer double 集合容器类型 Map List HashMap -小写即可 map list hashmap 扩展如果没有提供的需要自定义或者写类的全限定符 给自己声明的类定义别名(在config文件设置) typeAliases typeAlias typecom.cn.learn.pojo.EmployeeMapper aliasemp/typeAlias /typeAliases 或者批量给包写所有的类设置别名默认类的首字母小写 typeAliases package namecom.cn.learn.pojo/ /typeAliases 扩展如果不想使用批量的别名可以使用注解给命名 Alias(hehe) -- select idqueryNameById resultTypeString select emp_id empId, emp_name empName emp_salary empSalary from t_emp where emp_id#{id} /select select idquerySalaryById resultTypedouble select emp_id empId, emp_name empName emp_salary empSalary from t_emp where emp_id#{id} /select !-- 场景2返回单个自定义类类型 resultType返回类的全限定符或者别名即可 默认要求 查询 返回单个实体类型要求列名和属性名要一致 这样才可以进行实体类的属性映射 但是可以进行设置设置支持驼峰式自动映射 emp_id -empId 开启驼峰式自动映射 数据库 a_colum java aColum setting namemapUnderscoreToCamelCase valuetrue/ -- select idqueryEmployeeById resultTypeemp select * from t_emp where emp_id#{id} /select !-- 场景3返回map 当没有实体类可以使用接值的时候 我们可以使用map接受数据 key 查询的列名 value 查询的值 直接写map即可- -- select idselectEmpNameAndMaxSalary resultTypemap select emp_name 员工姓名,emp_salary 员工工资 ,(select avg(salaly from t_emp) 部门平均工资 from t_emp where emp_salary(select max(salary)from _emp) /select !-- 场景4返回的是集合类型如何指定 返回值是集合resultType不需要指定集合类型只需要指定泛型即可 为什么 mybatis 底层调用时调用ibatis 查询单个的调用SelectOne 里面也是调用SelectList -- select idqueryNameBySalary resultTypestring Select emp_name from t_emp where emp_salary{saraly} /select select idqueryAllEmployee resultTypeemp select * from t_emp /select /mapper5.获取自动增长主键接口public interface EmployeeMapper {//插入员工信息 int insertEmp(Employee emp);}mapper.xml:!-- 场景5获取自增长主键 //插入员工 int insertEmp(Employee emp); useGeneratedKeystrue 我们想要数据库自动增加的主键值 keyColumnemp_id 主键值的列 keyPropertyempId 接收主键列值的属性 -- insert idinsertEmp useGeneratedKeystrue keyColumnemp_id keyPropertyempId insert into t_emp(emp_name,emp_salary)values(#{empName},#{empSalary}) /insert测试Test public void test() throws IOException { //1.读取外部配置文件 InputStream resourceAsStream Resources.getResourceAsStream(mybatis-config.xml); //2.创建sqlSessionFactory SqlSessionFactory sqlSessionFactory new SqlSessionFactoryBuilder().build(resourceAsStream); //3.根据sqlSessionFactory 创建sqlSession每次业务创建一个用完就释放 SqlSession sqlSession sqlSessionFactory.openSession(); //4.获取接口的代理对象调用代理对象的方法就会查找mapper接口的方法 EmployeeMapper mapper sqlSession.getMapper(EmployeeMapper.class); Employee employee new Employee(); employee.setEmpName(xiaoming); employee.setEmpSalary(2000); System.out.println(employee.getEmpId()); System.out.println(--------------); mapper.insertEmp(employee); System.out.println(employee.getEmpId()); sqlSession.commit(); sqlSession.close(); }6.获取非自动增长主键接口和类public interface EmployeeMapper { //插入老师信息 int insertTeacher(Teacher teacher);}public class Teacher { private String tId; private String tName;}mapper.xml:!-- 场景6非自增长主键交由mybatis帮我们维护 插入之前先指定一段sql语句生成一个主键值 orderBEFORE sql语句是在插入语句之前还是之后执行 resultTypeString 返回值类型 keyPropertytId 查询结果给哪个属性赋值 -- insert idinsertTeacher selectKey orderBEFORE resultTypeString keyPropertytId select replace (uuid() ,-,); /selectKey insert into t_teacher(t_id,t_name)values(#{tId},#{tName}) /insert测试Test public void test2() throws IOException { //1.读取外部配置文件 InputStream resourceAsStream Resources.getResourceAsStream(mybatis-config.xml); //2.创建sqlSessionFactory SqlSessionFactory sqlSessionFactory new SqlSessionFactoryBuilder().build(resourceAsStream); //3.根据sqlSessionFactory 创建sqlSession每次业务创建一个用完就释放,并自动开启事务 SqlSession sqlSession sqlSessionFactory.openSession(true); //4.获取接口的代理对象调用代理对象的方法就会查找mapper接口的方法 EmployeeMapper mapper sqlSession.getMapper(EmployeeMapper.class); Teacher teacher new Teacher(); teacher.settName(hehhehe); System.out.println(teacher.gettId()); System.out.println(-----------------------); mapper.insertTeacher(teacher); System.out.println(teacher.gettId()); sqlSession.close(); }7.自定义映射resultMap接口和类public interface EmployeeMapper { //根据编号查询教师 Teacher queryTeacherByTId (String id); }public class Teacher { private String tId; private String tName;}mapper.xml:!-- 场景7使用resultMap自定义映射关系 声明resultMap标签自己定义映射规则 id标识 select resultMap标识 type:具体的返回值类型全限定符和别名 id 主键映射关系 result 普通列的映射关系 -- resultMap idqueryteacher typeteacher id columnt_id propertytId/id result columnt_name propertytName/result /resultMap select idqueryTeacherByTId resultMapqueryteacher select t_id,t_name from t_teacher where t_id#{id} /select测试Test public void test3() throws IOException { //1.读取外部配置文件 InputStream resourceAsStream Resources.getResourceAsStream(mybatis-config.xml); //2.创建sqlSessionFactory SqlSessionFactory sqlSessionFactory new SqlSessionFactoryBuilder().build(resourceAsStream); //3.根据sqlSessionFactory 创建sqlSession每次业务创建一个用完就释放 SqlSession sqlSession sqlSessionFactory.openSession(); //4.获取接口的代理对象调用代理对象的方法就会查找mapper接口的方法 EmployeeMapper mapper sqlSession.getMapper(EmployeeMapper.class); Teacher teacher mapper.queryTeacherByTId(c8add010f1f211efa41a7c8ae15a8e54); System.out.println(teacher); }四多表查询功能1.多表设计1两个实体类关系 一对一一对多多对多2实体类设计原则》 对一关系类中只包含单个对方对象类型属性即可public class Customer { private Integer customerId; private String customerName; }public class Order { private int orderId; private String orderName; private Customer customer;//体现是对一的关系 }》对多关系类中只要包含对方类型集合属性即可public class Customer { private Integer customerId; private String customerName; private ListOrder orderList;//体现的是对多关系 }public class Order { private int orderId; private String orderName;}3设计表建议》只有真实发生多表查询时才需要设计和修改实体类否则不提前设计和修改实体类》无论多少张表联查实体类设计都是两两考虑》在查询映射的时候只需要关注本次查询相关的属性例如查询订单和对应的客户就不要关注客户中的订单集合2. 对一映射实例Java实例Data public class Customer { private Integer customerId; private String customerName; }Data public class Order { private int orderId; private String orderName; private int customerId; //体现是对一的关系 private Customer customer; }public interface OrderMapper { //根据编号查询订单及客户信息 Order queryOrderById(int i); }mapper.xml:mapper namespacecom.cn.learn.mapper.OrderMapper resultMap idordermap typeorder !--第一层属性order对象-- !--order主键 id标签-- id columnorder_id propertyorderId/id !--普通列-- result columnorder_name propertyorderName/result result columncustomer_id propertycustomerId/result !--对象属性赋值 property 对象属性名 javaType 对象类型 --association propertycustomer javaTypecustomerid columncustomer_id propertycustomerId/id result columncustomer_name propertycustomerName/result /association /resultMap select idqueryOrderById resultMapordermap select * from order o left join customer c on o.customer_id c.customer_id where o.customer_id #{id} /select /mapper测试public class MybatisTest { private SqlSession sqlSession; BeforeEach public void init() throws IOException { //1.读取外部配置文件 InputStream resourceAsStream Resources.getResourceAsStream(mybatis-config.xml); //2.创建sqlSessionFactory SqlSessionFactory sqlSessionFactory new SqlSessionFactoryBuilder().build(resourceAsStream); //3.根据sqlSessionFactory 创建sqlSession每次业务创建一个用完就释放 sqlSession sqlSessionFactory.openSession(true); } Test public void singleMapper(){ OrderMapper orderMapper sqlSession.getMapper(OrderMapper.class); Order order orderMapper.queryOrderById(1); System.out.println(order); } }3. 对多映射实例Java实例Data public class Customer { private Integer customerId; private String customerName; //体现的是对多关系 private ListOrder orderList; }Data public class Order { private int orderId; private String orderName; private int customerId; //体现是对一的关系 private Customer customer; }public interface CustomerMapper { //查询所有客户及客户下所有的订单信息 ListCustomer querylist(); }mapper.xml:mapper namespacecom.cn.learn.mapper.CustomerMapper resultMap idcustomermap typecustomer !--第一层属性customer对象-- !--customer主键 id标签-- id columncustomer_id propertycustomerId/id !--普通列-- result columncustomer_name propertycustomerName/result !-- 集合属性赋值 property 集合属性名 ofType 泛型类型 -- collection propertyorderList ofTypeorder id columnorder_id propertyorderId/id result columnorder_name propertyorderName/result result columncustomer_id propertycustomerId/result /collection /resultMap select idquerylist resultMapcustomermap select * from customer c left join order o on o.customer_id c.customer_id /select /mapper测试public class MybatisTest { private SqlSession sqlSession; BeforeEach public void init() throws IOException { //1.读取外部配置文件 InputStream resourceAsStream Resources.getResourceAsStream(mybatis-config.xml); //2.创建sqlSessionFactory SqlSessionFactory sqlSessionFactory new SqlSessionFactoryBuilder().build(resourceAsStream); //3.根据sqlSessionFactory 创建sqlSession每次业务创建一个用完就释放 sqlSession sqlSessionFactory.openSession(true); } Test public void doubleMapper(){ CustomerMapper customerMapper sqlSession.getMapper(CustomerMapper.class); ListCustomer customerList customerMapper.querylist(); for(Customer c:customerList){ System.out.println(c); } } }4. 多表映射总结开启配置映射是result 项可以不用写mybatis-config// 开启多表自动映射setting nameautoMappingBehavior valueFULL/// 开启驼峰映射数据库属性和实体类映射 setting namemapUnderscoreToCamelCase valuetrue/mapper 映射文件不用写result映射mapper namespacecom.cn.learn.mapper.CustomerMapper resultMap idcustomermap typecustomer !--第一层属性customer对象-- !--customer主键 id标签-- id columncustomer_id propertycustomerId/id !--普通列-- !-- result columncustomer_name propertycustomerName/result-- !-- 集合属性赋值 property 集合属性名 ofType 泛型类型 -- collection propertyorderList ofTypeorder id columnorder_id propertyorderId/id !-- result columnorder_name propertyorderName/result-- !-- result columncustomer_id propertycustomerId/result-- /collection /resultMap select idquerylist resultMapcustomermap select * from customer c left join order o on o.customer_id c.customer_id /select /mapper五动态语句1.动态语句需求和简介经常遇到很多按照多查询条件进行查询的情况比如购物网站的条件搜索动态SQL 是MyBatis的强大特性之一。如果你使用过JDBC 或其他类似的框架你应该能理解根据不同条件拼接SQL语句有多痛苦例如拼接时要确保不能忘记添加必要的空格还要注意去掉列表最后一个列名的逗号。利用动态SQL可以彻底摆脱这种痛苦。2.if和 where标签实体类Data public class Employee { private int empId; private String empName; private double empSalary; }public interface EmployeeMapper { //根据员工姓名和工资查询员工信息 ListEmployee query(Param(name) String EmpName ,Param(salary) Double Salary); }mapper.xml:mapper namespacecom.cn.learn.mapper.EmployeeMapper !-- ListEmployee query(Param(name) String EmpName ,Param(salary) Double Salary) 如果传入属性就判断相等如果不传入不加对应的条件 where if 判断传入的参数最终是否添加语句 test属性 内部做比较运算最终true 将标签内的sql 语句进行拼接 false 不拼接标签内部语句 判断语句 “key 比较符号 值 and|or key 比较符号 值” 大于和小于 不推荐直接写符号 实体符号html— gt; lt; 问题 假如 两个都满足where emp_name#{name} and emp_salaly#{salary} 假如满足第一个满足 where emp_name#{name} 假如第一个不满足第二个满足where and emp_salaly#{salary} 错误 假如都不满足 where where 标签的作用由两个 1.自动添加where 关键字 where 内部有任何一个if满足自动添加where关键字不满足去掉where 2.自动去掉多余的and 和or 关键字 -- select idquery resultTypeemployee select * from t_emp where if testname!null emp_name#{name} /if if testsalary!null and salary lt;5000 and emp_salary#{salary} /if /where /select /mapperconfig文件和测试省略3.set标签实体类public interface EmployeeMapper {//根据员工id更新姓名和薪水要求姓名和薪水都不能为空 int update(Employee emp); }mapper.xml:!-- set标签的作用 1.去掉多余逗号 2.添加关键字set -- update idupdate update t_emp set if testempName!null emp_name#{empName}, /if if testempSalary!null emp_salary#{empSalary} /if /set where emp_id#{empId} /updateconfig文件和测试省略4.choose标签实体类public interface EmployeeMapper {ListEmployee querychoose(Param(name) String EmpName ,Param(salary) Double Salary); }mapper.xml:!-- choose标签表示只有一个条件类似java的 switch case -- select idquerychoose resultTypeemployee select * from t_emp where choose when testname ! null emp_name#{name} /when when testsalary ! null emp_salary#{salary} /when otherwise11/otherwise /choose /selectconfig文件和测试省略5.foreach标签批量操作标签实体类public interface EmployeeMapper {ListEmployee querybatch(Param(ids) ListInteger ids ); int deletebatch(Param(ids) ListInteger ids); int updatebatch(Param(employees)ListEmployee employees); int insertbatch(Param(employees)ListEmployee employees); }mapper.xml:select idquerybatch resultTypeemployee select * from t_emp where emp_id in !-- 遍历的数据123 collectionids|arg0|list open 遍历之前要追加的字符串 close 遍历结束要添加的字符串 separator 每次遍历的分隔符如果时最后一次不会追加 item 获取每个遍历项 -- foreach collectionids open( separator, close) itemid #{id} /foreach /select delete iddeletebatch delete from t_emp where emp_id in foreach collectionids open( separator, close) itemid #{id} /foreach /delete update idupdatebatch !--如果一个标签设计多个语句需要设置允许指定多语句在url后面加上?allowMultiQueriestrue -- foreach collectionemployees itememp update t_emp set emp_name#{emp.empName},emp_salary#{emp.empSalary} where emp_id#{emp.empId}; /foreach /update insert idinsertbatch insert into t_emp(emp_name,emp_salary)values foreach collectionemployees separator, itememp (#{emp.empName},#{emp.empSalary}) /foreach /insert测试public class MybatisTest { private SqlSession sqlSession; BeforeEach public void init() throws IOException { //1.读取外部配置文件 InputStream resourceAsStream Resources.getResourceAsStream(mybatis-config.xml); //2.创建sqlSessionFactory SqlSessionFactory sqlSessionFactory new SqlSessionFactoryBuilder().build(resourceAsStream); //3.根据sqlSessionFactory 创建sqlSession每次业务创建一个用完就释放 sqlSession sqlSessionFactory.openSession(true); }Test public void batchquerryMapper() { EmployeeMapper employeeMapper sqlSession.getMapper(EmployeeMapper.class); Integer[] arr {1, 2, 3, 4, 5}; ListInteger ids Arrays.asList(arr); for (Employee employee : employeeMapper.querybatch(ids)) { System.out.println(employee); } } Test public void batchdeleteMapper() { EmployeeMapper employeeMapper sqlSession.getMapper(EmployeeMapper.class); Integer[] arr {1, 2}; ListInteger ids Arrays.asList(arr); employeeMapper.deletebatch(ids); } Test public void batchupdateMapper() { EmployeeMapper employeeMapper sqlSession.getMapper(EmployeeMapper.class); ListEmployee employees new ArrayList(); Employee emp1 new Employee(); emp1.setEmpId(3); emp1.setEmpName(hhh); emp1.setEmpSalary(1000.00); Employee emp2 new Employee(); emp2.setEmpId(4); emp2.setEmpName(eeeee); emp2.setEmpSalary(2000.00); employees.add(emp1); employees.add(emp2); employeeMapper.updatebatch(employees); } Test public void batchinsertMapper() { EmployeeMapper employeeMapper sqlSession.getMapper(EmployeeMapper.class); ListEmployee employees new ArrayList(); Employee emp1 new Employee(); emp1.setEmpId(1); emp1.setEmpName(zhangsan); emp1.setEmpSalary(1000.00); Employee emp2 new Employee(); emp2.setEmpId(4); emp2.setEmpName(lisi); emp2.setEmpSalary(2000.00); employees.add(emp1); employees.add(emp2); employeeMapper.insertbatch(employees); } }六扩展功能1.批量映射mapper.xmlmapper-config.xmlmappers !--批量mapper指定 1.要求mapperxml文件和mapper接口的命名必须相同 2.最终打包后的位置要一致都是指定的包地址下 方案 resources文件夹创建对应的文件夹解构即可 resources下直接创建多层文件夹使用/分割就是一层文件夹 -- package namecom.cn.learn.mapper/ /mappersmapper 接口路径mapper.xml 路径maven 编译后路径2.逆向工程MyBatis 的逆向工程是一种自动化生成持久层代码和映射文件的工具它可以根据数据库表结构和设置的参数生成对应的实体类Mapper.xml 文件Mapper接口等代码文件简化了开发者手动生成的过程。逆向工程使开发者可以快速地构建起DAO层并快速上手进行业务开发MyBatis的逆向广场有两种方式通过Mybatis genertaor 插件实现和通过Maven插件实现。生成逆向工程的步骤步骤1安装插件MyBatisX步骤2连接idea的Database并勾选指定的库步骤3选中对应库 下的表右键选择MyBatisX-Generator步骤4指定模块路径包名并选中表步骤5按图选中对应的选项并点击确定步骤6查看生成的文件