默默傻子 發表於 2026-4-26 22:42:00

Mybatis入门手册

<h3 id="介绍">介绍</h3>
<p>MyBatis 是一个优秀的持久层框架,它简化了 Java 应用程序与关系型数据库之间的交互。MyBatis 通过 XML 或注解的方式将 SQL 语句与 Java 对象进行映射,避免了传统 JDBC 编程中的大量样板代码。</p>
<h3 id="xml方式配置mybatis">XML方式配置Mybatis</h3>
<p>现在不常用,稍微了解一下即可,1对1,1对多等细节方面不作赘述</p>
<h4 id="项目结构分析">项目结构分析</h4>
<pre><code>Mybatis_1
└── src
&nbsp;&nbsp; ├── main
&nbsp;&nbsp; │&nbsp;&nbsp; ├── java
&nbsp;&nbsp; │&nbsp;&nbsp; │&nbsp;&nbsp; └── org.palmer.mybatis_1
&nbsp;&nbsp; │&nbsp;&nbsp; │&nbsp;&nbsp;   ├── mapper
&nbsp;&nbsp; │&nbsp;&nbsp; │&nbsp;&nbsp;   │&nbsp;&nbsp;└── UserMapper.java
&nbsp;&nbsp; │&nbsp;&nbsp; │&nbsp;&nbsp;   └── pojo
&nbsp;&nbsp; │&nbsp;&nbsp; │&nbsp;&nbsp;          └── User.java
&nbsp;&nbsp; │&nbsp;&nbsp; └── resources
&nbsp;&nbsp; │&nbsp;&nbsp;   ├── application.properties
&nbsp;&nbsp; │       ├── db.properties
&nbsp;&nbsp; │&nbsp;&nbsp;   ├── mapper
&nbsp;&nbsp; │&nbsp;&nbsp;   │&nbsp;&nbsp; └── UserMapper.xml
&nbsp; │&nbsp;&nbsp;   ├── mybatis-config.xml
&nbsp;&nbsp; └── test
&nbsp;&nbsp;   └── java
&nbsp;&nbsp;         └── org.palmer.mybatis_1
&nbsp;&nbsp;            └── MybatisXmlTest.java
</code></pre>
<ul>
<li>
<p><strong>org.palmer.mybatis_1/</strong></p>
<ul>
<li>mapper包:存放 Mapper 接口(也称为 DAO 接口)。&nbsp;它定义了操作数据库的方法(如&nbsp;<code>insertUser</code>、<code>getUserById</code>),但不包含实现类。MyBatis 在运行时会利用 JDK 动态代理技术,根据接口方法的签名和对应的 XML 配置,自动生成实现类对象(代理对象)来执行 SQL。</li>
<li>pojo包:存放java 实体类</li>
</ul>
</li>
<li>
<p><strong>resources/</strong></p>
<ul>
<li>mybatis-config.xml : <strong>MyBatis 的全局核心配置文件。</strong>&nbsp;它用于配置数据库连接环境(Environment)、事务管理器、数据源,以及<strong>注册映射文件</strong>(即告诉 MyBatis 去哪里加载&nbsp;<code>mapper</code>&nbsp;包下的 XML 文件),是整个框架运行的基础。</li>
<li>application.properties文件:将配置代码从业务代码里解耦出来,直观方便,更改配置时不用重新编译</li>
<li>db.properties文件:将数据库驱动、用户、密码、等关键信息解耦出来,直观方便,更改配置时不用重新编译</li>
<li>mapper包:存放后缀为.xml的SQL映射文件,通过<code>&lt;namespace&gt;</code>标签关联对应的java接口,通过id属性关联接口中的方法,然后编写实际的SQL语句;接口一般和一个实体(pojo类)对应,从而实现了<strong>SQL 语句与 Java 代码的解耦。</strong></li>
</ul>
</li>
</ul>
<h4 id="xxxmapper接口">xxxMapper接口</h4>
<p>定义接口</p>
<pre><code class="language-java">public interface UserMapper {
    public User getUserById(int id);
    public void insertUser(User user);
}
</code></pre>
<h4 id="xxxmapperxml">xxxMapper.xml</h4>
<p>id要和接口的方法名字一致</p>
<ul>
<li><strong>#{}</strong>&nbsp;:预编译参数,防止 SQL 注入,推荐使用。</li>
<li>${} :字符串替换,存在 SQL 注入风险,仅用于动态表名、列名等场景。</li>
</ul>
<h5 id="开启获取主键功能">开启获取主键功能</h5>
<p><strong>useGeneratedKeys="true"</strong>:开启功能,告诉 MyBatis 使用 JDBC 的&nbsp;<code>getGeneratedKeys</code>获取主键的值</p>
<h5 id="主键回填">主键回填</h5>
<p><strong>keyProperty="id"</strong>:告诉 MyBatis 把拿到的主键值,赋值给 Java 对象的哪个属性。</p>
<pre><code class="language-xml">&lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
      "http://mybatis.org/dtd/mybatis-3-mapper.dtd"&gt;
