一、在pom.xml文件中导入依赖
1、mybatis
2、mysql-connector-java
3、junit:单元测试
<dependencies>
<dependency>
<!--mybatis依赖-->
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.5</version>
</dependency>
<dependency>
<!--mysql驱动依赖-->
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.11</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.2</version>
<scope>test</scope>
</dependency>
</dependencies>
二、创建Mybatis核心配置文件
注:transaction n.事务
transactionManager n.事务管理器
MyBatis核心配置文件的名字由自己命名,这里命名为mybatis-config.xml,文件内容如下:
<?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.liu.pojo"/>
</typeAliases>
<!--environments:可以配置多个environment,例如development,test,通过default属性切换不同的environment。-->
<environments default="development">
<!--environment:配置数据库连接信息-->
<environment id="development">
<!-- transactionManager:默认JDBC -->
<transactionManager type="JDBC"/>
<!-- dataSource:使用连接池,并加载mysql驱动连接数据库 -->
<dataSource type="POOLED">
<!--数据库连接信息-->
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql:///db2?useSSL=false"/>
<property name="username" value="root"/>
<property name="password" value="liu200328"/>
</dataSource>
</environment>
<environment id="test">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql:///mybatis?useSSL=false"/>
<property name="username" value="root"/>
<property name="password" value="1234"/>
</dataSource>
</environment>
</environments>
<mappers>
<!--mapper:指定sql映射文件-->
<mapper resource="mapper/UserMapper.xml"/>
</mappers>
</configuration>
关于配置文件的每一个属性详解,可以在官方文档中看到:配置_MyBatis中文网
下面来介绍一下上面用的到的几个属性:
1、typeAliases(类型别名)
(1)给一个全限定类名配置别名
因为java类的全限定类名太长了,我们希望有一个简称来指代它,这个功能仅用于 XML 配置。
例如下面这个例子,这样配置完成之后,在任何需要使用com.liu.mapper.User的地方,直接使用别名User即可。
<typeAliases>
<typeAlias alias="User" type="com.liu.mapper.User"/>
</typeAliases>
(2)如何快速给很多java类的全限定类名起别名?
可以指定一个包名,会为包中的每一个类提供一个类首字母小写的别名, 比如com.liu.mapper.User默认别名为user,MyBatis会在包名下面扫描需要的类,代码如下:
<typeAliases>
<package name="com.liu.mapper"/>
</typeAliases>
2、配置数据库连接环境信息
(1)environments:可以配置多个environment,例如development,test,通过default属性切换不同的environment。
(2)environment:配置数据库连接信息。
(3)transactionManager:事务管理器,默认JDBC。
(4)dataSource:使用连接池,并加载mysql驱动连接数据库。
3、指定sql映射文件的位置
(1)使用相对于类路径的资源引用
<mappers>
<mapper resource="com/liu/mapper/UserMapper.xml"/>
</mappers>
(2)使用完全限定资源定位符(URL)
固定格式:file:///+绝对路径
<mappers>
<mapper url="file:///D:\JavaWorkspace\Login_Register\src\main\resources\com\liu\mapper\UserMapper.xml"/>
</mappers>
(3)使用映射器接口实现类的完全限定类名
<mappers>
<mapper class="com.liu.mapper.UserMapper.xml"/>
</mappers>
(4)通过package引入映射文件
当需要引入的映射文件很多时,一个个引入很麻烦,通过包一下引入全部的映射文件,当需要哪个时通过包扫描便可以找到。
<mappers>
<mapper package="com.liu.mapper"/>
</mappers>
三、创建sql映射文件
元素名称 | 描述 | 备注 |
---|---|---|
mapper | 映射文件的根节点,只有 namescape 一个属性 | namescape 作用如下:①用于区分不同的 mapper,全局唯一②绑定DAO接口,即面向接口编程。当 namescape 绑定某一接口后,可以不用写该接口的实现类,MyBatis 会通过接口的完整限定名查找到对应的 mapper 配置来执行 SQL 语句。因此 namescape 的命名必须要跟接口同名。 |
select | 查询语句,最常用、最复杂的元素之一 | 可以自定义参数,返回结果集等 |
insert | 插入语句 | 执行后返回一个整数,代表插入的条数 |
update | 更新语句 | 执行后返回一个整数,代表更新的条数 |
delete | 删除语句 | 执行后返回一个整数,代表删除的条数 |
sql | 允许定义一部分的 SQL,然后在各个地方引用它 | 例如,一张表列名,我们可以一次定义,在多个 SQL 语句中使用 |
resultMap | 用来描述数据库结果集与对象的对应关系,它是最复杂、最强大的元素 | 提供映射规则 |
cache | 配置给定命名空间的缓存 | - |
cache-ref | 其它命名空间缓存配置的引用 | - |
parameterMap | 定义参数映射关系 | 即将被删除的元素,不建议使用 |
<?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">
<mapper namespace="com.liu.mapper.UserMapper">
<select id="selectUser" resultType="user">
select *
from tb_user
where username = #{username} and password = #{password}
</select>
</mapper>
(1)namespace的为接口的全限定名称。
(2)<select> 元素表明这是一条查询语句,属性 id是这条 SQL语句的唯一标识。resultType表示返回的是一个User类的值,这里给的值是user是因为步骤二1中起的别名。
(3)参数符号#{}和${}
#{} 告诉 MyBatis 创建一个预编译语句(PreparedStatement)参数,在 JDBC 中,这样的一个参数在 SQL 中会由一个 “ ? ” 来标识,并被传递到一个新的预编译语句中,就像这样:
// 近似的 JDBC 代码,非 MyBatis 代码...
String selectUser = " select * from t_user where id = ? ";
PreparedStatement ps = conn.prepareStatement(selectUser);
ps.setInt(1,id);
#{} 作为占位符,${} 作为替换符,两者没有孰轻孰重,只不过应用场景不同,适当取舍即可。
我们希望完成类似 JDBC 中的 PrepareStatement 预编译处理 ,可以使用 #{} ,它会在替换占位符时首尾添加上单引号 '' ,能有效防止 SQL 注入 风险。
四、定义与映射文件同名的接口
(1)sql映射文件与同名接口在同一目录下:
接口文件放在java目录下的com.liu.mapper包下,这里创建包以.分割:
sql映射文件放在resource目录下的com.liu.mapper包下,这里创建包以/分割:
Note:"." in the name is treated as a regular character.Use!"instead if you mean to create nested directories
(2)在接口中定义了与xml映射文件select语句的属性id同名的接口方法,注意是否需要传参。
public interface UserMapper {
User selectUser(@Param("username") String username, @Param("password")String password);
}
五、使用
//加载mybatis核心配置文件
InputStream resourceAsStream = Resources.getResourceAsStream("mybatis-config.xml");
SqlSessionFactory build = new SqlSessionFactoryBuilder().build(resourceAsStream);
SqlSession sqlSession = build.openSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
User user = mapper.selectUser(username, password);