一、Mybatis 配置
- XXXMapper 映射,一般是一个接口
- XXXMapper.xml Mybatis 封装了 jdbc 操作的配置文件,一般有各种增删改查的 sql 操作
1.maven 依赖
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.9</version>
</dependency>
2.数据库配置文件 db.properties
db.username=root
db.password=123
db.driver=com.mysql.cj.jdbc.Driver
db.url=jdbc:mysql:///db01?serverTimezone=Asia/Shanghai
3.mybatis-config.xml Mybatis 的全局配置文件
主要配置①与数据库的连接②配置 Mapper 的路径
- 推荐用 UserMapper 和 UserMapper.xml 文件放在一起,然后在 mybatis-config.xml 中用包扫描的方式和在 pom.xml 中用 build 标签来配置 Mapper 的方式
mybatis-config.xml 中
<configuration>
<properties resource="db.properties"/>
<environments default="dev">
<environment id="dev">
<transactionManager type="JDBC"></transactionManager>
<dataSource type="POOLED">
<property name="username" value="${db.username}"/>
<property name="password" value="${db.password}"/>
<property name="url" value="${db.url}"/>
<property name="driver" value="${db.driver}"/>
</dataSource>
</environment>
</environments>
<mappers>
<package name="com.ze.demo.mapper"/>
</mappers>
</configuration>
pom.xml中
<build>
<resources>
<resource>
<directory>src/main/resources</directory>
</resource>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.xml</include>
</includes>
</resource>
</resources>
</build>
全部代码演示
<?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>
<!--加载db.properties-->
<properties resource="db.properties"/>
<!--为自定义的类配置别名-->
<typeAliases>
<!--为 Book 类取一个别名 book-->
<!-- <typeAlias type="com.ze.demo.model.Book" alias="book"/>-->
<!--
为 model 包下的所有类取一个别名,默认情况下,别名就是类名首字母小写
-->
<package name="com.ze.demo.model"/>
</typeAliases>
<!--
environments 配置系统环境,environments 中有很多 environment,每一个 environment 代表一种环境,比如 prod、dev。通过 environments 中的 default 属性可以实现数据源的一键切换
-->
<environments default="dev">
<environment id="dev">
<transactionManager type="JDBC"></transactionManager>
<dataSource type="POOLED">
<!--配置数据库连接信息-->
<property name="username" value="${db.username}"/>
<property name="password" value="${db.password}"/>
<property name="url" value="${db.url}"/>
<property name="driver" value="${db.driver}"/>
</dataSource>
</environment>
</environments>
<!--
配置以下 mapper 文件
-->
<mappers>
<!--指定 Mapper 文件的位置-->
<!-- <mapper resource="com/ze/demo/dao/UserMapper.xml"/>-->
<!-- <mapper resource="com/ze/demo/dao/BookMapper.xml"/>-->
<!--直接指定所有 mapper 文件的位置-->
<!-- <package name="com.ze.demo.dao"/>-->
<!--
换一个思路去配置 mapper
这种方式是直接去配置接口,指定 mapper 接口。。框架找到接口之后,会自动去查找和接口同名的 xml 配置文件
-->
<mapper class="com.ze.demo.dao.BookMapper"/>
</mappers>
</configuration>
二、Mybatis 的工作流程(伪)
- 动态代理
- Mapper 接口
- Mapper.xml 配置文件
- 通过 sqlSession 来 getMapper (获取映射器)
- 此时通过动态代理生成了一个实现类
- 通过多态来调用 Mapper 的方法
- 增删改需要 sqlSession.commit(),查询不需要
1.Mapper 映射器接口,作用相当于 Dao (动态代理,可能是 JDK 生成的动态代理对象)
开发者只需要提供一个 BookMapper 接口,将来 MyBatis 通过动态代理为接口生成一个实现类,实现类的内容就类似于 UserDao
public interface BookMapper {
Book getBookById(Integer id);
Integer addBook(Book book);
Integer updateBook(Book book);
Integer deleteBookById(Integer id);
List<Book> getAllBooks();
}
2.Mapper.xml 映射器配置,在里面写具体的 sql 操作(包括映射)
重点
- 一张表的增删改查操作,位于一个 mapper 文件中。
- 所有的节点名字要唯一,确保唯一的方式:
- 各个 xxxMapper.xml 文件的 namespace 不一样,一般来说,namespace 可以取一个类名全路径
- 每一个 xxxMapper.xml 内部的节点 id 不一样
-
- id 是查询标签的唯一名字
- resultType 表示这个查询返回的数据类型
- parameterType 表示这个语句传入的数据类型
- #{id} 表示传入的参数
<?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.ze.demo.dao.BookMapper">
<select id="getBookById" resultType="book">
select * from book where id=#{id};
</select>
<insert id="addBook" parameterType="book">
insert into book (name,author) values (#{name},#{author});
</insert>
<update id="updateBook" parameterType="book">
update book set name = #{name},author=#{author} where id=#{id};
</update>
<!--
Integer ,系统提供一个别名,叫做 integer
-->
<delete id="deleteBookById" parameterType="integer">
delete from book where id=#{id}
</delete>
<select id="getAllBooks" resultType="book">
select * from book;
</select>
</mapper>
3.创建执行 sql 的对象 SqlSession
重点
- 通过 SqlSessionFactoryBuilder.build(Resources.getResourceAsStream(“mybatis-config.xml”)).openSession 创建 SqlSession 对象
- 通过 sqlSession.getMapper(BookMapper.class) 动态代理生成一个代理类
- 增删改需要 commit, sqlSession.commit();
public class MainDemo3 {
public static void main(String[] args) throws IOException {
//1. 构造 SqlSessionFactoryBuilder,SqlSessionFactoryBuilder 可以用来构造一个 SqlSessionFactory
SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
//2. 加载配置文件,获取一个 sqlSessionFactory
SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(Resources.getResourceAsStream("mybatis-config.xml"));
//3. 创建一个 SqlSession,这个类似于 JDBC 中的 Connection
SqlSession sqlSession = sqlSessionFactory.openSession();
BookMapper bookMapper = sqlSession.getMapper(BookMapper.class);
// Book b = bookMapper.getBookById(1);
// System.out.println("b = " + b);
Book b1 = new Book();
b1.setName("红楼梦1");
b1.setAuthor("曹雪芹1");
Integer i = bookMapper.addBook(b1);
//增删改需要 commit
sqlSession.commit();
// List<Book> list = bookMapper.getAllBooks();
// System.out.println("list = " + list);
// b1.setId(1);
// Integer i2 = bookMapper.updateBook(b1);
// sqlSession.commit();
// System.out.println("i2 = " + i2);
//com.ze.demo.dao.BookMapper.deleteBookById
// Integer i = bookMapper.deleteBookById(2);
// System.out.println("i = " + i);
// sqlSession.commit();
}
}