美文网首页
Mybatis入门教程(一)

Mybatis入门教程(一)

作者: 达布尔Double | 来源:发表于2020-03-15 18:23 被阅读0次

Mybatis入门

Mybatis简介

Mybatis是一个持久层(Dao)框架,是一套完整的与数据库交互的解决方案,提供了简单的开发方式。让开发人员更专注于SQL语句上,而非数据库的连接等繁琐的操作。

Mybatis环境搭建

搭建环境的步骤:

  1. 编写主配置文件
  2. 编写Dao层接口
  3. 编写映射文件
  4. 调试测试

1. 编写主配置文件

Mybatis的主配置文件中包含了两个部分:数据库环境连接映射文件,主配置文件名由自己随便定义即可。

例:MybatisConfiguration.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>
    <environments default="">
    </environments>

    <mappers>
    </mappers>
</configuration>

1.1 数据库环境configuration

主要配置数据库的相关参数,例如:连接数据库的驱动、数据库URL、用户名和密码等。

<environments default="mybatis">
        <environment id="mybatis">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/mybatis_demo"/>
                <property name="username" value="root"/>
                <property name="password" value="1234"/>
            </dataSource>
        </environment>
    </environments>

可以同时配置多个数据库环境,每个环境由id属性区分。但是必须设置一个默认环境,如上述代码的default属性

transactionManager:事物管理器类型,会在第三部分详细介绍,这里先用POOLED

dataSource:数据库连接池

driver属性:数据库驱动,这里用的com.mysql.jdbc.Driver,高版本的需要用com.mysql.cj.jdbc.Driver

url属性:数据库连接地址

username属性:数据库用户名

password属性:数据库密码

1.2 连接映射文件mappers

用于连接所编写的映射文件

XML映射文件

<mappers>
    <mapper resource="com/doublefloat/dao/mapper/IUserDaoMapper.XML"/>
</mappers>

如果是用XML编写的映射文件,需填写属性resource,其值为mapper文件的路径。

注:在Maven项目中mapper文件一般存放在Resource文件夹下,且目录需和相应的dao层接口的文件路径一致,若放在其他文件目录下,则需要在web.xml文件中添加相应的配置。

注解开发

<mappers>
    <mapper class="com.doublefloat.dao.IUserDao"/>
</mappers>

在使用注解开发时,一般没有XML映射文件,因此需要设置接口的路径

2. 编写Dao层接口

作为三层架构中的数据持久层,在Dao层里编写与数据库的CRUD操作。在实际开发中我们为了提高开发效率,一般只编写接口文件而不需要为其编写相应的实现类,但是Mybatis也提供了编写实现类的功能,详见Mybatis自定义部分。

示例代码(IUserDao.java文件):

package com.doublefloat.dao;

import com.doublefloat.entity.User;
import java.util.List;

public interface IUserDao {

    /**
     * 查找所有用户
     * @return
     */
    public List<User> findAllUsers();

    /**
     * 根据ID查找用户
     * @param id
     * @return
     */
    public User findUserById(Integer id);

    /**
     * 根据用户名查找用户
     * @param username
     * @return
     */
    public List<User> findUsersByName(String username);

    /**
     * 添加用户
     * @param user
     */
    public void addUser(User user);

    /**
     * 更新用户信息
     * @param user
     */
    public void updateUser(User user);

    /**
     * 根据ID删除用户
     * @param id
     */
    public void deleteUserById(Integer id);
}

3. 编写映射文件

3.1 基于XML映射文件

在基于XML配置文件开发的项目中,需要根据相应的Dao层接口编写对应的映射文件。

<?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.doublefloat.dao.IUserDao">
    <select id="findAllUsers" resultType="com.doublefloat.entity.User">
        select * from users;
    </select>

    <select id="findUsersByName" resultType="com.doublefloat.entity.User">
        select * from users where username = #{username};
    </select>

    <select id="findUserById" resultType="com.doublefloat.entity.User">
        select * from users where id = #{id};
    </select>
</mapper>

上述代码中的三个<select>标签分别对应着Dao层的三个查询方法,其中标签属性id必须和方法名一致。

