映射文件是所有 SQL 语句放置的地方,写好 SQL 语句映射文件后,需要在配置文件的 mappers 标签中引用。

数据准备

MySQL准备

  1. docker run -p 3306:3306 --name mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7

创建数据库

  1. CREATE DATABASE test;
  1. DROP TABLE IF EXISTS `user`;
  2. CREATE TABLE `user` (
  3. `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  4. `user_name` varchar(20) NOT NULL,
  5. `password` varchar(32) NOT NULL,
  6. `age` tinyint(4) unsigned NOT NULL DEFAULT '0',
  7. `gender` tinyint(4) unsigned NOT NULL DEFAULT '0' COMMENT '0 未知 1 男 2 女',
  8. `created` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
  9. `updated` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  10. PRIMARY KEY (`id`)
  11. ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

插入测试数据

  1. INSERT INTO `user` VALUES (1, 'test1', '123456', 25, 1, '2021-08-31 00:37:12', '2021-08-31 00:37:16');
  2. INSERT INTO `user` VALUES (2, 'test2', '1234abc', 22, 1, '2021-08-30 16:42:24', '2021-08-30 16:42:33');
  3. INSERT INTO `user` VALUES (3, 'test3', 'qwer123', 30, 2, '2021-08-30 16:42:54', '2021-08-30 16:44:40');

创建数据表对应的user类

  1. public class User {
  2. private Integer id;
  3. private String userName;
  4. private String password;
  5. private Integer age;
  6. private Integer gender;
  7. private Date created;
  8. private Date updated;
  9. //... 省略 set get 方法
  10. @Override
  11. public String toString() {
  12. SimpleDateFormat DateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  13. return "User{" +
  14. "id=" + id +
  15. ", userName='" + userName + '\'' +
  16. ", password='" + password + '\'' +
  17. ", age=" + age +
  18. ", gender=" + gender +
  19. ", created=" + DateFormat.format(created) +
  20. ", updated=" + DateFormat.format(updated) +
  21. '}';
  22. }
  23. }

maven

  1. <dependencies>
  2. <!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
  3. <dependency>
  4. <groupId>org.mybatis</groupId>
  5. <artifactId>mybatis</artifactId>
  6. <version>3.5.7</version>
  7. </dependency>
  8. <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
  9. <dependency>
  10. <groupId>mysql</groupId>
  11. <artifactId>mysql-connector-java</artifactId>
  12. <version>5.1.49</version>
  13. </dependency>
  14. <!-- https://mvnrepository.com/artifact/org.slf4j/slf4j-log4j12 -->
  15. <dependency>
  16. <groupId>org.slf4j</groupId>
  17. <artifactId>slf4j-log4j12</artifactId>
  18. <version>1.7.32</version>
  19. </dependency>
  20. </dependencies>

配置信息

图片.png
mybatis-config.xml

  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE configuration
  3. PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
  4. "http://mybatis.org/dtd/mybatis-3-config.dtd">
  5. <!-- 根标签 -->
  6. <configuration>
  7. <properties>
  8. <property name="driver" value="com.mysql.jdbc.Driver"/>
  9. <property name="url" value="jdbc:mysql://127.0.0.1:3306/test?useSSL=false&amp;characterEncoding=utf-8&amp;allowMultiQueries=true"/>
  10. <property name="username" value="root"/>
  11. <property name="password" value="123456"/>
  12. </properties>
  13. <!-- 配置全局属性 -->
  14. <settings>
  15. <!-- 使用jdbc的getGeneratedKeys 获取数据库自增主键值 -->
  16. <setting name="useGeneratedKeys" value="true"/>
  17. <!-- 开启驼峰命名转换 -->
  18. <setting name="mapUnderscoreToCamelCase" value="true"/>
  19. </settings>
  20. <!-- 环境,可以配置多个,default:指定采用哪个环境 -->
  21. <environments default="dev">
  22. <!-- id:唯一标识 -->
  23. <environment id="test">
  24. <!-- 事务管理器,JDBC类型的事务管理器 -->
  25. <transactionManager type="JDBC" />
  26. <!-- 数据源,池类型的数据源 -->
  27. <dataSource type="POOLED">
  28. <property name="driver" value="com.mysql.jdbc.Driver" />
  29. <property name="url" value="jdbc:mysql://127.0.0.1:3306/test" />
  30. <property name="username" value="root" />
  31. <property name="password" value="123456" />
  32. </dataSource>
  33. </environment>
  34. <environment id="dev">
  35. <!-- 事务管理器,JDBC类型的事务管理器 -->
  36. <transactionManager type="JDBC" />
  37. <!-- 数据源,池类型的数据源 -->
  38. <dataSource type="POOLED">
  39. <property name="driver" value="${driver}" /> <!-- 配置了properties,所以可以直接引用 -->
  40. <property name="url" value="${url}" />
  41. <property name="username" value="${username}" />
  42. <property name="password" value="${password}" />
  43. </dataSource>
  44. </environment>
  45. </environments>
  46. <mappers>
  47. <mapper resource="mappers/UserMapper.xml" />
  48. </mappers>
  49. </configuration>

UserMapper.xml

  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE mapper
  3. PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  4. "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  5. <!-- mapper:根标签,namespace:命名空间,保证命名空间唯一 -->
  6. <mapper namespace="UserMapper">
  7. <!-- statement,内容:sql语句。id:唯一标识,在同一个命名空间下保持唯一
  8. resultType:sql语句查询结果集的封装类型,user即为数据库中的表
  9. -->
  10. <select id="selectUser" resultType="com.example.mybatis.domain.User">
  11. select * from user where id = #{id}
  12. </select>
  13. </mapper>

log4j.properties

  1. log4j.rootLogger=DEBUG,A1
  2. log4j.logger.org.apache=DEBUG
  3. log4j.appender.A1=org.apache.log4j.ConsoleAppender
  4. log4j.appender.A1.layout=org.apache.log4j.PatternLayout
  5. log4j.appender.A1.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss,SSS} [%t] [%c]-[%p] %m%n

测试

  • 1)配置mybatis-config.xml 全局的配置文件 (1、数据源,2、外部的mapper)
  • 2)创建SqlSessionFactory
  • 3)通过SqlSessionFactory创建SqlSession对象
  • 4)通过SqlSession操作数据库 CRUD
  • 5)调用session.commit()提交事务
  • 6)调用session.close()关闭会话 ```java import com.example.mybatis.domain.User; import org.apache.ibatis.io.Resources; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; import org.slf4j.Logger; import org.slf4j.LoggerFactory;

import java.io.IOException; import java.io.InputStream;

public class MybatisDemo { private static final Logger LOG = LoggerFactory.getLogger(MybatisDemo.class); public static void main(String[] args) throws IOException { // 获取mybatis配置信息 InputStream inputStream = Resources.getResourceAsStream(“mybatis-config.xml”); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); // 获取sqlSession SqlSession sqlSession = sqlSessionFactory.openSession(); try { // 操作CRUD,第一个参数:指定statement,规则:命名空间+”.”+statementId // 第二个参数:指定传入sql的参数:这里是用户id User user = sqlSession.selectOne(“UserMapper.selectUser”, 1); LOG.info(“selectUser->{}”,user); } finally { sqlSession.close(); } } }

  1. 创建接口UserMapper
  2. ```java
  3. public interface UserMapper {
  4. /**
  5. * 新增用戶
  6. * @param user
  7. * @return
  8. */
  9. int insertUser(User user);
  10. /**
  11. * 修改用戶
  12. * @param user
  13. * @return
  14. */
  15. int updateUser(User user);
  16. /**
  17. * 刪除用戶
  18. * @param id
  19. * @return
  20. */
  21. int deleteUser(Integer id);
  22. /**
  23. * 根据 id 查询用户信息
  24. * @param id
  25. * @return
  26. */
  27. User selectUserById(Integer id);
  28. /**
  29. * 查询所有的用户信息
  30. * @return
  31. */
  32. List<User> selectAllUser();
  33. }

mapper文件

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  3. <mapper namespace="com.chinaunicom.kg.mapper.UserMapper">
  4. <!-- 自定义返回结果集 -->
  5. <resultMap id="resultUserMap" type="com.chinaunicom.kg.domain.entity.User">
  6. <id property="id" column="id" javaType="int"></id>
  7. <result property="username" column="username" javaType="String"></result>
  8. <result property="password" column="password" javaType="String"></result>
  9. </resultMap>
  10. <!-- 定义 SQL 语句,其中 id 需要和接口中的方法名一致 -->
  11. <!-- useGeneratedKeys:实现自动生成主键 -->
  12. <!-- keyProperty: 唯一标记一个属性 -->
  13. <!-- parameterType 指明查询时使用的参数类型,resultType 指明查询返回的结果集类型 -->
  14. <insert id="insertUser" useGeneratedKeys="true" keyProperty="id">
  15. INSERT INTO user (username, password)
  16. VALUES (#{username}, #{password})
  17. </insert>
  18. <update id="updateUser" parameterType="com.chinaunicom.kg.domain.entity.User">
  19. UPDATE user
  20. SET password=#{password}
  21. WHERE id = #{id}
  22. </update>
  23. <delete id="deleteUser" parameterType="int">
  24. DELETE
  25. FROM user
  26. WHERE id = #{id}
  27. </delete>
  28. <select id="selectUserById" parameterType="int" resultType="com.chinaunicom.kg.domain.entity.User">
  29. SELECT *
  30. FROM user
  31. WHERE id = #{id}
  32. </select>
  33. <select id="selectAllUser" resultMap="resultUserMap">
  34. SELECT *
  35. FROM user
  36. </select>
  37. </mapper>

顶级元素

映射文件包含的顶级元素:

  • cache:给定命名空间的缓存配置。
  • cache-ref:其他命名空间缓存配置的引用。
  • resultMap:描述如何从数据库结果集中来加载对象。
  • sql:可被其他语句引用的可重用语句块。
  • insert:映射插入语句
  • update:映射更新语句
  • delete:映射删除语句
  • select:映射查询语句

resultMap

resultMap 的子元素包括:

  • constructor:用来将结果注入到一个实例化好的类的构造方法中
  • idArg: ID 参数,标记结果作为 ID
  • arg:注入到构造方法的一个普通结果
  • id: 一个 ID 结果,标记结果作为 ID
  • result:注入到字段或 JavaBean 属性的普通结果
  • association:复杂的类型关联,多个结果合成的类型
  • 嵌入结果映射:结果映射自身的关联,也可以引用一个外部结果映射
  • collection:复杂类型的集 也可以引用一个外部结果映射
  • discriminator:使用结果值来决定使用哪个结果集
  • case:基本一些值的结果映射
    • 也可以引用一个外部结果映射

参考

https://www.cnblogs.com/diffx/p/10611082.html