关于mybatis的相关介绍和入门操作

本文介绍了Mybatis如何解决JDBC的问题,如资源浪费、代码维护难等问题,并重点讲解了其使用场景、配置步骤、SQL分离、日志打印和单元测试。此外,还对比了注解和XML两种常见的Mapper实现方式。
摘要由CSDN通过智能技术生成

 1  Mybatis概述

1.1 jdbc 问题

  1. 数据库链接创建、释放频繁造成系统资源浪费从而影响系统性能,如果使用数据库链接池可解决此问题。
  2. Sql 语句在代码中硬编码,造成代码不易维护,实际应用 sql 变化的可能较大,sql 变动需要改变 java代码。
  3. 使用 preparedStatement 向占有位符号传参数存在硬编码,因为 sql 语句的 where 条件不一定,可能多也可能少,修改 sql 还要修改代码,系统不易维护。
  4. 对结果集解析存在硬编码(查询列名),sql 变化导致解析代码变化,系统不易维护,如果能将数据库记录封装成 pojo 对象解析比较方便

1.2 什么是mybatis

MyBatis 是一款优秀的持久层框架,它支持 SQL、存储过程以及高级映射。

如 JDBC中 我们需要有繁琐的流程,和设置参数,并且获取结果集的时候也需要循环遍历,并且手动封装到实体类对象中。

MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。它内部封装了 jdbc,使开发者只需要关注 sql 语句本身,而不需要花费精力去处理加载驱动、创建连接、创建 statement 等繁杂的过程。

MyBatis 可以使用 简单的 XML 或注解来配置和映射 接口和 Java 的 实体类。  

MyBatis 有两种用法,一个是注解,一个是XML,各有千秋

注解 : 使用注解的话,方便一些,不需要有XML配置文件,可能看上去会好看一些,但是需要代码和SQL在一起

XML : 把SQL语句放到XML文件中,java代码中会感觉干净一些,并且,使用XML形式 写一些复杂的SQL语句会比较方便,也能统一管理,有其他同事接手工作的时候,或者其他同事优化数据库查询的时候,位置好找,修改便捷,不容易出错

所以一般常用的就是XML,可以做到sql分离

有时候也是混用

2  使用场景 :  

MyBatis就是负责操作数据库的,所以当我们需要操作数据库的时候,就可以使用mybatis。

,简单的就用注解,复杂的就用XML

3  项目集成

3.1 引入依赖

<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->

<dependency>

    <groupId>org.mybatis</groupId>

    <artifactId>mybatis</artifactId>

    <version>3.4.6</version>

</dependency>

3.2 创建配置文件

在resource目录下创建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>

  <!-- 链接数据库只需要一个属性来配置文件,就会自动解析 -->

  <properties resource="jdbc.properties" />

  <!--  设置别名,然后就可以使用别名来代替前面的路径 -->

        <typeAliases>

                 <typeAlias type="com.tledu.zrz.model.User" alias="User"/>

                 <typeAlias type="com.tledu.zrz.model.Address" alias="Address"/>

        </typeAliases>

  <environments default="development">

    <environment id="development">

      <transactionManager type="JDBC"/>

      <dataSource type="POOLED">

        <property name="driver" value="${driver}"/>

        <property name="url" value="${url}"/>

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

        <property name="password" value="${password}"/>

      </dataSource>

    </environment>

  </environments>

  <!-- 映射文件 -->

  <mappers>

    <mapper resource="org/mybatis/example/BlogMapper.xml"/>

  </mappers>

</configuration>

创建jdbc.properties配置数据库

driver=com.mysql.jdbc.Driver

url=jdbc:mysql://localhost:3306/erp16?useUnicode=true&characterEncoding=UTF-8

username=root

password=root

3.3 准备一些测试数据

create table t_user(

        id int(11) primary key auto_increment,

        username varchar(100),

        password varchar(100),

        nickname varchar(100),

        `type` int (2)

);

create table t_address(

        id int(11) primary key auto_increment,

        addr varchar(255),

        phone varchar(100),

        postcode varchar(100),

        user_id int(11),

        CONSTRAINT foreign key (user_id) references t_user(id)

);

insert into t_user(username,password,nickname,type) values('admin','123','超级管理员',1);

insert into t_address(addr,phone,postcode,user_id) values ('123','123','123',1);

创建对应实体

3.5 创建数据库操作的xml文件

