XML方式配置Mybatis现在不常用稍微了解一下即可1对1,1对多等细节方面不作赘述项目结构分析Mybatis_1└── src├── main│ ├── java│ │ └── org.palmer.mybatis_1│ │ ├── mapper│ │ │ └── UserMapper.java│ │ └── pojo│ │ └── User.java│ └── resources│ ├── application.properties│ ├── db.properties│ ├── mapper│ │ └── UserMapper.xml│ ├── mybatis-config.xml└── test└── java└── org.palmer.mybatis_1└── MybatisXmlTest.javaorg.palmer.mybatis_1/mapper包存放 Mapper 接口也称为 DAO 接口。 它定义了操作数据库的方法如insertUser、getUserById但不包含实现类。MyBatis 在运行时会利用 JDK 动态代理技术根据接口方法的签名和对应的 XML 配置自动生成实现类对象代理对象来执行 SQL。pojo包存放java 实体类resources/mybatis-config.xml :MyBatis 的全局核心配置文件。它用于配置数据库连接环境Environment、事务管理器、数据源以及注册映射文件即告诉 MyBatis 去哪里加载mapper包下的 XML 文件是整个框架运行的基础。application.properties文件将配置代码从业务代码里解耦出来直观方便更改配置时不用重新编译db.properties文件将数据库驱动、用户、密码、等关键信息解耦出来直观方便更改配置时不用重新编译mapper包存放后缀为.xml的SQL映射文件通过namespace标签关联对应的java接口通过id属性关联接口中的方法然后编写实际的SQL语句接口一般和一个实体(pojo类)对应从而实现了SQL 语句与 Java 代码的解耦。xxxMapper接口定义接口public interface UserMapper {public User getUserById(int id);public void insertUser(User user);}xxxMapper.xmlid要和接口的方法名字一致#{}预编译参数防止 SQL 注入推荐使用。${} 字符串替换存在 SQL 注入风险仅用于动态表名、列名等场景。开启获取主键功能useGeneratedKeystrue开启功能告诉 MyBatis 使用 JDBC 的getGeneratedKeys获取主键的值主键回填keyPropertyid告诉 MyBatis 把拿到的主键值赋值给 Java 对象的哪个属性。?xml version1.0 encodingUTF-8?!DOCTYPE mapper PUBLIC -//mybatis.org//DTD Mapper 3.0//ENhttp://mybatis.org/dtd/mybatis-3-mapper.dtdmapper namespaceorg.palmer.mybatis_1.mapper.UserMapperselect idgetUserById parameterTypeint resultTypeorg.palmer.mybatis_1.pojo.UserSELECT * FROM users WHERE id #{id}/selectinsert idinsertUser parameterTypeorg.palmer.mybatis_1.pojo.User useGeneratedKeystrue keyPropertyidINSERT INTO users(name, age) VALUES(#{name}, #{age})/insertupdate idupdateUser parameterTypeorg.palmer.mybatis_1.pojo.UserUPDATE users SET name #{name}, age #{age} WHERE id #{id}/updatedelete iddeleteUserById parameterTypeintDELETE from users where id #{id}/delete/mappermybatis-config.xml为Mybatis的全局配置文件${xxx}占位符从配置文件获取它的实际值Spring Boot 环境下占位符会自动从application.properties读取纯 MyBatis 环境需要通过properties标签明确指定从哪里读取我们指明为的db.properties加载SQL映射文件告诉 MyBatis 去当前目录的哪个包加载 SQL 映射定义。mappersmapper resourcemapper/UserMapper.xml/mapper resourcemapper/OrderMapper.xml/// ..... 可以映射多个/mappers其余配置与JDBC一致不再追述?xml version1.0 encodingUTF-8?!DOCTYPE configuration PUBLIC -//mybatis.org//DTD Config 3.0//ENhttp://mybatis.org/dtd/mybatis-3-config.dtdconfiguration// 指定读取的properties resourcedb.properties/environments defaultdevelopmentenvironment iddevelopmenttransactionManager typeJDBC/dataSource typePOOLEDproperty namedriver value${driver}/property nameurl value${url}/property nameusername value${username}/property namepassword value${password}//dataSource/environment/environmentsmappersmapper resourcemapper/UserMapper.xml//mappers/configurationdb.propertiesMybatis会来这个配置文件找寻数据库的信息driver com.mysql.cj.jdbc.Driverurl jdbc:mysql://localhost:3306/SSMusername rootpassword xxxxxxxx使用测试读取全局配置文件定义配置文件路径例如resource mybatis-config.xml获取输入流使用 MyBatis 工具类加载配置即InputStream inputStream Resources.getResourceAsStream(resource)构建工厂对象利用建造者模式通过SqlSessionFactoryBuilder().build(inputStream)根据输入流构造出 SqlSessionFactory 对象开启会话调用工厂方法sqlSessionFactory.openSession()获取一个 SqlSession 会话对象执行操作通过 SqlSession 获取 Mapper 的代理对象调用其方法执行 SQL对于增删改操作需显式调用session.commit()提交事务查询结果会自动映射为 POJO最后自动关闭 SqlSession (try-with-resources或者sqlSession.close()手动关闭)。简单测试代码public static void main(String[] args) throws IOException {String resource mybatis-config.xml;InputStream inputStream Resources.getResourceAsStream(resource);SqlSessionFactory sqlSessionFactory new SqlSessionFactoryBuilder().build(inputStream);SqlSession sqlSession sqlSessionFactory.openSession();UserMapper mapper sqlSession.getMapper(UserMapper.class);User user new User(palmer, 18);mapper.insertUser(user);System.out.println(mapper.getUserById(user.getId()));sqlSession.commit();sqlSession.close();}实际业务中要确保资源的释放和异常处理public class MybatisXmlTest {// 测试数据常量private static final String TEST_USER_NAME palmer;private static final int TEST_USER_AGE 18;public static void main(String[] args) {String resource mybatis-config.xml;// 使用 try-with-resources 自动管理资源try (InputStream inputStream Resources.getResourceAsStream(resource)) {// 1. 创建 SqlSessionFactorySqlSessionFactory sqlSessionFactory new SqlSessionFactoryBuilder().build(inputStream);// 2. 打开 SqlSession自动关闭try (SqlSession session sqlSessionFactory.openSession()) {// 3. 获取 Mapper 代理对象UserMapper mapper session.getMapper(UserMapper.class);System.out.println(张珈铭249980843);// 4. 执行插入操作User user new User(TEST_USER_NAME, TEST_USER_AGE);mapper.insertUser(user);System.out.println(用户插入成功自动生成的id user.getId());System.out.println(user.getId());// 5. 执行查询操作user mapper.getUserById(user.getId());System.out.println(查询结果 user);// 6. 更新操作System.out.println(---- 更新测试);user.setAge(22);user.setName(oddpalmer);mapper.updateUser(user);user mapper.getUserById(user.getId());System.out.println(查询结果 user);// 7. 删除操作System.out.println(---- 删除测试);mapper.deleteUserById(user.getId());user mapper.getUserById(user.getId());if(user null)System.out.println(删除成功);session.commit(); // 提交事务}} catch (IOException e) {System.err.println(配置文件加载失败);e.printStackTrace();} catch (Exception e) {System.err.println(数据库操作失败);e.printStackTrace();}}注解方式配置Mybatis在简单业务上用注解可以简化CRUD操作生产环境中仍然推荐xml注解配置灵活直观。这里的注解只是替换了每个接口的xml映射所以还是需要全局配置文件MyBatis 提供了一套原生注解对应 SQL 的增删改查操作无需编写 XML 映射文件直接在 Mapper 接口方法上添加注解即可完成 SQL 绑定核心注解如下Insert:添加Update:修改Delete:删除Select:查询Option:设置主键Result:实现结果集封装Results:可以和Result一起使用封装多个结果集One:实现一对一和多对一的结果集封装Many:实现一对多结果级封装更改mybatis-config.xml指明要用注解映射SQL语句的接口用mapper classmappers!-- mapper resourcemapper/UserMapper.xml/ 注释掉--mapper classorg.palmer.mybatis_1.mapper.UserMapper//mappers更改接口Options:对应了获取主键值的功能和主键回填功能public interface UserMapper {Select(select * from users where id #{id})public User getUserById(int id);Insert(insert into users(name, age) values(#{name}, #{age}))Options(useGeneratedKeys true, keyProperty id)public int insertUser(User user);Update(update users set name #{name}, age #{age} where id #{id})public void updateUser(User user);Delete(delete from users where id #{id})public int deleteUserById(int id);