Mybatis基本使用

187 阅读3分钟

1 搭建流程

  1. 创建maven工程,引入mybatis和mysql依赖
  2. 创建数据表与对应的实体类
  3. 创建操作数据表对应的Mapper接口
  4. 编写接口对应的xml映射配置文件
<mapper namespace="Mapper接口全限定名">
    <select id="对应的Mapper接口中的方法名" parameterType="入参类型" resultType="结果集对应的实体类型">
        select * from 表名 where 字段名=#{参数名}
    </select>
</mapper>
这里的paramType可以使基本数据类型,也可以是对象(包括List、Map等),但这个参数不是必须的,因为接口中已经指明了形参类型
如果只有一个基本类型参数,在没有使用@Param取名的情况下,#{}中的参数名可以随便写;
如果有一个类类型的参数,#{}中的直接写该对象的属性;
如果入参为多个参数,有两种做法:
1、封装成Map或对象传递
2.在接口中使用@Param注解为参数取名,然后在xmlsql语句中通过#{}使用,不需要在xml中再指明parameterType
(不加@Param注解,无默认值)
  1. 创建mybatis主配置文件
<!-- 主配置文件 -->
<configuration>
    <environments default="mysql">
        <environment id="mysql">
            <!-- 配置事务类型 -->
            <transactionManager type="JDBC"></transactionManager>
            <!-- 配置数据源 -->
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/mybatis"/>
                <property name="username" value="username"/>
                <property name="password" value="password"/>
            </dataSource>
        </environment>
    </environments>
    
    <!-- 指定xml配置文件的位置 -->
    <mappers>
        <mapper resource="com/lxy/mapper/XXX.xml"></mapper>
    </mappers>
</configuration>

6.读取主配置文件,创建SqlSessionFactory工厂,生产SqlSession对象,创建实现接口的代理对象,使用代理对象执行方法,释放资源

//1.读取主配置文件
InputStream in=Resources.getResourceAsStream("SqlMapConfig.xml");
//2.创建SqlSessionFactory工厂
SqlSessionFactory factory=new SqlSessionFactoryBuilder().build(in);
//3.使用工厂生产SqlSession对象,参数为true表示事务自动提交;默认为false,需要手动提交
SqlSession session=factory.openSession(true);
//4.由SqlSession创建Dao的代理对象
IUserDao userDao=session.getMapper(IUserDao.class);
//5.由代理对象执行方法
userDao.方法名(参数);
//6.关闭连接,释放资源
session.close();
in.close();

原理粗略理解

  • 根据Dao接口的字节码创建Dao的代理对象,进行方法增强,完成注册驱动、建立连接、执行sql、封装结果集一系列操作。
  • 主配置文件中定义了连接信息以及mappper.xml文件位置
  • 每个mapper.xml中通过namespace指明了对应的接口,每个方法标签中指明了对应的接口中的方法名、sql语句、结果封装类型
  • 第3步创建SqlSession对象时通过主配置文件,可以知道连接信息和mapper映射配置文件位置;第5步执行时,可以通过全限定类名+方法名去mapper配置文件中找到sql语句、返回类型等信息,完成后续操作

2 具体使用方式

2.1 基础增删改查

  • 增删改查对应<insert> <delete> <update> <select>标签,在标签内通过id指明方法名,resultType/resultMap指明封装类型(可选),parameterType指明入参类型(可以不写)
数据表列名与JavaBean属性名不一致时可以通过在xml中配置<resultMap>,然后将<resultType>替换为<resultMap>解决
<resultMap id="唯一标识" type="JavaBean全限定类名">
    <!-- 配置主键 -->
    <id property="uid" column="id"></id>
    <1-- 配置其它字段 -->
    <result property="userName" column="username"></result>
    <result property="userSex" column="sex"></result>
</resultMap>
  • 模糊查询有两种方式:
    1. 传参时加%,使用like #{param}取值
    2. 传参时不加%,使用like '%${value}%'取值
    3. 比较:第一种方式本质是?占位符,第二种是字符串拼接,推荐第一种
    4. 注意:sql语句注释用<!-- -->,不要用--
  • 还可以在<update>中内嵌<selectKey>获取数据库自增id,并写回插入对象

2.2 动态Sql语句

  • <if>:用于判断查询条件进行拼接
<select id="findByCon" paramType="user" resultType="user">
    select * from user
    <where>
        <if test="username!=null">
            and username = #{username}
        </if>
    </where>
</select>
  • <where>:嵌套在<if>外,会根据是否有查询条件选择是否在sql语句中拼接where,也可理解为where 1=1
  • <foreach>:一般用于in查询
<select id="findByIds" parameterType="java.util.List" resultType="user">
    select * from user
    <where>
        <!-- 入参为集合类型如果没有使用@Param注解命名,则默认名为list -->
        <if test="list!=null and list.size()>0">
            <foreach collection="list" item="id" open="and id in (" close=")" se>
                #{id}
            </foreach>
        </if>
    </where>
</select>
  • <sql><include>标签可以抽取重复的sql语句再引用
<!-- 定义sql -->
<sql id="sql标识">
    select * from 表名
</sql>
<!-- 引用 -->
<include refid="sql标识"></include>

2.3 其它标签

  • <typeAliases><package>:在<typeAliases>中可通过<typeAlias>为全限定类名起别名,也可通过<package>为某个包中的实体类全部起别名,<package>也可用于在<mappers>中指定所有映射配置文件所在的包
  • <properties>:在主配置文件中使用该标签,通过resource属性指定配置文件位置,然后可以使用"${配置文件中的key名}"取值

2.4 连接查询

实际工作用的不多,简单了解

  • 一对一:在<resultMap>中使用<association>进行配置,一般使用立即加载
  • 一对多:在<resultMap>中使用<collection>进行配置,一般使用延迟加载
  • 多对多:借助中间表,然后同一对多使用<collection>,一般使用延迟加载

3 Mybatis缓存

暂不展开

  • 一级缓存:SqlSession级别的缓存(默认)
  • 二级缓存:SqlSessionFactory级别的缓存

4 注解配置

简单了解

  • 无需编写每个接口的xml映射配置文件
  • 在主配置文件中的<mapper>标签中使用class属性(代替resource属性)指明接口全限定名