MyBatis配置与使用-初入篇

2022-08-29 15:07:09 浏览数 (1)

依赖引入

代码语言:javascript复制
 <dependency>
   <groupId>org.mybatis</groupId>
   <artifactId>mybatis</artifactId>
   <version>3.5.10</version>
 </dependency>

首先引入MyBatis依赖。

注:MyBatis底层是JDBC驱动,所以我们仍然需要引入MySQL连接驱动依赖。

创建配置

resources文件夹中创建mybatis-config.xml文件

XML 配置文件中包含了对 MyBatis 系统的核心设置,包括获取数据库连接实例的数据源(DataSource)以及决定事务作用域和控制方式的事务管理器(TransactionManager)。

文件的配置内容官方给出了一个基本的内容:

代码语言:javascript复制
 <?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>
     <!-- 环境配置:事务管理器和数据源配置 -->
     <environments default="development">
         <environment id="development">
             <transactionManager type="JDBC"/>
             <dataSource type="POOLED">
                 <!-- 数据库基本配置 -->
                 <property name="driver" value="${driver}"/>
                 <property name="url" value="${url}"/>
                 <property name="username" value="${username}"/>
                 <property name="password" value="${password}"/>
             </dataSource>
         </environment>
     </environments>
 
     <mappers>
         <!-- 映射器 -->
         <mapper resource="org/mybatis/example/BlogMapper.xml"/>
     </mappers>
 </configuration>

我们直接在对应的配置字段处,填写urlpassworddriver等配置。

创建接口

MyBatis中的mapper接口相当于以前的Dao,不过我们是不需要写实现类的。

我们先创建接口。

就和我们以前的Dao接口一模一样。

但是我们的实现类就不需要了,我们用xml配置。

创建Mapper.xml

扩展

我们创建Dao接口对应的Mapper时,我们可以在资源中创建一个和java中路径一样的包。

当然,这不是必要的。

如果你是要这样创建一个包:

那在创建时就要注意,这个是创建文件夹(目录),不是包。

格式也不是.

创建之后,我们命名最好对应接口名,我这里接口是UserMappermapper.xml就叫UserMapper.xml

代码语言:javascript复制
 <?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.janyork.mybatis.mapper.UserMapper">
 </mapper>

在为编写语句时,默认的内容为以上内容。

namespace是接口路径。

那此时,你想添加一条写入语句(SQL),那可以使用insert标签,如下:

代码语言:javascript复制
 <?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.janyork.mybatis.mapper.UserMapper">
    <insert id="insertUser" parameterType="com.janyork.mybatis.pojo.User">
         INSERT INTO user (name)
         VALUES (#{name})
         </insert>
 </mapper>

注:parameterType路径为实体类路径。id为你调用时调用的方法名,对应Dao接口方法名

代码语言:javascript复制
     /**
      * 添加用户
      * @return  行数
      * @param name 用户name
      */
     int insertUser(String name);

此时我的接口带了参数,那么我们就使用#或者$来插入。

${}是字符串替换,往往与#{}相混淆,而#{}是预编译处理命令。#{}多用于命令场景。

我们这就直接用#了。

传输的参数叫name,那么就直接获取name,格式就是#{参数名}

使用Mybatis

代码语言:javascript复制
 package com.janyork.mybatis.utils;
 
 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 java.io.IOException;
 import java.io.InputStream;
 
 /**
  * @author JanYork
  * @date 2022/8/9 8:24
  * @description MyBatis工具类
  */
 public class MyBatisUtils {
 
     private static SqlSessionFactory sqlSessionFactory;
 
     static {
         try {
             //读取配置文件
             String resource = "mybatis-config.xml";
             InputStream inputStream = Resources.getResourceAsStream(resource);
             sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
         } catch (IOException e) {
             e.printStackTrace();
         }
     }
 
     /**
      * 获取 SqlSession
      * @return SqlSession对象
      */
     public static SqlSession getSqlSession() {
         return sqlSessionFactory.openSession();
     }
 }

我们创建一个工具类,里面的类和方法官方文档都是提供的,也有说明。

然后我们创建一个测试类(我这里就直接单元测试了)。

结果就是写入了一个用户名———>Jan

注:我数据库user表就两个字段(idname)。

现在我们已经可以写入了,但是你有没有发现有的地方写起来很麻烦。

缩减包名

比如这里:

这么长,一两个还好,要是很多句岂不是麻烦死了...

我们可以这样:

在配置文件里面,创建typeAliases标签,里面可以配置多个typeAlias

typeAlias里面type属性指向我们的用户实体类,alias属性用于定义它的替代名字。

代码语言:javascript复制
     <typeAliases>
         <typeAlias type="com.janyork.mybatis.pojo.User" alias="User"/>
     </typeAliases>

现在这样是不是就简短多了。

删改查

我们刚刚试了写入,但是没试过改查,那是因为查有点不一样,修改删除还是差不多的。

删除:

代码语言:javascript复制
     <delete id="deleteUser" parameterType="User">
         DELETE FROM user WHERE id = #{id}
     </delete>

看上面的图会发现,我这里多了个属性——>resultMap

代码语言:javascript复制
     <select id="selectUserByName" parameterType="User" resultMap="BaseResultMap">
         SELECT * FROM user WHERE name = #{name}
     </select>
 
     <select id="selectAllUser" parameterType="User" resultMap="BaseResultMap">
         SELECT * FROM user
     </select>

那这个resultMap="BaseResultMap"是什么呢??

他是一个对应SQL与实体类字段的配置。

在这里,我们配置了一个字段——>resultMap

代码语言:javascript复制
     <resultMap id="BaseResultMap" type="com.janyork.mybatis.pojo.User">
         <id column="id" property="id" jdbcType="INTEGER"/>
         <result column="name" property="name" jdbcType="VARCHAR"/>
     </resultMap>

resultMapid命名自定义,type指向实体类。

id 属性:唯一标识,此 id 值用于 select 元素 resultMap 属性的引用。 type 属性:表示该 resultMap 的映射结果类型。 result 子节点:用于标识一些简单属性,其中 column 属性表示从数据库中查询的字段名或别名, property 属性则表示查询出来的字段对应的值赋给实体对象的哪个属性。

resultMap有多个子节点属性,不过常用的就idresult

子节点说明:

  • constructor - 用于注入结果到构造方法中
  • id – 标识ID列
  • result – 表示一般列
  • association – 关联查询
  • collection – 查询集合
  • discriminator - 鉴别器:mybatis可以使用discriminator判断某列的值,然后根据某列的值改变封装行为

column属性是数据库的字段名,property是实体类的字段名,jdbcType是数据库字段类型。

这样,配置好后就可以进行查改操作了。

大致结构

0 人点赞