MyBatis简介

2020-03-09  本文已影响0人  拼搏男孩

1、简介

2、添加依赖

使用MyBatis与数据库进行交互需要添加两个依赖:一个是数据库的驱动,不同的数据库需要不同的驱动。另一个是MyBatis的依赖:

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.15</version>
</dependency>
<dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis</artifactId>
    <version>3.4.6</version>
</dependency>

上面添加的数据库依赖是MySQL的,具体看你用的是什么数据库就添加对应的依赖就可以了。

3、xml文件配置

mybatis.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">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/mydb"/>
                <property name="username" value="root"/>
                <property name="password" value="huwenlong"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <mapper resource="mapper.xml"/>
    </mappers>
</configuration>

mybatis.xml文件位于resources目录下,它的根节点是configuration,环境默认为开发环境,数据源为连接池,MyBatis自带连接池。四个属性根据自己使用的数据库进行设置,我使用的是MySQL 8.0所以驱动是com.mysql.cj.jdbc.Driver,如果你使用的是8.0以下版本则应该是com.mysql.jdbc.Driver。然后就是数据库名、用户名与密码,填写对应的就好。最后一个mappers是映射关系,resource是一个文件。

mapper.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">
<mapper namespace="com.qianfeng.pojo.User">
    <select id="selectUsers" resultType="com.qianfeng.pojo.User">
    select * from user
    </select>
    <select id="selectUser" resultType="com.qianfeng.pojo.User">
    select * from  user where userName = #{userName} and password = #{password}
    </select>
    <select id="selectUserCount" resultType="int">
    select count(1) from user
    </select>
    <select id="selectUsersByPage" resultType="com.qianfeng.pojo.User">
    select * from user limit #{startIndex},#{pageSize}
    </select>
    <insert id="saveUser" >
        insert into user values (default ,#{userName},#{password},#{age},#{address})
    </insert>
    <delete id="deleteUser">
        delete from user where id = #{id}
    </delete>
    <update id="updateUser">
        update user set userName = #{userName},password = #{password},age = #{age},address = #{address} where id = #{id}
    </update>
</mapper>

这个文件最重要的是namespace以及每一个项目的id,前者规定了命名空间,可以自己定义,后者是区分每一条语句的id,也可以自己定义,但要保证namespace+id全局唯一,使用的时候要对应。#{}包裹的是占位符,我们使用的时候需要传参。resultType是结果类型。

4、编写测试代码

User.java

package com.qianfeng.pojo;

public class User {
    private int id;
    private String userName;
    private String password;
    private int age;
    private String address;

    public User() {
    }

    public User(int id, String userName,String password, int age, String address) {
        this.password = password;
        this.id = id;
        this.userName = userName;
        this.age = age;
        this.address = address;
    }

    public int getId() {
        return id;
    }

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

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public int getAge() {
        return age;
    }

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

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    public String getPassword() {
        return password;
    }

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

    @Override
    public String toString() {
        final StringBuilder sb = new StringBuilder("User{");
        sb.append("id=").append(id);
        sb.append(", userName='").append(userName).append('\'');
        sb.append(", password='").append(password).append('\'');
        sb.append(", age=").append(age);
        sb.append(", address='").append(address).append('\'');
        sb.append('}');
        return sb.toString();
    }
}

User类是一个POJO,有5个成员,每个成员要与数据库的user表的每个字段一一对应。

UserTest.java

package com.qianfeng.pojo;

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.After;
import org.junit.Before;
import org.junit.Test;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import static org.junit.Assert.*;

public class UserTest {
    private SqlSessionFactory sf = null;
    private SqlSession ss = null;
    @Before
    public void setUp() throws Exception {
        sf = new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream("mybatis.xml"));
        ss = sf.openSession(true);
    }
    @Test
    public void testSelectUsers(){
        List<User> users = ss.selectList("com.qianfeng.pojo.User.selectUsers");
        for (User user : users) {
            System.out.println(user);
        }
    }

    @Test
    public void testSelectUser(){
        User user  = new User();
        user.setUserName("王五");
        user.setPassword("888888");
        User user1 = ss.selectOne("com.qianfeng.pojo.User.selectUser",user);
        System.out.println(user1);
    }

    @Test
    public void testSelectUserCount(){

        int i = ss.selectOne("com.qianfeng.pojo.User.selectUserCount");
        System.out.println(i);
    }

    @Test
    public void testSelectUsersByPage(){
        Map<String,Integer> map = new HashMap<>();
        map.put("startIndex",0);
        map.put("pageSize",5);
        List<User> users = ss.selectList("com.qianfeng.pojo.User.selectUsersByPage",map);
        for (User user : users) {
            System.out.println(user);
        }
    }
    @Test
    public void saveUser(){
        User user = new User(0,"李四","1234567",20,"湖北省武汉市");
        int i = ss.insert("com.qianfeng.pojo.User.saveUser",user);
        System.out.println(i);
    }
    @Test
    public void deleteUser(){
        int i = ss.delete("com.qianfeng.pojo.User.deleteUser",1);
        System.out.println(i);
    }
    @Test
    public void updateUser(){
        User user = new User(2,"王五","888888",21,"安徽省合肥市");
        int i = ss.update("com.qianfeng.pojo.User.updateUser",user);
        System.out.println(i);
    }
    @After
    public void tearDown() throws Exception {
        if(ss!=null){
            ss.close();
            ss = null;
        }
    }
}

这个测试类实现了MyBatis的增删改查操作,由于创建SqlSessionFactory与SqlSession与销毁SqlSession的操作每个方法都需要执行,所以把它们单独提出来分别放在setUp与tearDown方法中。

SqlSession中有很多方法可以用于数据库的增删改查操作,每个方法的第一个参数都是String类型statement,这个值是我们之前在mapper.xml文件中的"namespace.id"。第二个参数是一个Object类型的对象,用于一些条件,比如条件查询,插入值等,select方法还有第三个参数RowBounds参数,这个参数用于分页。

5、与Hibernate的比较

上一篇 下一篇

猜你喜欢

热点阅读