<mapper>标签的namespace属性:同其他语言一样,这里的namespace属性也是为了区分多个文件中同名的映射方法。如在多个配置文件中都含有id为findUserById映射语句的情况下,namespace便是区分这些映射的唯一方法。

其他参数详解将会在Mybatis入门教程的的第二部分。

3.2 基于注解开发

在使用注解时,就不需要编写映射文件,在主配置文件连接映射文件时只需要作出相应的更改即可(详见上方“连接映射文件”)。

同时也需要在Dao层接口添加相应的注解

示例代码(IUserDao.java):

package com.doublefloat.dao;

import com.doublefloat.entity.User;
import org.apache.ibatis.annotations.Select;
import java.util.List;

public interface IUserDao {

    /**
     * 查找所有用户
     * @return
     */
    @Select("select * from users;")
    public List<User> findAllUsers();

    /**
     * 根据ID查找用户
     * @param id
     * @return
     */
    @Select("select * from users where id = #{id};")
    public User findUserById(Integer id);

    /**
     * 根据用户名查找用户
     * @param username
     * @return
     */
    @Select("select * from users where username = #{username};")
    public List<User> findUsersByName(String username);
}

4. 调试测试

测试步骤:

  1. 引用主配置文件
  2. 创建SqlSessionFactory工厂类
  3. 创建SqlSession对象
  4. 创建Dao层接口代理对象
  5. 执行Dao层代理对象的方法
  6. 释放资源
package com.doublefloat.dao;

import com.doublefloat.entity.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 java.io.IOException;
import java.io.InputStream;
import java.util.List;

public class IUserDaoTest {
    public static void main(String[] args) {
        // 读取配置文件
        InputStream inputStream = null;
        try {
            inputStream = Resources.getResourceAsStream("MybatisConfig.XML");
        } catch (IOException e) {
            e.printStackTrace();
        }

        // 创建Session工厂
        SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
        SqlSessionFactory factory = builder.build(inputStream);

        // 获取Session对象
        SqlSession sqlSession = factory.openSession();

        // 获取接口代理
        IUserDao iUserDao = sqlSession.getMapper(IUserDao.class);

        // 使用代理对象执行方法
        List<User> users = iUserDao.findAllUsers();

        for (User user : users) {
            System.out.println(user);
        }

        // 释放资源
        try {
            inputStream.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
        sqlSession.close();
    }
}

Mybatis自定义Dao层实现类

在编写Dao层接口之后我们并没有去编写其对应的实现类,而是直接编写其对应的映射文件。Mybatis会自动帮我们创建实现类。

1. 创建接口实现类

package com.doublefloat.dao;

import com.doublefloat.entity.User;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import java.util.List;

public class UserDaoImpl implements IUserDao {

    private SqlSessionFactory factory = null;

    public UserDaoImpl(SqlSessionFactory factory) {
        this.factory = factory;
    }

    @Override
    public List<User> findAllUsers() {
        // 创建sqlSession对象
        SqlSession session = factory.openSession();
        // 
        List<User> users = session.selectList("com.doublefloat.dao.IUserDao.findAllUsers");
        // 释放资源
        session.close();
        return users;
    }
}

2. 更改测试文件

package com.doublefloat.dao;

import com.doublefloat.entity.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 java.io.IOException;
import java.io.InputStream;
import java.util.List;

public class IUserDaoTest {
    public static void main(String[] args) {
        // 读取配置文件
        InputStream inputStream = null;
        try {
            inputStream = Resources.getResourceAsStream("MybatisConfig.XML");
        } catch (IOException e) {
            e.printStackTrace();
        }
        // 创建Session工厂
        SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
        SqlSessionFactory factory = builder.build(inputStream);

        // 获取Session对象
        SqlSession sqlSession = factory.openSession();

        // 创建接口实现类
        IUserDao iUserDao = new UserDaoImpl(factory);

        // 执行实现类方法
        List<User> users = iUserDao.findAllUsers();

        for (User user : users) {
            System.out.println(user);
        }

        // 释放资源
        try {
            inputStream.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
        sqlSession.close();
    }
}

相关文章

网友评论

      本文标题:Mybatis入门教程(一)

      本文链接:https://www.haomeiwen.com/subject/upypehtx.html