&lt;mapper namespace="org.palmer.mybatis_1.mapper.UserMapper"&gt;
    &lt;select id="getUserById" parameterType="int" resultType="org.palmer.mybatis_1.pojo.User"&gt;
      SELECT * FROM users WHERE id = #{id}
    &lt;/select&gt;

    &lt;insert id="insertUser" parameterType="org.palmer.mybatis_1.pojo.User" useGeneratedKeys="true" keyProperty="id"&gt;
      INSERT INTO users(name, age) VALUES(#{name}, #{age})
    &lt;/insert&gt;

    &lt;update id="updateUser" parameterType="org.palmer.mybatis_1.pojo.User"&gt;
      UPDATE users SET name = #{name}, age = #{age} WHERE id = #{id}
    &lt;/update&gt;

    &lt;delete id="deleteUserById" parameterType="int"&gt;
      DELETE from users where id = #{id}
    &lt;/delete&gt;
&lt;/mapper&gt;
</code></pre>
<h4 id="mybatis-configxml">mybatis-config.xml</h4>
<p>为Mybatis的全局配置文件</p>
<ol>
<li><strong><code>${xxx}</code></strong>:占位符,从配置文件获取它的实际值;Spring Boot 环境下,占位符会自动从&nbsp;<code>application.properties</code>&nbsp;读取;纯 MyBatis 环境,需要通过&nbsp;<code>&lt;properties&gt;</code>&nbsp;标签明确指定从哪里读取,我们指明为的<code>db.properties</code></li>
<li>加载SQL映射文件:告诉 MyBatis 去当前目录的哪个包加载 SQL 映射定义。</li>
</ol>
<pre><code class="language-xml">&lt;mappers&gt;
    &lt;mapper resource="mapper/UserMapper.xml"/&gt;
    &lt;mapper resource="mapper/OrderMapper.xml"/&gt;
    // ..... 可以映射多个
&lt;/mappers&gt;
</code></pre>
<p>其余配置与JDBC一致,不再追述</p>
<pre><code class="language-xml">&lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
      "http://mybatis.org/dtd/mybatis-3-config.dtd"&gt;
&lt;configuration&gt;
        // 指定读取的
    &lt;properties resource="db.properties"/&gt;
    &lt;environments default="development"&gt;
      &lt;environment id="development"&gt;
            &lt;transactionManager type="JDBC"/&gt;
            &lt;dataSource type="POOLED"&gt;
                &lt;property name="driver" value="${driver}"/&gt;
                &lt;property name="url" value="${url}"/&gt;
                &lt;property name="username" value="${username}"/&gt;
                &lt;property name="password" value="${password}"/&gt;
            &lt;/dataSource&gt;
      &lt;/environment&gt;
    &lt;/environments&gt;
    &lt;mappers&gt;
      &lt;mapper resource="mapper/UserMapper.xml"/&gt;
    &lt;/mappers&gt;
&lt;/configuration&gt;
</code></pre>
<h4 id="dbproperties">db.properties</h4>
<p>Mybatis会来这个配置文件找寻数据库的信息</p>
<pre><code>driver = com.mysql.cj.jdbc.Driver
url = jdbc:mysql://localhost:3306/SSM
username = root
password = xxxxxxxx
</code></pre>
<h4 id="使用测试">使用测试</h4>
<ol>
<li>读取全局配置文件:定义配置文件路径,例如 <code>resource = "mybatis-config.xml"</code></li>
<li>获取输入流:使用 MyBatis 工具类加载配置,即 <code>InputStream inputStream = Resources.getResourceAsStream(resource)</code></li>
<li>构建工厂对象:利用建造者模式,通过 <code>SqlSessionFactoryBuilder().build(inputStream)</code> 根据输入流构造出 SqlSessionFactory 对象</li>
<li>开启会话:调用工厂方法 <code>sqlSessionFactory.openSession()</code> 获取一个 SqlSession 会话对象</li>
<li>执行操作:通过 SqlSession 获取 Mapper 的代理对象,调用其方法执行 SQL;对于增删改操作需显式调用 <code>session.commit()</code> 提交事务,查询结果会自动映射为 POJO,最后自动关闭 SqlSession (try-with-resources或者sqlSession.close()手动关闭)。</li>
</ol>
<p><strong>简单测试代码</strong></p>
<pre><code class="language-Java">    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();
    }
</code></pre>
<p><strong>实际业务中要确保资源的释放和异常处理</strong></p>
<pre><code class="language-java">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. 创建 SqlSessionFactory
            SqlSessionFactory 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();
      }
    }
</code></pre>
<h3 id="注解方式配置mybatis">注解方式配置Mybatis</h3>
<p>在简单业务上,用注解可以简化CRUD操作;生产环境中仍然推荐xml注解配置,灵活直观。这里的注解只是替换了每个接口的xml映射,<strong>所以还是需要全局配置文件?</strong></p>
<p>MyBatis 提供了一套原生注解对应 SQL 的增删改查操作,无需编写 XML 映射文件,直接在 Mapper 接口方法上添加注解即可完成 SQL 绑定,核心注解如下:</p>
<ul>
<li>@Insert:添加</li>
<li>@Update:修改</li>
<li>@Delete:删除</li>
<li>@Select:查询</li>
<li>@Option:设置主键</li>
<li>@Result:实现结果集封装</li>
<li>@Results:可以和@Result一起使用,封装多个结果集</li>
<li>@One:实现一对一和多对一的结果集封装</li>
<li>@Many:实现一对多结果级封装</li>
</ul>
<h4 id="更改mybatis-configxml">更改mybatis-config.xml</h4>
<p>指明要用注解映射SQL语句的接口用 <code>&lt;mapper class&gt;</code></p>
<pre><code class="language-xml">    &lt;mappers&gt;
      &lt;!-- &lt;mapper resource="mapper/UserMapper.xml"/&gt; 注释掉--&gt;
      &lt;mapper class="org.palmer.mybatis_1.mapper.UserMapper"/&gt;
    &lt;/mappers&gt;
</code></pre>
<h4 id="更改接口">更改接口</h4>
<p>@Options:对应了获取主键值的功能,和主键回填功能</p>
<pre><code class="language-Java">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);
}
</code></pre>
<p>其余配置可以不变,Ez</p><br><br>
来源:https://www.cnblogs.com/oddpalmer/p/19933944
頁: [1]
查看完整版本: Mybatis入门手册