MyBatis3-01 初识Mybatis

39 阅读5分钟

MyBatis介绍及快速搭建

MyBatis的配置文件详解

MyBatis基于XML的详细使用 输入参数 输出结果处理 高级应用 动态SQL 一、二级缓存 逆向工程 分页插件

SSM框架整合

MyBatis-plus的使用 对MyBatis的增强

JDBC(Java Database Connection) 用于执行SQL语句的Java API.

MyBatis 底层是对JDBC基础上进行的封装 (建议看下MyBatis 源码)

========================================== JDBC 核心API

1、DriverManager 链接数据库

2、Connection 连接数据库的抽象

3、Statment 执行SQL

4、ResultSet 数据结果集

运行快捷高效 代码量大 繁琐异常处理 不支跨平台

========================================

DBUtils

Apache开发的工具类 简化了JDBC操作 少写代码 工具类

==========================================


数据库操作框架 持久化映射框架 ORM(object relational mapping) 对象关系映射

Hibernate 是对ORM贯彻最彻底的框架 只要声明好 javabean 维护xml 能够自动建好表 code first

操作数据库使用对象方式不用SQL语句

跨数据库平台

缺点:优化SQL 复杂业务复杂的SQL使用门槛高

======================================== JDBCTemplate
内嵌到Spring框架中 支持AOP 缺点:必须与Spring框架一起使用 不支持数据库跨平台 默认没有缓存。

=================================

什么是MyBatis?

Mybatis是操作数据库的 是一款优秀的持久层框架 半自动的ORM 。
它支持自定义SQL 存储过程以及高级映射。
MyBatis免除了几乎所有的JDBC代码以及设置参数和获取结果集工作。
MyBatis可以通过配置简单的XML注解来配置和映射原始类型表、接口和Java POJO(Plain Old Java Objects 普通老式Java对象)为数据库中的记录。

优点:
1、与JDBC相比 减少了50%的代码量
2、最简单的持久化框架 简单易学
3、SQL代码从程序代码中彻底分离出来 可以重用。
4、提供XML标签 支持编写动态SQL
5、提供映射标签 支持对象与数据库的ORM字段关系映射

支持缓存 连接池 数据库移植。。。

缺点:
1、SQL语句编写工作量大 熟练度要高 2、数据库移植性比较差 如果需要切换数据库的话 SQL语句会有很大的差异

官网:mybatis.org/mybatis-3/

github.com/mybatis/myb…

---------------------

MyBatis使用

1、添加pom依赖(mybatis核心jar和数据库版本对应版本的驱动jar包)
2、新建数据库和表
3、添加mybatis全局配置文件
4、修改全局配置文件中数据源配置信息
5、添加数据库表对应的pojo对象(相当于我们以前的实体类)
6、添加对应的pojoMapper.xml(里面维护了所有的sql)
修改namespace :如果是satementID 没有特殊的要求
如果是接口绑定方式必须等于接口的完整限定名

7、修改mybatis全局配置文件 修改Mapper

1、pom.xml加载MyBatis

<!--MyBatis核心依赖-->
<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
<dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis</artifactId>
    <version>3.5.11</version>
</dependency>

<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.32</version>
</dependency>

MySQL 连接器 APIs 与 Java 对应版本 dev.mysql.com/doc/index-c…

dev.mysql.com/doc/connect…

image.png

2、设置MyBatis配置文件

可以利用Intellj提供的database工具生成url 可以通过mysql-connect-java找驱动名字

这个POJO后面讲 image.png

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "https://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
<!--                <property name="driver" value="${driver}"/>-->
                <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<!--                <property name="url" value="${url}"/>-->
                <property name="url" value="jdbc:mysql://localhost:3306/emp"/>


<!--                <property name="username" value="${username}"/>-->

                <property name="username" value="root"/>
<!--                <property name="password" value="${password}"/>-->
                <property name="password" value="root"/>

            </dataSource>
        </environment>
    </environments>
    <mappers>
        <mapper resource="org/mybatis/example/BlogMapper.xml"/>
    </mappers>
</configuration>

mapper 就是存储SQL的文件 通常一个实体类 对应一个Mapper 对应一张表

