MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。
注:讲解写在代码里了
配置文件
<?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>
<typeAliases>
<package name="com.cztcode.mybatis"/>
<!--在包中寻找所需的类,Mapper中不用写全称-->
</typeAliases>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<!-- mysql的驱动,这里注意JDK1.6以上使用cj版本的驱动-->
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<!-- schema_person是模式名,cj版本的驱动必须提前设置好时区-->
<property name="url" value="jdbc:mysql://localhost:3306/schema_person?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC"/>
<property name="username" value="root"/>
<property name="password" value="1qazxsw2"/>
</dataSource>
</environment>
</environments>
<!-- 在mapper文件中寻找语句映射-->
<mappers>
<mapper resource="PersonMapper.xml"/>
</mappers>
</configuration>
这里定义一下对象类包的别名
<typeAliases>
<package name="com.cztcode.mybatis"/>
<!--在包中寻找所需的类,Mapper中不用写全称-->
</typeAliases>
这里映射文件是PersonMapper.xml,与配置文件在同一目录下。注意如果是IDEA放在recourses文件夹下
项目结构
PersonMapper.xml配置
MyBatis有自动映射的功能,会获取结果中返回的列名并在 Java 类中查找相同名字的属性(忽略大小写)。 这意味着如果发现了 ID 列和 id 属性,MyBatis 会将列 ID 的值赋给 id 属性。但也可以手动映射。
手动映射:
比如,我们有一个User
类:
@Data
public class User {
private String id;
private String username;
private String password;
private String address;
private String email;
}
如果数据库中表的字段与User
类的属性名称一致,我们就可以使用resultType
来返回。
<select id="getUsers" resultType="User">
SELECT
u.id,
u.username,
u.password,
u.address,
u.email
FROM
USER u
</select>
当然,这是理想状态下,属性和字段名都完全一致的情况。但事实上,不一致的情况是有的,这时候我们的resultMap
就要登场了。
如果User
类保持不变,但SQL
语句发生了变化,将id
改成了uid
。
<select id="getUsers" resultType="User">
SELECT
u.id as uid,
u.username,
u.password,
u.address,
u.email
FROM
USER u
</select>
那么,在结果集中,我们将会丢失id
数据。这时候我们就可以定义一个resultMap
,来映射不一样的字段。
<resultMap id="getUserByIdMap" type="User">
<result property="id" column="uid"></result>
</resultMap>
然后,我们把上面的select
语句中的resultType
修改为resultMap="getUserByIdMap"
。
这里面column
对应的是数据库的列名或别名;property
对应的是结果集的字段或属性。
定义Mapper接口类
这种方式和用全限定名调用 Java 对象的方法类似。这样,该命名就可以直接映射到在命名空间中同名的映射器类,并将已映射的 select 语句匹配到对应名称、参数和返回类型的方法。不费吹灰之力地在对应的映射器接口调用方法。
使用Mapper接口映射有很多优势,首先它不依赖于字符串字面值,会更安全一点;其次,如果IDEA插件有代码补全功能,那么代码补全可以帮你快速选择到映射好的 SQL 语句。
正确的顺序为,先写出Mapper的接口类。通过插件自动生成xml文件,超级方便!除此之外还可以实现快速跳转。
调用映射接口实现数据库查询
生成一个mapper,这里使用Reader读取字符文件或者InPutStream读取字节文件都可以,毕竟xml文件是一个文本文件。
我们需要得到一个session(事务),通过事务的提交来完成数据库的更改。
数据库信息
在数据库里先定义两条信息
用动态代理的方式很方便,直接使用mapper.方法 即可实现对数据库的操作
通过ID查询Person
就两句话
Person person=mapper.queryPersonById(1);
System.out.println(person.toString());
输出结果
不要忘记我们之前定义的查询语句
是不是很简洁!!
查询全部Person
这里需要注意,返回值都是单个对象。如果查询到多个结果需要保存在List中。但是ResultType还是单个对象(数据库表名也是Person)
接口返回值是List类型
查询方式和结果
添加对象
不要忘记commit
执行结果
注意的问题
如果mybatis字段和mysql关键字冲突,在mybatis中操作时需要加上反引号-就是键盘Esc键下面的的那个。
mybatis的parameterType可以不写
不但是可以不写,而且不推荐写(虽然上面的例子里我写了)。
为什么不写parameterType也可以运行成功? 因为mybatis能自动识别,但返回值类型不能不写,插件自动生成的xml文件也不包括parameterType。
MyBatis传入多个参数
Mybatis是可以传入多个参数的,这里我使用@param注解的方式。可以由IDEA自动生成。注意要是传入多个参数必须添加注解,否则mybatis会报错。
传入两个参数
xml文件