介绍
MyBatis为数据库框架 替代JDBC大量的重复代码
基本知识
原理
把数据库中的一行数据映射为一个java对象从而对对象进行操作
功能
提供重复部分代码的创建 Connection Statement ResulSet
执行sql语句
查询结果转为集合
提供关闭资源的能力
达到开发人员只需要编写sql语句即可的效果
步骤
1创建数据库对应操作表的实体类(映射)get set方法写入 toStirng方法重写
2创建总的mybatis的配置 位置 在resource文件夹下
<?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>
<!--default 默认 为不同连接池的选择 对应environment的id-->
<environments default="spacewhisper">
<environment id="spacewhisper">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/wyxyj?serverTimezone=GMT"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
</environments>
<mappers>
<!--mapper sql语句配置文件的注册-->
<mapper resource="com/persion/dao/MessageDao.xml"/>
</mappers>
</configuration>
3创建dao层接口 一个方法对应的一个sql执行语句(在xml配置中)
4创建dao层对应xml文件 一个接口类对应一个xml文件
<?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">
<!--namespace 对应接口类所在位置-->
<mapper namespace="com.persion.dao.MessageDao">
<!-- id为对应sql语句方法 resultType 表示返回的数据类型 -->
<select id="selectAll" resultType="com.persion.entity.Message">
select id from message order by id
</select>
</mapper>
前面例子为查询
更删改记得提交事物sqlSession.commit();
sqlsession
sqlsession下的方法即对应sql执行
而对象的获取是重复操作
// String config = "mybatis.xml";
// //读取配置文件
// InputStream in = Resources.getResourceAsStream(config);
// //SqlSessionFactory的创建 重量级对象
// SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
//
// SqlSessionFactory factory = builder.build(in);
// //获取sqlsession 其方法为多种数据库操作
// SqlSession sqlSession =factory.openSession();
可直接做成工具类
步骤(进阶 真正掌握)
动态代理
最初需要对dao接口的实现类对方法重写 调用完成sql查询入口操作
即使封装了重复代码但是依然存在
mybatis采用反射等机制 动态代理
实现前提
sql xml中<mapper namespace="dao.MessageDao">
namespace对应接口类名
sql语句id <select id="selectAll" resultType="entity.Message" >对应接口方法名
完成实现
MessageDao messageDao = sqlSession.getMapper(MessageDao.class);
messageDao.selectAll();
getmapper方法自动生成接口下的实现类 实现开发者直接调用方法就可
#和$
#{}占位符 实际参数代替 更安全迅速
${}非占位符 字符串拼接 不传参(有sql注入问题)
多个参数的传参
mybastis把java的基本数据类型和String都称为简单参数
1@Param(value = "mes")
注解起别名代替原有名称
传对象 sql中 #{}中属性名即可
(了解 认得就好)其中完整的为#{属性名,javaType=数据java在java中的类型,jdbc=数据在jdbc的类型}
(了解)方式3 按位传参#{arg0(第几个)}
(了解)方式4 hasmap传 通过key找
sql返回结果
简单数据类型 int。。。。
对象类型(类或者List集合)
(了解)paramecerType 指定传入的参数的数据类型,为一个属性 用于判别
自定义类的映射(不常用)
<resultMap id="getALl" type="entity.Message">//sql的id type 返回的类型
<id column="id" property="id"/>
<result column="to_user_id" property="toUserId"/>
<result column="from_user_id" property="fromUserId"/>
<result column="content" property="content"/>
<result column="state" property="state"/>
<result column="date" property="date"/>
</resultMap>
sql的resulttype改为resultmap为resultmap的id
sql查询返回可以是map但只能一条数据(了解)
返回列名和实体类不一样还可以给数据库类取别名
模糊查询两种方案
like {name}(推荐)
name =%dog%
like %{name}%
name =dog
动态sql
实际上就是sql评介 根据传入参数判断选择在sql中是否加入指定的sql片段
选择不同的sql
<if test=>text中为具体判断
<where> 为if服务 因为存在如果所有if都不成立导致were后无判别 语法错误
所以包含多个if 至少一个if成立则写入where
<foreach>
<foreach collection="传入的数据类型" open="开头的字符" close="结尾的字符" item="为取出值取名" separator="分隔符">
#{item的值}
</foreach>
复用代码片段
定义一段代码片段 使用时加入就好
定义
<sql id="唯一id"></sql>
使用
<include refid="对应id"/>
setting(了解)
只对部分介绍 完全看官方文档
<transactionManager type="JDBC"/> 提交,回滚事物的方式
JDBC 原生jdbc MANAGED spring下的容器
<dataSource type="POOLED">
POOLED 使用连接池(一般都是这个)
UPOOLED 不使用连接池
JNDI windows注册表
sql资源文件在mybatis中的注册 前面说过
<mappers>
<!--mapper sql语句配置文件的注册-->
<mapper resource="com/persion/dao/MessageDao.xml"/>
</mappers>
同时在mappers中可以转为使用包名则会扫描包下所有xml
<package name="dao"/>
条件 1 dao层接口和mapper文件要同一目录 2 同名
数据库连接属性单独放置
resources目录下创建properties文件
jdbc.driver=com.mysql.cj.jdbc.Driver
写入key=value格式
setting处的值例如
<property name="driver" value="${jdbc.driver}"/>
额外(mybatisxml配置文件下的一些设置)
日志
setting表示对mybatis的设置 以下为日志设置输出到控制台
<settings>
<setting name="logImpl" value="STDOUT_LOGGING"/>
</settings>
实体类映射转换
<settings>
<!-- 是否开启下划线和驼峰式的自动转换, http://www.mybatis.org/mybatis-3/zh/sqlmap-xml.html#Auto-mapping -->
<setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>
分页插件
PageHepler
支持多种数据库分页 当然包括mysql
使用
maven依赖
<!-- https://mvnrepository.com/artifact/com.github.pagehelper/pagehelper -->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>5.2.0</version>
</dependency>
mybatis配置文件设置
<plugins>
<plugin interceptor="com.github.pagehelper.PageInterceptor"/>
</plugins>
应用
执行处加入
PageHelper.startPage(int pageNum, int pageSize);
num 第几页 size尺寸
了解
别名
为类起别名 替代全限定名称
<typeAliases>
<typeAlias type="dao.MessageDao" alias="ao"/>
</typeAliases>
放包名 resulttype 就可以只放类名
<typeAliases>
<package name="entity"/>
</typeAliases>
只能替代resulttype
注意
1 resulttype和resultmap二选一
2 返回列名和实体类不一样还可以给数据库类取别名
3setting位置的配置需要按照一定的顺序 否则会出错提示
The content of element type "configuration" must match "(properties?,settings?,typeAliases?,typeHandlers?,objectFactory?,objectWrapperFactory?,reflectorFactory?,plugins?,environments?,databaseIdProvider?,mappers?)".
超级链接
mybatis官方有文档