环境搭建
Employee对象与employee表(id int,name String,gender int,email String)
IEmpMapper接口和EmpMapper.xml文件
mybatis-config.xml配置文件和JUnit4.13-rc-2测试
HelloWorld
SqlSessionFactory
SqlSessionFactory:SqlSession的工厂,负责创建SqlSession对象
为了方便,定义一个SqlSessionFactory变量,用JUnit的@Before注解标注一个初始化方法,就不用每次都手动创建了。
1 | SqlSessionFactory sqlSessionFactory; |
2 | |
3 | //通过这个方法拿到从配置好的xml文件中拿到SqlSessionFactory |
4 | public void getSqlSessionFactory() throws IOException { |
5 | String resource="Mybatis-config.xml"; |
6 | InputStream in=Resources.getResourceAsStream(resource); |
7 | sqlSessionFactory= new SqlSessionFactoryBuilder().build(in); |
8 | } |
SqlSessionFactory的openSession()方法:获取和数据库的一次会话,相当于getConnection()拿到连接,返回一个SqlSession对象
1 | SqlSession ss=sqlSessionFactory.openSession(); |
SqlSession:Sql会话,代表和数据库的一次会话
获取接口实现
SqlSession的getMapper(xxx.class)方法:拿到接口的实现,这个实现是一个MyBatis创建的代理对象
接下来就可以调用方法了,测试结果完美
1 | IEmpMapper em=ss.getMapper(IEmpMapper.class); |
2 | Employee emp=em.getEmpById(1); |
3 | System.out.println(emp); |
注意:要记得关闭流
提交问题
有时候增删改可能遇到没有提交的问题,可以在调用openSession()方法的时候传一个参数true,就会变成自动提交。或者在最后手动调用ss.commit()提交
全局配置文件
各个子标签先后顺序一定不能乱。
properties标签
引入外部配置文件,resource属性表示从类路径下引用,url属性表示从磁盘或者网络路径。
1 | <properties resource="database.properties"/> |
settings标签(重要)
对MyBatis的一些设置,可以调整MyBatis运行时的行为。
1 | <settings> |
2 | <!-- 开启驼峰命名与下划线自定映射 --> |
3 | <setting name="mapUnderscoreToCamelCass" value="true"/> |
4 | </settings> |
对象如果有一个属性是empName,对应的表是emp_name,可以通过这个对应。
还有很多配置参见官方文档https://mybatis.org/mybatis-3/zh/configuration.html
typeAliases标签
typeAlias子标签:为常用的类型起别名,默认是类名,不区分大小写,可以用alias属性自定义别名
1 | <typeAliases> |
2 | <typeAlias type="com.study.bean.Employee"/> |
3 | </typeAliases> |
起了别名后,再mapper映射文件中就可以用别名代替全类名。
或者可以用package标签,批量起别名,默认类名
1 | <package name="com.study.bean"/> |
如果要在这个基础上自定义别名,就可以在类上用@Alias注解起别名
MyBatis已经为很多类型内置了别名
typeHandlers标签
类型处理器:以合适的形式将java属性类型和数据库类型相转换,比如String—varchar
通过这个标签,可以自定义类型处理器,了解即可
objectFactory标签
对象工厂,了解即可
plugins插件

