欢迎访问悦橙教程(wld5.com),关注java教程。悦橙教程  java问答|  每日更新
页面导航 : > > 文章正文

MyBatis基础,

来源: javaer 分享于  点击 10935 次 点评:288

MyBatis基础,


MyBatis

MyBatis是java平台下一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Ordinary Java Object,简单普通的 Java对象)映射成数据库中的记录。

其前身为apache的ibatis后来迁移到Gihub并更名为MyBatis

特点:

​ 1.轻量级自身不依赖其他任何JAR,但需要提供JDBC实现

​ 2.灵活,更加适用于需求变化频繁的互联网应用

​ 3.学习成本低,相比ORM框架而言,掌握MyBatis的使用是很轻松的

在结构中的位置

可以看出MyBatis处在DAO(数据访问对象)的位置,回顾一下DAO的工作职责:

​ 连接数据库

​ 接收输入数据

​ 拼接并执行SQL

​ 解析并返回结果

为什么需要MyBatis

使用JDBC完成DAO层存在以下问题

  • 每次操作都需要手动的创建连接,最后关闭连接

    对于重复代码通常开发者都会进行封装,但是由于每个人的编码风格不同导致封装的代码也没有固定的套路

    MyBatis将数据库连接相关的参数放到配置XML中并封装了创建连接的代码
  • 频繁的创建和销毁连接

    由于数据库连接使用的是TCP长连接,并发量大的系统中,这样的方式会导致数据库连接资源耗尽

    MyBatis本身实现了连接池,可以解决这一问题,当然后续会更换其他更好的连接池
  • 接受参数拼接SQL语句并执行

    每一条SQL语句都是直接写在代码中(硬编码),如果后期需求发生变化,则需要修改源码中的SQL,然后重新编译,测试.....

    MyBatis将SQL语句从代码中剥离到Mapper.xml映射文件中
  • 解析结果

    JDBC返回的是ResultSet,必须手动将其映射到一个个的对象中,同样是重复度很高的代码;并且存在硬编码问题

    MyBatis实现了入参映射到SQL参数,以及结果集映射到POJO对象

更多功能

MyBatis在解决上述问题的同时提供了更多实用的功能

  • 动态SQL,即在SQL语句中可以包含逻辑处理(判断,循环等....)

  • 高级映射,支持一对一,一对多映射

  • 动态代理Mapper,使得可以用面向对象的方式来完成数据库操作

  • 逆向工程,根据表结构自动生成,POJO,Mapper映射和Mapper接口,包含简单的CRUD

MyBatis构架

点击查看源网页

  • SqlMapConfig.xml作为全局配置,指定MyBatis的基本参数,如运行环境(开发,发布),事务管理器,数据来源等; 以及需要加载的mapper映射文件(从源码中剥离出来的SQL语句)

  • SqlSessionFactory,负责读取SqlMapConfig中的参数创建会话

  • SqlSession,通过SqlSessionFactory获取一个Session(会话)
  • Executor 真正负责执行sql语句的对象
  • MappedStatement用于将输入参数映射到sql语句,以及结果集映射到POJO

上述构架中,SqlSession以下的部分是MyBatis封装好的,SqlSession负责调用它们完成操作; 开发过程中不需要涉及(特殊需求除外);

另外SqlSessionFactory和SqlSession也可以通过简单的代码获取到,后续Spring框架能够自动创建它们

所以使用MyBatis的重点就落在了SqlMapConfig.xml以及Mapper.xml

CRUD入门

环境搭建

官方文档:https://mybatis.org/mybatis-3/getting-started.html

查询数据

查询单个

UserMapper.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">
<!--namespace 用于多个Mapper出现相同的sql时区分不同包-->
<mapper namespace="com.kkb.UserMapper">

        <!--查询语句
    id用于表示这条sql
    
    parameterType 表示 sql语句接受一个整数参数
    
    resultType表示 将结果映射到Products对象中
    
    #{} 表示一个站位符等同于 ?
            若输入参数是基础数据类型则可以随意写
            若输入是一个POJO则写属性名称-->
    <select id="selectProductBtId" parameterType="int" resultType="com.kkb.pojo.Products">
        select *from products where pid = #{pid}
    </select>
  
</mapper>

​ 不要忘记将这个mapper配置到mybatis-config.xml中

    <mappers>
        <mapper resource="mapper/ProductsMapper.xml"/>
    </mappers>
 @Test
    public void TestSelect() throws IOException {
        //获取的工厂构造器
        SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
        //加载配置文件
        InputStream stream = Resources.getResourceAsStream("mybatis-config.xml");
        //获得会话工厂
        SqlSessionFactory factory = builder.build(stream);
        //获得会话
        SqlSession sqlSession = factory.openSession();

        //执行sql
        Products product = sqlSession.selectOne("selectProductBtId", 1);
        System.out.println(product);
    }

查询多个

需求:使用模糊查询名字中带有新疆的数据

插入数据

更新数据

删除数据

相关文章

    暂无相关文章
相关栏目:

用户点评