3、创建实体类

package com.kdy.pojo;

public class Emp {
    private  Integer id;

    private String username;


    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    @Override
    public String toString() {
        return "Emp{" +
                "id=" + id +
                ", username='" + username + ''' +
                '}';
    }
}

4、 创建Mapper

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.kdy.pojo.EmpMapper">

    <select id="selectEmp" resultType="com.kdy.pojo.Emp">
        select * from Emp where id = #{id}
    </select>


</mapper>

5、修改MyBatis配置文件的Mapper


    <mappers>
        <mapper resource="EmpMapper.xml"/>
    </mappers>
 

6、使用

MyBatis 3版本之前叫 iBatis

//基于StatementId 的方式去执行SQL

    @Test
    public void test01() throws IOException {
//        String resource = "org/mybatis/example/mybatis-config.xml";
//        InputStream inputStream = Resources.getResourceAsStream(resource);
//        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        //从XML中构建 SqlSessionFactory
        InputStream inputStream = Resources.getResourceAsStream("mybatis.xml");
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

        SqlSession sqlSession = sqlSessionFactory.openSession();

        //mapper中 namespace="com.kdy.pojo.EmpMapper" +    <select id="selectEmp"
        // namespace + id
        Emp emp = (Emp)sqlSession.selectOne("com.kdy.pojo.EmpMapper.selectEmp",1);
        System.out.println(emp);

    }

基于接口绑定的方式

1、新建数据访问层的接口:pojoMapper
2、添加mapper中对应的操作方法
2.1 方法名要和mapper中对应的操作的节点处的id要一致
2.2 返回类型要和mapper中对应的操作的节点的resultType要一致
2.3 mapper中对应的操作的节点的参数必须要在方法的参数中声明

3、Mapper.xml 中的namespace 必须要和接口的完整限定名一致 4、修改mybatis全局配置文件中的mappers 采用接口绑定的方式

<mapper class="com.kdy.mapper.EnpMapper"></mapper>

1、新建数据访问层接口

package com.kdy.mapper;

import com.kdy.pojo.Emp;

public interface EmpMapper {
//    根据id 查询Emp实体
    //方法名 和 mapper文件中id一致
    public Emp selectEmp(Integer id);
}

2、修改添加map中对应的操作方法

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--<mapper namespace="com.kdy.pojo.EmpMapper">-->
<mapper namespace="com.kdy.mapper.EmpMapper">
    <select id="selectEmp" resultType="com.kdy.pojo.Emp">
        select * from Emp where id = #{id}
    </select>


</mapper>

3、修改mybatis 中 mapper配置文件 class

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "https://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
<!--                <property name="driver" value="${driver}"/>-->
                <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<!--                <property name="url" value="${url}"/>-->
                <property name="url" value="jdbc:mysql://localhost:3306/mybatis"/>


<!--                <property name="username" value="${username}"/>-->

                <property name="username" value="root"/>
<!--                <property name="password" value="${password}"/>-->
                <property name="password" value="root"/>

            </dataSource>
        </environment>
    </environments>
    <mappers>
<!--        <mapper resource="EmpMapper.xml"/>-->
        <mapper class="com.kdy.mapper.EmpMapper"></mapper>
    </mappers>
</configuration>

4、注意 POJOMapper的 xml文件 和 接口文件在一个目录

image.png

编译后是在一个目录的

image.png

5、调用

    SqlSessionFactory sqlSessionFactory;
    @Before
    public void before() throws IOException {
        InputStream inputStream = Resources.getResourceAsStream("mybatis.xml");
        sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

    }

        //基于statementID 的方式 去执行SQL
    @Test
    public void test01() throws IOException {
//        String resource = "org/mybatis/example/mybatis-config.xml";
//        InputStream inputStream = Resources.getResourceAsStream(resource);
//        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        //从XML中构建 SqlSessionFactory

        SqlSession sqlSession = sqlSessionFactory.openSession();

        //mapper中 namespace="com.kdy.pojo.EmpMapper" +    <select id="selectEmp"
        // namespace + id
        Emp emp = (Emp)sqlSession.selectOne("com.kdy.pojo.EmpMapper.selectEmp",1);
        System.out.println(emp);

    }
    //基于接口绑定的方式
    @Test
    public void test02(){
        SqlSession sqlSession = sqlSessionFactory.openSession();
        EmpMapper mapper = sqlSession.getMapper(EmpMapper.class);
        Emp emp = mapper.selectEmp(1);
        System.out.println(emp);


    }

使用注解方式

package com.kdy.mapper;

import com.kdy.pojo.Emp;
import org.apache.ibatis.annotations.Select;

public interface EmpMapper {

//    根据id 查询Emp实体
    //方法名 和 mapper文件中id一致
    @Select("select * from emp where id=#{id}")
    public Emp selectEmp(Integer id);
}

使用注解方式 EmpMapper.xml 去掉 不用建

注解方式 sql和代码没有分离 复杂的sql有难度


XML方式实现简单的增删改查

1、XML实现相应语句

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--<mapper namespace="com.kdy.pojo.EmpMapper">-->
<mapper namespace="com.kdy.mapper.EmpMapper">
    <select id="selectEmp" resultType="com.kdy.pojo.Emp">
        select * from Emp where id = #{id}
    </select>

    <insert id="insertEmp">
       insert into `emp`(`username`) values(#{username})
    </insert>

    <update id="updateEmp">
        update `emp` set username=#{username} where id=#{id}
    </update>

    <delete id="deleteEmp">
        delete from  `emp` where id=#{id}
    </delete>

</mapper>

2、写入接口方法

package com.kdy.mapper;

import com.kdy.pojo.Emp;
import org.apache.ibatis.annotations.Select;

public interface EmpMapper {

//    根据id 查询Emp实体
    //方法名 和 mapper文件中id一致
   // @Select("select * from emp where id=#{id}")
    public Emp selectEmp(Integer id);
    public Integer insertEmp(Emp emp);

    public Integer updateEmp(Emp emp);

    public Integer deleteEmp(Integer id);

}

3、调用测试

package com.kdy.test;
import com.kdy.mapper.EmpMapper;
import com.kdy.pojo.Emp;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Before;
import org.junit.Test;

import javax.annotation.Resource;
import java.io.IOException;
import java.io.InputStream;

public class MybatisCURD {
    SqlSessionFactory sessionFactory;
    @Before
    public void before() throws IOException {
        InputStream inputStream = Resources.getResourceAsStream("mybatis.xml");
        sessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

    }
    @Test
    public void select(){
        SqlSession sqlSession = sessionFactory.openSession();
        EmpMapper mapper = sqlSession.getMapper(EmpMapper.class);
        Emp emp = mapper.selectEmp(1);
        System.out.println(emp);



    }
    @Test
    public void add(){
        SqlSession sqlSession = sessionFactory.openSession();
        EmpMapper mapper = sqlSession.getMapper(EmpMapper.class);
        Emp emp = new Emp();
        emp.setUsername("测试名");
        Integer integer = mapper.insertEmp(emp);
        sqlSession.commit();
        System.out.println(integer);

    }
    @Test
    public void add01(){
        //SqlSession sqlSession = sessionFactory.openSession(1);  开启自动提交
        SqlSession sqlSession = sessionFactory.openSession();

        EmpMapper mapper = sqlSession.getMapper(EmpMapper.class);
        Emp emp = new Emp();
        emp.setUsername("自动提交");
        try {
            Integer integer = mapper.insertEmp(emp);
            System.out.println(integer);

        }catch (Exception ex){
            sqlSession.rollback();
        }finally {
            sqlSession.close();
        }

    }
    @Test
    public void update(){
        SqlSession sqlSession = sessionFactory.openSession();
        EmpMapper mapper = sqlSession.getMapper(EmpMapper.class);
        Emp emp = new Emp();
        emp.setId(5);
        emp.setUsername("王二麻子");
        mapper.updateEmp(emp);
        sqlSession.commit();
    }


    @Test
    public void  delete(){
        SqlSession sqlSession = sessionFactory.openSession();
        EmpMapper mapper = sqlSession.getMapper(EmpMapper.class);
        mapper.deleteEmp(5);
        sqlSession.commit();
    }

}