environments标签
配置环境,里面的每一个environment子标签表示一个环境,通过default属性指定。
每一个environment都需要一个事务管理器transactionManager和一个数据源dataSource,type属性可以有UNPOOLED/POOLED/JNDI,也可以自定义,实现dataSource接口即可。
事务管理和数据源一般都用Spring管理,了解即可。
databaseIdProvider标签
用来考虑数据库一致性的。因为MySQL和Oracle的SQL语句有些不一样
其中的type属性是固定的DB_VENDOR
里面的property子标签的name属性是数据库标识(MySQL/Oracle/…),value是别名
可以将之前写的比如select语句重写一份,加上databaseId属性,值为数据库别名,当数据库为mysql时,执行mysql的那一句,为oracle时,执行oracle的那一句,都没有时,默认执行没写这个属性的那句。
mappers标签(重要)
注册写好的SQL映射文件
里面的mapper标签的三种属性:class,resource,url。
resource:类路径,url:磁盘/网络路径。
class:接口全类名(XML文件要和接口同目录并且名字一样,这就很不爽)
可以用注解版MyBatis:不写配置文件,直接在接口方法上标注@Select等注解,在里面写SQL语句,然后扫描即可。不过有点耦合,并且不利于写复杂SQL语句。所以简单语句标注解,复杂写XML。
批量注册:package标签,name属性写包名,就可以批量注册那个包下的了。这样只有注解版才能注册成功,要想XML配置文件也成功,可以在resource文件夹下创建和接口同名的包,把XML文件放进去,表面上不在一起,但在编译时,java和resource会合并,就到一起去了。
使用包扫描时,接口和XML文件同名
SQL映射文件
可用标签
select/update/insert/delete
属性

获取自增主键封装到对象
1 | <insert id="insertEmp" useGeneratedKeys="true" keyProperty="id"> |
2 | insert into employee(name,gender,email) values (#{name},#{gender},#{email}) |
3 | </insert> |
当数据库不支持自增主键时,使用selectKy子标签,先执行一个SQL查到id+1,再赋值
1 | <selectKey order="BEFORE" resultType="Integer" keyProperty="id"> |
2 | select max(id)+1 from employee |
3 | </selectKey> |
parameterMap
原本是复杂参数映射,废弃了
resultMap
参考下面自定义结果集
SQL
抽取可重用SQL,然后在增删改查语句里用include插入即可
1 | <sql id="selectStu">select * from student</sql> |
2 | <select id="xxx" resultMap="test"> |
3 | <include refid="selectStu"></include>where id=#{id} |
4 | </select> |
cache/cache-ref
缓存相关
传参分析
单参数
如果是基本类型,取值#{}里随便写都行,它就取你传入的那个。
多参数
取值#{}里写对了都不行,它不认识。因为MyBatis会将参数自动封装在一个map中,Key是参数的索引,value是参数值。觉得不爽可以自定义key,在接口方法用@Param(“id”)注解标在参数前面,这样就可以用id表示参数了。
Map
将多个参数作为value装入map传进去也是可以的,#{}里用map的key取到value就行
对象
取值直接用#{属性名}就能取到了。
注意:#{}里还可以添加别的东西,比如jdbcType等等,一般最多就写个jdbcType,遇到传的是null时,mysql知道,但oracle不知道null是什么类型,这时候指定一下就行。
取值方式
#{}:使用的是参数预编译的方式,是后面设置进去的,不会出现SQL注入。
${}:直接拼在SQL语句,高危。
SQL语句有些位置是不支持预编译的,如果表名也想用动态的,那就只能通过${}取到,还有order by等等。
返回类型
List
返回类型写集合里元素类型,MyBatis会自动封装成对象添加进List。
Map
如果是查询单条记录,则会把字段名做Key,值做value
如果是多条数据,则key是主键,value是封装好的对象
要使用@MapKey(“id”)注解,作为封装好的map的key,返回类型写元素类型
自动封装
默认封装
列名和属性名一一对应(不区分大小写)
驼峰命名法与下划线对应(empName–emp_name)
都不对应,sql语句起别名对应属性名
自定义结果集
resultMap标签
type属性指定为哪个bean对象自定义封装规则
id子标签:指定主键列对应规则,result子标签,指定普通列对应规则
1 | <resultMap type="xxx.Employee" id="myEmpMap"> |
2 | <id colume="id" property="id"/> |
3 | <!--colume指定为哪一列配置规则,property指定哪个属性对应这个列--> |
4 | <result colume="cName" property="name"/> |
5 | </resultMap> |
6 | <!--用resultMap指定id就可以实现自定义封装--> |
7 | <select id="test" resultMap="myEmpMap"> |
8 | ... |
9 | </select> |
总结
头发-1