初识Mybatis

325 阅读4分钟

初识Mybatis

MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。

下面给出Mybatis的下载地址 github.com/mybatis/myb…

Mybatis被称为半自动框架,只需要我们编写sql语句即可,该框架可以自动完成ORM(objcet relation mapping)映射关系。相较于被称为全自动框架的Hibernate,我们可以写一些逻辑比较复杂的sql语句,也可以对sql语句进行优化。总的来说,对于从刚刚从JDBC阶段走出的我来说,甚是便利。

使用Mybatis对数据库进行操作还需要数据库驱动包,下面给出数据库驱动包的下载地址dev.mysql.com/downloads/

在选择驱动包的时候要选择与数据库版本对应的驱动包,切不可有着用新不用旧的思想,毕竟,适合自己的才是最好的。

搭建第一个Mybatis工程

一、导入驱动包

在建立一个与src同级的目录lib用来存放我们刚刚下载好的两个jar包

选中这两个jar包,右击,然后add ad library

二、配置全局的文件

在src目录下新建一个xml文件

我们一般把这个全局文件命名为SqlMapConfig.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="development">
        <environment id="development">
            <!-- 事务管理 原生的jdbc事务管理-->
            <transactionManager type="JDBC"/>
            <!-- 数据库连接池-->
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/mybatis"/>
                <property name="username" value="root"/>
                <property name="password" value="root"/>
            </dataSource>
        </environment>
    </environments>

    <!-- 映射器-->
    <mappers>
        <mapper resource="com/oracle/dao/UserDao.xml"/>
    </mappers>
</configuration>

其中该部分的代码需要根据自己的数据库,更改对应的参数,大家应该已经学过JDBC连接数据库了吧

 <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/mybatis"/>
                <property name="username" value="root"/>
                <property name="password" value="root"/>
            </dataSource>

三、设计数据库表

数据库建立一个user表,字段信息如下图所示

在src目录下创建实体类包pojo,在实体类包中新建一个User类,user类中的属性要与数据库表中的字段对应

package com.oracle.pojo;

public class User {
    private Integer id;
    private String username;
    private String password;
    private Integer age;

    public User(Integer id,String username, String password, Integer age) {
        this.id = id;
        this.username = username;
        this.password = password;
        this.age = age;
    }

    public User(String username, String password, Integer age) {
        this.username = username;
        this.password = password;
        this.age = age;
    }

    public User() {
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", username='" + username + '\'' +
                ", password='" + password + '\'' +
                ", age=" + age +
                '}';
    }
}

四、编写工具类

执行sql语句需要获取sqlSession对象,获取sqlSession的代码都是相同的,为了减少代码冗余,我们编写一个工具类,新建一个工具类包,在该包下新建MybatisUtil工具类,下面给出其对应的代码

package com.oracle.util;

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;

public class MybatisUtil {
    public static SqlSession getSqlSession(){
        SqlSession sqlSession = null;
        try {
            InputStream resourceAsStream = Resources.getResourceAsStream("SqlMapConfig.xml");

            //通过mybatis的slqSession会话工厂构建者得到sqlSession会话工厂
            SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
            //通过sqlSession会话工厂得到sqlSession
            //得到的sqlSession默认是手动提交事务的,添加参数true则改为自动
            sqlSession = sqlSessionFactory.openSession(true);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return sqlSession;
    }
}

五、设计dao层接口

在src目录下新建一个dao包,在该包中新建一个UserDao接口,下面给出UserDao接口的代码

package com.oracle.dao;

import com.oracle.pojo.User;

public interface UserDao {
    public User login(String username,String password) throws Exception;

    public void addUser(User user) throws  Exception;

    public void deleteUser(Integer id) throws Exception;

    public void updateUser(User user) throws Exception;
}

六、实现dao接口

在src目录下新建一个daoImpl包,在该包中新建一个UserDaoImpl类,该类实现UserDao接口,然后实现UserDao接口中的方法。

package com.oracle.daoImpl;

import com.oracle.dao.UserDao;
import com.oracle.pojo.User;
import com.oracle.util.MybatisUtil;
import org.apache.ibatis.session.SqlSession;

public class UserDaoImpl implements UserDao {
    @Override
    public User login(String username, String password) throws Exception {
        SqlSession sqlSession = MybatisUtil.getSqlSession();
        User user = new User();
        user.setUsername(username);
        user.setPassword(password);
        User u = sqlSession.selectOne("crud.login",user);
        return u;
    }

    @Override
    public int addUser(User user) throws Exception {
        SqlSession sqlSession = MybatisUtil.getSqlSession();

        int a = sqlSession.insert("crud.addUser", user);

        return a;


    }

    @Override
    public int deleteUser(Integer id) throws Exception {
        SqlSession sqlSession = MybatisUtil.getSqlSession();
        int a  = sqlSession.delete("crud.deleteUser", id);
        return  a;

    }

    @Override
    public int updateUser(User user) throws Exception {
        SqlSession sqlSession = MybatisUtil.getSqlSession();
        int a = sqlSession.update("crud.updateUser", user);

        return a;
    }
}

在dao包下新建一个UserDao.xml文件,用来编写我们的sql语句

<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="crud">
    <select resultType="com.oracle.pojo.User" id="login">
    <!--在这里写自己的sql语句,我们用#{}来代替JDBC中的?充当占位符,这里Mybatis框架会自动完成ORM映射,我们就不需要一个个的设置参数了,好方便的呢 -->
    select * from `user`where username = #{username} and password = #{password}
    </select>

    <update id="updateUser" parameterType="com.oracle.pojo.User">
    <!--入参如果是基本数据类型,可以不要写parameterType参数,但如果是自己编写的类等,必须写明入参 -->
        update `user` set username = #{username}, password = #{password},age = #{age} where id = #{id}
    </update>

    <delete id="deleteUser" >
        delete from  `user` where id = #{id}
    </delete>

    <insert id="addUser" parameterType="com.oracle.pojo.User">
         insert into user(username,password,age)values(#{username},#{password},#{age})
    </insert>
</mapper>

注意Mybatis的默认需要自己手动提交事务。如果需要设置手动提交事务,我们在编写MybatisUtil的工具类时,将获取的的sqlSession对象的参数设置为true,就是这句代码啦 sqlSession = sqlSessionFactory.openSession(true);

七、编写测试类

编写单元测试类,来检验我们最后的成果,下面给出我的单元测试类样例

package com.oracle.test;

import com.oracle.dao.UserDao;
import com.oracle.daoImpl.UserDaoImpl;
import com.oracle.pojo.User;
import org.junit.Test;

public class testMybatis {
    @Test
    public void testLogin(){
        UserDao userDao = new UserDaoImpl();
        try {
            User user = userDao.login("admin", "123");
            System.out.println(user);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    @Test
    public void testAddUser() throws Exception {
        UserDao userDao = new UserDaoImpl();

        userDao.addUser(new User("张三", "12321", 18));

    }

    @Test
    public void testDelete()throws Exception{
        UserDao userDao = new UserDaoImpl();
        int i = userDao.deleteUser(8);
        System.out.println(i);
    }

    @Test
    public void testUpdate() throws Exception{
        UserDao userDao = new UserDaoImpl();
        userDao.updateUser(new User(12,"李四","34234",20));
    }
}