0%

MyBatis买拜体斯

环境搭建

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
@Before//通过这个方法拿到从配置好的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