这里以user为例,Address作为练习,在resource目录下创建一个User.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 namespace="User">

  <!--

    id : 表示调用的SQL的名字,相当于方法名

    parameterType : 表示传入参数的类型,写类全名,但是由于设置的别名,所以可以写User

    resultType : 结果集类型

   -->

        <insert id="add" parameterType="User" >

        <!-- 这里的#username 就等于是用 ? 的方式,等方法调用的时候,会传递一个参数,就会自动映射到username的属性上 -->

                 insert into t_user (username,password,nickname,type) values (#{username},#{password},#{nickname},#{type})

        </insert>

</mapper>

修改mybatis-config.xml中的映射关系

<mappers>

        <mapper resource="mapper/User.xml"/>

</mappers>

如果想把xml文件放到java目录中,则需要在maven的build中配置资源路径

<project>

  ...

  <build>

    ...

         <resources>

            <resource>

                <!-- directory:指定资源文件的位置 -->

                <directory>src/main/java</directory>

                <includes>

                    <!-- “**” 表示任意级目录    “*”表示任意任意文件 -->

                    <!-- mvn resources:resources :对资源做出处理,先于compile阶段  -->

                    <include>**/*.properties</include>

                    <include>**/*.xml</include>

                </includes>

                <!--  filtering:开启过滤,用指定的参数替换directory下的文件中的参数(eg. ${name}) -->

                <filtering>false</filtering>

            </resource>

            <resource>

                <directory>src/main/resources</directory>

            </resource>

     </resources>

    ...

  </build>

  ...

</project>

3.6 执行该插入操作

编写一个servlet执行该操作

@WebServlet("/test")

public class TestServlet extends HttpServlet {

    @Override

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        String resource = "mybatis-config.xml";

        // 读取总配置文件

        InputStream inputStream = Resources.getResourceAsStream(resource);

        // 获取session工厂

        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

        // 获取session

        SqlSession session = sqlSessionFactory.openSession();

        // 调用xml中的sql

        User user = new User();

        user.setUsername("1234");

        user.setPassword("1234");

        user.setNickname("1234");

        // 调用

        session.insert("User.add", user);

        // 提交

        session.commit();

    }

}

4 日志日志打印

由于mybatis对sql进行了封装,这个时候我们在项目运行过程中,如果出现问题了就需要进行日志的打印,在这里可以通过log4j这个工具打印对应sql日志,帮助我们进行错误的排查。

4.1 引入日志的依赖

<!-- https://mvnrepository.com/artifact/log4j/log4j -->

<dependency>

    <groupId>log4j</groupId>

    <artifactId>log4j</artifactId>

    <version>1.2.17</version>

</dependency>

4.2 设置mybatis通过log4j打印日志

   <settings>

        <setting name="logImpl" value="LOG4J"/>

    </settings>

4.3 在resource目录下添加log4j.properties配置文件

5. 单元测试

我们现在在测试mybatis的时候,每次都需要启动tomcat服务,每次还需要开发一个接口,就比较麻烦,这个时候我们可以基于JUnit进行单元测试,帮我们快速测试代码。

5.1 添加依赖

这里在我们创建项目的时候maven已经为我们增加了junit的配置,所以我们这里就不用在重复添加了。

<!-- https://mvnrepository.com/artifact/junit/junit -->

<dependency>

    <groupId>junit</groupId>

    <artifactId>junit</artifactId>

    <version>4.12</version>

    <scope>test</scope>

</dependency>

5.2 添加测试用例

import com.tledu.erp.model.User;

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.Test;

import java.io.IOException;

import java.io.InputStream;

public class UserDao {

    @Test

    public void insert() throws IOException {

        String resource = "mybatis-config.xml";

        // 读取总配置文件

        InputStream inputStream = Resources.getResourceAsStream(resource);

        // 获取session工厂

        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

        // 获取session

        SqlSession session = sqlSessionFactory.openSession();

        // 调用xml中的sql

        User user = new User();

        user.setUsername("1234");

        user.setPassword("1234");

        user.setNickname("1234");

        // 调用

        session.insert("User.add", user);

        // 提交

        session.commit();

    }

}

5.3 运行测试样例

6. Mapper三种形式

常用的三种mapper

  1. sqlSession执行对应语句,就是我们上面测试的那种
  2. 使用注解(简单sql)
  3. 利用接口代理(常用)

6.1 sqlSession执行对应语句

上面的测试就是第一种

6.2 使用注解

  • 注解方式不需要User.xml
  • 需要再对应的接口上添加对应的注解语句
  • mybatis-config.xml中添加映射配置

在dao层接口上直接添加sql注解

public interface IUserMapper {

    @Select("select * from t_user where id = #{id}")

    User getById(int id);

}

配置mybatis

<mappers>

    <!--配置到对应的包-->

                 <package name="com.tledu.erp.mapper"/>

 </mappers>

运行测试样例

... 

// 调用xml中的sql

        User user = new User();

        user.setUsername("1234");

        user.setPassword("1234");

        user.setNickname("1234");

        User user1 = session.getMapper(IUserMapper.class).getById(1);

...

对于一些简单sql可以采用这种方式

6.3 利用接口代理(常用)

  1. 需要xml
  2. 接口中不需要添加注解
  3. mybatis-config.xml中添加映射配置

创建User.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 namespace="com.tledu.erp.mapper.IUserMapper">

    <insert id="add" parameterType="User" >

        <!-- 这里的#username 就等于是用 ? 的方式,等方法调用的时候,会传递一个参数,就会自动映射到username的属性上 -->

        insert into t_user (username,password,nickname) values (#{username},#{password},#{nickname})

    </insert>

    <select id="getList" resultType="User">

        select * from t_user

    </select>

    <select id="getById" parameterType="int" resultType="User">

        select * from t_user where id = #{id}

    </select>

</mapper>

在mubatis-config.xml中配置

<mapper resource="com/tledu/erp/mapper/User.xml"/>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值