Mybatis快速入门 1

131 阅读3分钟

课程目标

一、熟练运用MyBatis框架进行开发

二、掌握MyBatis与spring框架的整合 (主流开发框架)

概述:

1.Mybatis是Apache一个开源项目iBatis

2.是一个实现了数据持久化的开源框架,简单理解就是对Jdbc进行了封装。

ORMapping:Obejiect Relationship Mapping

对象指 面向对象

关系指 关系型数据库(mysql)

java到Mysql的映射,开发者可以以面向对象的思想来管理数据库。

优点

1、与jdbc相比减少了50%的代码量。

2、是最简单的持久化框架,小巧且简单易学。

3、相当灵活,不会对应用程序或者数据库的现有设计强加任何影响。 sql写在xml里,从代码中彻底分离,降低耦合度,便于统一管理和优化,并可重用。

4、提供xml标签,支持编写动态sql语句。

5、提供映射标签,支持对象(对象属性)与数据库的ORM字段关系映射。

缺点

1、sql语句编写工作量大,字段多、关联表多时,对开发人员编写sql语句的功底有一定要求 2、sql语句依赖于数据库,导致数据库移植性差,不能所以更换数据库,如mysql和oracle

核心接口和类

QQ浏览器截图20210726174420.png

开发方式

1、使用原生接口

2、mapper代理实现自定义接口

实战项目 mybatis

1、新建maven项目 pom.xml添加项目依赖

<dependencies>
    <dependency>
        <groupId>org.mybatis</groupId>
        <artifactId>mybatis</artifactId>
        <version>3.4.5</version>
    </dependency>
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>8.0.26</version>
    </dependency>
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <version>1.18.6</version>
    </dependency>
</dependencies>

2、数据创建表t_account

image.png

3、新建数据表对应的实体类 account.java

package com.example.Entity;

import lombok.Data;

@Data
public class account {
    private int id;
    private String Username;
    private String password;
    private int age;
    
}

4、创建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>
    <!-- 这里写配置内容 -->
</configuration>

exapmle:

<?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>
    <!-- 这里写配置内容 -->
    <!--mybatis运行环境,可包含多个数据源-->
    <environments default="dev">
        <!--  开发环境 -->
        <environment id="dev">
            <!--配置jdbc的事务管理-->
            <transactionManager type="JDBC"></transactionManager>
            <!--POOLED配置JDBC数据源连接池-->
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306//mybatis?useUnicode=true&amp;characterEncoding=utf-8&amp;useSSL=false&amp;serverTimezone=GMT"/>
                <property name="username" value="root"/>
                <property name="password" value="admin"/>
            </dataSource>
        </environment>
        <!-- 生产环境  -->
        <environment id="pro">
            <transactionManager type=""></transactionManager>
            <dataSource type=""></dataSource>
        </environment>
    </environments>
</configuration>

5、开发

5.1、原生接口开发

5.1.1 Mybatis框架需要开发者自定义sql语句,写在Mapper.xml文件中,实际开发中,会为每个实体类创建对应的Mapper.xml文件

<?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="命名空间">
    <!-- SQL语句 -->
</mapper>

example:

<?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.example.mapper.accountMapper">
    <!-- SQL语句 -->
    <insert id="save" parameterType="com.example.Entity.account">
        insert into t_account(username,password,age) values(#{username},#{password},#{age})
    </insert>
</mapper>

namespace 通常设置为文件所在包+文件名的形式

insert标签标示执行添加操作

select标签标示执行查询操作

update标签标示执行更新操作

delete标签标示执行删除操作

id是实际调用Mybatis方法时需要用到参数

parameterType 是调用对应方法时参数的数据类型。

5.1.2 在全局配置文件config中注册accountMapper.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>
    <!-- 这里写配置内容 -->
    <!--mybatis运行环境,可包含多个数据源-->
    <environments default="dev">
        <!--  开发环境 -->
        <environment id="dev">
            <!--配置jdbc的事务管理-->
            <transactionManager type="JDBC"></transactionManager>
            <!--POOLED配置JDBC数据源连接池-->
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306//mybatis?useUnicode=true&amp;characterEncoding=utf-8&amp;useSSL=false&amp;serverTimezone=GMT"/>
                <property name="username" value="root"/>
                <property name="password" value="admin"/>
            </dataSource>
        </environment>
        <!-- 生产环境  -->
        <environment id="pro">
            <transactionManager type=""></transactionManager>
            <dataSource type=""></dataSource>
        </environment>
    </environments>
   
    <!--注册accountMapper.xml-->
    <mappers>
        <mapper resource="com/example/mapper/accountMapper.xml"></mapper>
    </mappers>
</configuration>

5.1.3 调用Mybatis的原生接口来执行操作

package com.example.test;

import com.example.Entity.account;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import java.io.InputStream;

public class Test {
    public static void main(String[] arg){
        //加载Mybatis配置文件
        InputStream inputStream = Test.class.getClassLoader().getResourceAsStream("config.xml");
        SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
        SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(inputStream);
        SqlSession sqlSession = sqlSessionFactory.openSession();
        account acc =new account(1L,"张三","123123",22);
        String statment = "com.example.mapper.accountMapper.save";
        sqlSession.insert(statment,acc);
        sqlSession.commit();
    }
}

5.2 通过Mapper代理实现自定义接口

5.2.1自定义接口,定义相关业务方法

package com.example.repository;

import com.example.Entity.account;

import java.util.List;

public interface accountRepository {
    public int save(account acc);
    public int update(account acc);
    public int deleteById(long id);
    public List<account> findAll();
    public List<account> findById(long id);
}

5.2.2 编写方法相应的Mapper.xml

statement标签可根据SQL执行的业务选择insert、delete、update、select

Mybatis 框架会根据规则自动创建接口实现类的代理对象

规则:

Mapper.xml 中的namespace为接口的全类名

Mapper.xml中statement的id为接口中对应的方法名

Mapper.xml中statement的parameterType和接口中的方法的参数类型一致

Mapper.xml中的statement的resultType和接口中对应方法返回值类型一致

<?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.example.repository.accountRepository">
    <insert id="save" parameterType="account">
        insert into t_account(username,password,age) values(#{username},#{password},#{age})
    </insert>
    <update id="update" parameterType="account">
        update t_account set username = #{username},password =#{password},age=#{age} where id = #{id}
    </update>
    <delete id="deleteById" parameterType="long">
        delete from t_account where id = #{id}
    </delete>
    <select id="findAll" resultType="account">
        select * from t_account
    </select>
    <select id="findById" parameterType="long" resultType="account">
        select * from t_account where id = #{id}
    </select>
</mapper>

3、在config.xml中注册accountRepository.xml

<mappers>
    <mapper resource="com/example/mapper/accountMapper.xml"></mapper>
    <mapper resource="com/example/repository/accountRepository.xml"></mapper>
</mappers>

4.调用接口实现

package com.example.test;

import com.example.Entity.account;
import com.example.repository.accountRepository;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import java.io.InputStream;
import java.util.List;

public class Test2 {
    public static void main(String[] arg){
        InputStream inputStream = Test.class.getClassLoader().getResourceAsStream("config.xml");
        SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
        SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(inputStream);
        SqlSession sqlSession = sqlSessionFactory.openSession();
        //获取实现接口的代理对象
        accountRepository accRepository = sqlSession.getMapper(accountRepository.class);
        //添加对象
        account acc = new account(4,"李四","45645",13);
        accRepository.save(acc);
        sqlSession.commit();
        //查询所有数据
        List<account> acclist = accRepository.findAll();
        for(account account:acclist){
            System.out.println(account);
        }

    }

}