JAVAWEB-NOTE06-MyBatis

简介

官网:https://mybatis.org/mybatis-3/zh/index.html
什么是MyBatis?
它是一款优秀的持久层框架,用于简化JDBC开发
那什么是持久层?
JAVAEE有三层架构:表现层、业务层、持久层;而持久层就是复制将数据保存到数据库的那一层代码
那什么又是框架呢?
框架就是一套半成品的软件,它是一套可重复、通用的软件基础代码模型
在框架的基础之上构建软件编写更加地高效、规范、通用、可扩展
MyBatis历史发展简介?
MyBatis本是Apache的一个开源项目iBatis, 2010年这个项目由apache software
foundation迁移到了google code,并且改名为MyBatis。2013年11月迁移到Github

快速入门

需求:
查询user_info表中的所有数据

第一步:创建木块,导入坐标
mybatis坐标

<dependency>
      <groupId>org.mybatis</groupId>
      <artifactId>mybatis</artifactId>
      <version>3.5.5</version>
</dependency>

junit单元测试坐标

<!--junit 坐标-->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
        </dependency>

logback日志坐标

<!--logback 坐标-->
        <dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-classic</artifactId>
            <version>1.2.3</version>
        </dependency>
        <dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-core</artifactId>
            <version>1.2.3</version>
        </dependency>

第二步:编写mybatis核心配置文件
这一步就是替换数据库连接的信息(JDBC连接数据库的那段代码)解决硬编码问题
在resources下创建一个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">

<!--5.mybatis核心配置,加载配置数据库驱动,同时需要加载userMapper的映射文件-->
<configuration>
    <!--    配置数据源环境-->
    <properties resource="jdbc.properties"/>
    <!--    自定义别名,接下去在UserMapper核心配置文件的resultType就不用写全限定名,直接换user-->
    <typeAliases>
        <typeAlias type="ex1.domain.User" alias="user"/>
    </typeAliases>

    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <!--    数据库连接信息-->
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql:///db1?useSSL=false"/>
                <property name="username" value="root"/>
                <property name="password" value="1234"/>
            </dataSource>
        </environment>
    </environments>
    <!--    加载映射文件-->
    <mappers>
        <mapper resource="ex1\mapper\UserMapper.xml"/>
    </mappers>
</configuration>

第三步:编写SQL映射文件并加载

<?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">

<!--4.编写核心配置文件UserMapper.xml,即对数据库进行操作的配置文件-->
<mapper namespace="userMapper">
    <!--    使用命名空间namespace加上id就可以调用sql语句进行数据库操作即userMapper.findAll-->
    <!--    resultType 查询是结果集合往user实体进行封装-->
    <select id="findAll" resultType="user" >
        select * from user_info
    </select>
</mapper>

在mybatis-config.xml下配置UserMapper的路径

第四步:编码
mybatisdemo.java

public class MyBatisDemo {
    public static void main(String[] args) throws Exception {
        String resource = "mybatis-config.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

        SqlSession sqlSession = sqlSessionFactory.openSession();

        List<User> users = sqlSession.selectList("test.selectAll");

        System.out.println(users);

        sqlSession.close();
    }
}

User.java

public class User {
    private String name;
    private Integer age;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "User{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

运行结果:

IDEA配置连接数据库

由于用的是社区版没有database,在插件中下载Database Navigator重启idea后:

随后点击+号,选择对应的数据库类型:


配置成功后可以看到:

Mapper代理开发

为什么需要用到Mapper代理开发?
我们看刚刚执行SQL的代码语句:

 List<User> users = sqlSession.selectList("test.selectAll");

后面传入的参数也是一个写死的字符串,属于硬编码。
我们通过Mapper代理开发,就是为了解决上述这种方式的硬编码问题,以及简化后期执行SQL

Mapper代理开发规则

1.第一步:定义与SQL映射文件同名的Mapper接口,并且将Mapper接口和SQL映射文件放置在同一目录下

public interface UserMapper {
}

将Mapper接口和SQL映射文件放置在同一目录下
为了不让JAVA文件和配置文件不混在一起,方便管理,我们通过在resources下new一个dir的方式来创建一个包结构,这样让我们的配置文件在编译之后也能和我们的JAVA文件在同一个包结构下(dir中不能用.来区分包结构,而是需要用/

效果:

通过compile后到生成的class文件中验证,发现确实class文件和xml文件在同一路径下

2.第二步:设置SQL映射文件的namespace为Mapper接口的名字

3.第三步:在Mapper接口中定义方法,方法名称就是SQL映射文件中SQL语句的ID,并且保证参数类型和返回值类型一致

比如我现在要查询所有,在接口中定义的方法为
public interface UserMapper {
    List<User> selectAll();
}
这里的selectAll就对应了SQL语句中的ID

4.第四步:编码

  • 通过SqlSessiongetMapper方法获取Mapper接口的代理对象
  • 通过调用对应方法完成sql的执行
public class MyBatisDemo2 {
    public static void main(String[] args) throws Exception {
        String resource = "mybatis-config.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

        SqlSession sqlSession = sqlSessionFactory.openSession();

        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        List<User> users = mapper.selectAll();

        System.out.println(users);

        sqlSession.close();
    }
}

细节

为什么?
因为我们的mybatis-config的文件中可能要去加载很多的mapper,不太方便

那么我们可以通过包扫描的方式加载映射文件:

<package nem = "com.demo.Mapper"/>

通过这种方式可以以后无论多少的Mapper配置文件,我一行代码就可以搞定。

posted @ 2023-03-07 00:21  男人的浪漫  阅读(32)  评论(0)    收藏  举报