MyBatis 基础入门

124 阅读2分钟

文章中用到的 sql和代码请参阅
gitee.com/ganzuoganwe…

MyBatis 基本认识

MyBatis 是一款优秀的 ORM(Object Relational Mapping) 对象关系映射框架。

ORM

什么是ORM, 我这边画了一个图加深下对ORM的理解 image.png

MyBatis特点

  1. 支持自定义 SQL、存储过程以及高级映射
  2. 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作
  3. 通过简单的 XML 或注解来配置和 JAVA 对象与数据库中共数据的对应关系。

MyBatis 解决了JDBC操作数据库的缺点:

  1. 重复代码
  2. sql 冗余在java 代码中
  3. sql 查询结果映射到 对象复杂
  4. 连接数据库的资源释放关闭等操作

需要了解JDBC操作数据库的同学参考:JDBC连接MySql

MyBatis 快速使用

在resource目录下面,配置jdbc 链接

jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/mybatis?useUnicode=true&characterEncoding=utf-8&rewriteBatchedStatements=true
jdbc.username=root
jdbc.password=root

MyBatis 中的依赖可以到 mvnrepository.com/ 中进行搜索

增加依赖

<!-- mybatis依赖  -->
<dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis</artifactId>
    <version>3.5.4</version>
</dependency>
<!-- mysql驱动,需要增加 -->
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>5.1.21</version>
</dependency>

mybatis-config.xml

MyBatis 的全局配置文件命名默认为: 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>
    <!-- 配置文件, jdbc的连接等信息 -->
    <properties resource="application.properties"/>
    <!-- 配置别名, 后面对于do 的查询不需要写全路径名,只需要写对应的DO 名称就好了 -->
    <typeAliases>
        <package name="com.example.mybatis.model.entity"/>
    </typeAliases>
    <!-- 环境配置 -->
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="${jdbc.driver}"/>
                <property name="url" value="${jdbc.url}"/>
                <property name="username" value="${jdbc.username}"/>
                <property name="password" value="${jdbc.password}"/>
            </dataSource>
        </environment>
    </environments>
    <!-- mapper 映射处理, 这里的配置方式有三种,参考官网。 这里使用的是最常用的包映射 -->
    <mappers>
      <package name="org.mybatis.builder"/>
    </mappers>
</configuration>

mapper.xml

下面的 mapper.xml 文件实现了最基本的增删改查。具体标签的使用这里不做叙述,请参考光官方文档: mybatis mappers映射文件

<?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.mybatis.mapper.BlogMapper">

	<!-- 映射关系 -->
    <resultMap id="blogResultMap" type="blogDO">
        <id column="bid" property="bid" jdbcType="INTEGER"/>
        <result column="name" property="name" jdbcType="VARCHAR" typeHandler="com.example.mybatis.config.MyStringTypeHandler"/>
        <result column="author_id" property="authorId" jdbcType="INTEGER"/>
        <result column="create_time" property="createTime" jdbcType="TIMESTAMP"/>
        <result column="update_time" property="updateTime" jdbcType="TIMESTAMP"/>
    </resultMap>

    <!-- sql 片段使用,下面的语句中可以引用 -->
    <sql id="BASE_SQL_COLUMN">
        bid
        , name, author_id   from blog
    </sql>

    <!-- =======================================================1 基本增删更改 ====================================================== -->
    <!-- insert -->
    <insert id="insertBlog" parameterType="blogDO">
        insert into blog (bid, name, author_id)
        values (#{bid, jdbcType = INTEGER},
                #{name,jdbcType=VARCHAR,typeHandler=com.example.mybatis.config.MyStringTypeHandler},
                #{authorId,jdbcType=INTEGER})
    </insert>

    <!-- delete -->
    <delete id="deleteByBid" parameterType="int">
        delete
        from blog
        where bid = #{bid}
    </delete>

    <!-- update -->
    <update id="updateByBid" parameterType="blogDO">
        update blog
        set name      = #{name},
            author_id = #{authorId}
        where bid = #{bid}
    </update>

    <!-- select -->
    <select id="selectBlogById" resultMap="blogResultMap" statementType="PREPARED">
        select
        <include refid="BASE_SQL_COLUMN"/>
        where bid = #{bid}
    </select>

</mapper>

mapper接口

public interface BlogMapper {
    int insertBlog(BlogDO blogDO);
    int deleteByBid(Integer bid);
    int updateByBid(BlogDO blogDO);
    BlogDO selectBlogById(Integer bid);
}

测试

private final Logger logger = LoggerFactory.getLogger(this.getClass());

SqlSessionFactory sqlSessionFactory;

/**
 * 1获取SqlSessionFactory 对象用于创建 SqlSession 会话,连接数据库。
 * 2 具体原理这里不做介绍,后续分析MyBatis体系结构的时候再做介绍。
 * @throws IOException 异常
 */
@Before
public void initSqlSessionFactory() throws IOException {
	String resource = "mybatis-config.xml";
	InputStream inputStream = Resources.getResourceAsStream(resource);
	sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
}

@Test
public void testInsert() {
    SqlSession sqlSession = sqlSessionFactory.openSession();
    BlogMapper mapper = sqlSession.getMapper(BlogMapper.class);

    BlogDO blogDO = new BlogDO();
    blogDO.setBid(3);
    blogDO.setName("测试类型转换");
    blogDO.setAuthorId(1009);
    int i = mapper.insertBlog(blogDO);
    logger.info(String.valueOf(i));
    // sqlSession 需要提交事务, 关闭事务
    sqlSession.commit();
    sqlSession.close();
}

@Test
public void testDelete() {
    SqlSession sqlSession = sqlSessionFactory.openSession();
    BlogMapper mapper = sqlSession.getMapper(BlogMapper.class);
    int i = mapper.deleteByBid(3);
    logger.info("testDelete: {}", i);
    sqlSession.commit();
    sqlSession.close();
}

@Test
public void testUpdate() {
    SqlSession sqlSession = sqlSessionFactory.openSession();
    BlogMapper mapper = sqlSession.getMapper(BlogMapper.class);
    BlogDO blogDO = new BlogDO();
    blogDO.setBid(1);
    blogDO.setName("name测试更新");
    int i = mapper.updateByBid(blogDO);
    logger.info("testUpdate: {}", i);
    sqlSession.commit();
    sqlSession.close();
}

@Test
public void testSelect() throws IOException {
    SqlSession sqlSession = sqlSessionFactory.openSession();
    BlogMapper mapper = sqlSession.getMapper(BlogMapper.class);
    BlogDO blogDO = mapper.selectBlogById(1);
    logger.info(blogDO.toString());
}

说明:如果有需要讨论的同学,麻烦您的问题打在评论区交流呀 这边文章仅做快速入门介绍,如需要了解MyBatis配置文件更多的使用方式。请参考官方文档 mybatis.net.cn/index.html

参考

  1. MyBatis官网
  2. MyBatis源码