MyBatis是一款基于ORM的持久层框架。

快速上手使用的方法

案例: 通过mybatis查询数据库user表的所有记录,封装到User对象中,打印到控制台上

步骤:

  1. 创建数据库及user表
  2. 创建maven工程,导入依赖(MySQL驱动、mybatis、junit)
  3. 编写User实体类
  4. 编写UserMapper.xml映射配置文件(ORM思想)
  5. 编写SqlMapConfig.xml核心配置文件
    数据库环境配置
    映射关系配置的引入(引入映射配置文件的路径)
  6. 编写测试代码
    // 1.加载核心配置文件
    // 2.获取sqlSessionFactory工厂对象
    // 3.获取sqlSession会话对象
    // 4.执行sql
    // 5.打印结果
    // 6.释放资源

创建表

  1. CREATE DATABASE `mybatis_db`;
  2. USE `mybatis_db`;
  3. CREATE TABLE `user` (
  4. `id` int(11) NOT NULL auto_increment,
  5. `username` varchar(32) NOT NULL COMMENT '用户名称',
  6. `birthday` datetime default NULL COMMENT '生日',
  7. `sex` char(1) default NULL COMMENT '性别',
  8. `address` varchar(256) default NULL COMMENT '地址',
  9. PRIMARY KEY (`id`)
  10. ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
  11. -- insert....
  12. insert into `user`(`id`,`username`,`birthday`,`sex`,`address`) values (1,'张三','2020-11-11 00:00:00','男','北京海淀'),(2,'李四','2020-12-12 00:00:00','男','北京海淀');

导入依赖(MyBatis相关的)

  1. <!--指定编码和版本-->
  2. <properties>
  3. <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  4. <maven.compiler.encoding>UTF-8</maven.compiler.encoding>
  5. <java.version>1.11</java.version>
  6. <maven.compiler.source>1.11</maven.compiler.source>
  7. <maven.compiler.target>1.11</maven.compiler.target>
  8. </properties>
  9. <!--mybatis坐标-->
  10. <dependency>
  11. <groupId>org.mybatis</groupId>
  12. <artifactId>mybatis</artifactId>
  13. <version>3.5.4</version>
  14. </dependency>
  15. <!--mysql驱动坐标-->
  16. <dependency>
  17. <groupId>mysql</groupId>
  18. <artifactId>mysql-connector-java</artifactId>
  19. <version>5.1.6</version>
  20. <scope>runtime</scope>
  21. </dependency>
  22. <!--单元测试坐标-->
  23. <dependency>
  24. <groupId>junit</groupId>
  25. <artifactId>junit</artifactId>
  26. <version>4.12</version>
  27. <scope>test</scope>
  28. </dependency>

编写实体类

  1. public class User {
  2. private Integer id;
  3. private String username;
  4. private Date birthday;
  5. private String sex;
  6. private String address;
  7. // getter/setter 略
  8. }

编写UserMapper映射文件

  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE mapper
  3. PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  4. "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  5. <mapper namespace="UserMapper">
  6. <!--查询所有-->
  7. <select id="findAll" resultType="com.lagou.domain.User">
  8. select * from user
  9. </select>
  10. </mapper>

编写MyBatis核心文件

  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE configuration
  3. PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
  4. "http://mybatis.org/dtd/mybatis-3-config.dtd">
  5. <configuration>
  6. <!--环境配置-->
  7. <environments default="mysql">
  8. <!--使用MySQL环境-->
  9. <environment id="mysql">
  10. <!--使用JDBC类型事务管理器-->
  11. <transactionManager type="JDBC"></transactionManager>
  12. <!--使用连接池-->
  13. <dataSource type="POOLED">
  14. <property name="driver" value="com.mysql.jdbc.Driver">
  15. </property>
  16. <property name="url" value="jdbc:mysql:///mybatis_db">
  17. </property>
  18. <property name="username" value="root"></property>
  19. <property name="password" value="root"></property>
  20. </dataSource>
  21. </environment>
  22. </environments>
  23. <!--加载映射配置-->
  24. <mappers>
  25. <mapper resource="com/lagou/mapper/UserMapper.xml"></mapper>
  26. </mappers>
  27. </configuration>

编写测试类

  1. @Test
  2. public void testFindAll() throws Exception {
  3. // 加载核心配置文件
  4. InputStream is = Resources.getResourceAsStream("SqlMapConfig.xml");
  5. // 获取SqlSessionFactory工厂对象
  6. SqlSessionFactory sqlSessionFactory = new
  7. SqlSessionFactoryBuilder().build(is);
  8. // 获取SqlSession会话对象
  9. SqlSession sqlSession = sqlSessionFactory.openSession();
  10. // 执行sql
  11. List<User> list = sqlSession.selectList("UserMapper.findAll");
  12. for (User user : list) {
  13. System.out.println(user);
  14. }
  15. // 释放资源
  16. sqlSession.close();
  17. }

映射配置文件解释说明

image.png

CUD的映射文件写法

  1. <!--新增-->
  2. <insert id="save" parameterType="com.lagou.domain.User">
  3. insert into user(username,birthday,sex,address)
  4. values(#{username},#{birthday},#{sex},#{address})
  5. </insert>
  6. <update id="update" parameterType="com.lagou.domain.User">
  7. update user set username = #{username},birthday = #{birthday},
  8. sex = #{sex},address = #{address} where id = #{id}
  9. </update>
  10. <!-- 只有1个参数的话 大括号里面的东西可以随便写-->
  11. <delete id="delete" parameterType="java.lang.Integer">
  12. delete from user where id = #{id}
  13. </delete>

相应的java代码API

插入操作使用的API是sqlSession.insert(“命名空间.id”,实体对象);
插入操作涉及数据库数据变化,所以要使用sqlSession对象显示的提交事务,即 sqlSession.commit()
修改操作使用的API是sqlSession.update(“命名空间.id”,实体对象);
删除操作使用的API是sqlSession.delete(“命名空间.id”,Object);

核心配置文件解释

image.png
注意顺序也要按着这个来,你不能把mapper写到environment前面

environments

image.png

  1. 其中,事务管理器(transactionManager)类型有两种:
  • JDBC:
    这个配置就是直接使用了JDBC 的提交和回滚设置,它依赖于从数据源得到的连接来管理事务作用域。
  • MANAGED:
    这个配置几乎没做什么。它从来不提交或回滚一个连接,而是让容器来管理事务的整个生命周期。
    例如:mybatis与spring整合后,事务交给spring容器管理。
  1. 其中,数据源(dataSource)常用类型有三种:
  • UNPOOLED:

    1. 这个数据源的实现只是每次被请求时打开和关闭连接。
  • POOLED:
    这种数据源的实现利用“池”的概念将 JDBC 连接对象组织起来。

  • JNDI :
    这个数据源实现是为了能在如 EJB 或应用服务器这类容器中使用,容器可以集中或在外部配置数据
    源,然后放置一个 JNDI 上下文的数据源引用

properties

image.png

typealias

别名。基础类型和String已经默认起好名了。比如Integer变成int,String变成string

image.png

  1. <typeAliases>
  2. <!-- 单个起别名-->
  3. <!-- <typeAlias type="com.ning.entity.User" alias="User"></typeAlias>-->
  4. <!-- 别名就是类名,不区分大小写-->
  5. <package name="com.ning.entity"/>
  6. </typeAliases>

mappers

  1. <mappers>
  2. <!-- <mapper resource="com/ning/mapper/UserMapper.xml"></mapper>-->
  3. <!-- <mapper class="com.ning.mapper.UserMapper"></mapper>-->
  4. <package name="com.ning.mapper"/>
  5. </mappers>

其实最常用的就是package那种写法

MyBatis基本原理

image.png

MyBatis代理开发方式

要求:
Mapper.xml映射文件中的namespace与mapper接口的全限定名相同
Mapper接口方法名和Mapper.xml映射文件中定义的每个statement的id相同
Mapper接口方法的输入参数类型和mapper.xml映射文件中定义的每个sql的parameterType的类型相同
Mapper接口方法的输出参数类型和mapper.xml映射文件中定义的每个sql的resultType的类型相同

  1. public interface UserMapper {
  2. public List<User> findAll() throws Exception;
  3. }
  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE mapper
  3. PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  4. "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  5. <mapper namespace="com.lagou.mapper.UserMapper">
  6. <!--查询所有-->
  7. <select id="findAll" resultType="user">
  8. select * from user
  9. </select>
  10. </mapper>

配置好以后你只需要这样写代码
整合Spring可以更简单

  1. @Test
  2. public void testFindAll() throws Exception {
  3. // 加载核心配置文件
  4. InputStream is = Resources.getResourceAsStream("SqlMapConfig.xml");
  5. // 获得SqlSessionFactory工厂对象
  6. SqlSessionFactory sqlSessionFactory = new
  7. SqlSessionFactoryBuilder().build(is);
  8. // 获得SqlSession会话对象
  9. SqlSession sqlSession = sqlSessionFactory.openSession();
  10. // 获得Mapper代理对象
  11. UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
  12. // 执行查询
  13. List<User> list = userMapper.findAll();
  14. for (User user : list) {
  15. System.out.println(user);
  16. }
  17. // 释放资源
  18. sqlSession.close();
  19. }

对代理的说明

mapper类是JDK动态代理生成的。
对代理对象调用方法,其实起作用的是相对应的invoke。
而invoke底层调用的其实还是SQLSession,让它去调用对应的方法。