1 搭建流程
- 创建maven工程,引入mybatis和mysql依赖
- 创建数据表与对应的实体类
- 创建操作数据表对应的Mapper接口
- 编写接口对应的xml映射配置文件
<mapper namespace="Mapper接口全限定名">
<select id="对应的Mapper接口中的方法名" parameterType="入参类型" resultType="结果集对应的实体类型">
select * from 表名 where 字段名=#{参数名}
</select>
</mapper>
这里的paramType可以使基本数据类型,也可以是对象(包括List、Map等),但这个参数不是必须的,因为接口中已经指明了形参类型
如果只有一个基本类型参数,在没有使用@Param取名的情况下,#{}中的参数名可以随便写;
如果有一个类类型的参数,#{}中的直接写该对象的属性;
如果入参为多个参数,有两种做法:
1、封装成Map或对象传递
2.在接口中使用@Param注解为参数取名,然后在xml的sql语句中通过#{}使用,不需要在xml中再指明parameterType
(不加@Param注解,无默认值)
- 创建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>
- 模糊查询有两种方式:
- 传参时加
%,使用like #{param}取值 - 传参时不加
%,使用like '%${value}%'取值 - 比较:第一种方式本质是?占位符,第二种是字符串拼接,推荐第一种
- 注意: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属性)指明接口全限定名