【MyBatis】实现一个增删改查完整的小入门Demo

本篇对mybatis学习做一个应用总结,使用开发工具IDEA操作数据库Mysql8撸一个入门级的demo,具有增删改查的功能。采用两种方式实现:①采用XML配置方式实现;②采用注解方式实现。且学习到一些关于Junit单元测试的使用。

一、创建项目

1、创建一个maven项目,添加框架需要的jar包依赖,对应使用pom文件引入依赖。

<dependencies>
        <!--MyBatis-->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.4.6</version>
        </dependency>
        <!--mysql8数据库驱动包-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.15</version>
        </dependency>
        <!--Junit单元测试工具-->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.10</version>
            <scope>test</scope>
        </dependency>
 </dependencies>

上面的<scope>标签设定为test表示只参与测试阶段的相关工作,不会被打包出去。关于maven中的<scope>标签详解请看这里
引入依赖下载的对应架包就在此处可以看到了。


2、接下来新建一个mybatis-cfg.xml配置文件,可从官网文档中直接复制模板过来,然后对应修改属性参数的值,可采用①直接写死在value中或者②引入jdbc.properties文件的方式(建议第二种)

<?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="${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>

3、使用IDEA快速创建POJO类,实现与数据库的映射,附骚操作。

图片.png
之后弹出框选择对应生成的entity文件夹,就自动生成了对应的代码了,不过此时可能要修改下包名,按下alt+enter快捷键自动去修改。如下图所示:
图片.png

4、新建一个mapper文件夹,然后在里面编写对应的mapper映射文件,也可从官网文档中复制,命名规则通常为实体类名+Mapper,如userMapper

<?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="xiaojiang.mybatisdemo.mapper.userMapper">
    <select id="selectUserById" resultType="xiaojiang.mybatisdemo.entity.User">
        select id,name,sex from user where id = #{id};
    </select>
    <select id="selectUserByName" parameterType="string" resultType="xiaojiang.mybatisdemo.entity.User">
        select * from user where name like '%${value}%';
    </select>
    <insert id="insertUser" parameterType="xiaojiang.mybatisdemo.entity.User">
        insert into User(id,name,sex) values(#{id},#{name},'${sex}');
    </insert>
    <update id="updateUser" parameterType="xiaojiang.mybatisdemo.entity.User">
        update User set name=#{name} where id = #{id};
    </update>
    <delete id="deleteUser" parameterType="int">
        delete from User where id = #{id};
    </delete>
</mapper>

5、创建UserDao对应的单元测试UserDaoTest,可通过IDEA快速创建单元测试,具体操作为:对应类源文件界面然后右键,选择GO TO>去开始创建Junit单元测试。以下是单元测试的具体编写:

package xiaojiang.mybatisdemo.dao;

import org.junit.After;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import xiaojiang.mybatisdemo.entity.User;

import java.util.List;

public class UserDaoTest {
    UserDao userDao;
    @Before
    public void setUp() throws Exception {
        userDao = new UserDao();
    }
    @After
    public void tearDown() throws Exception {
    }

    @Test
    public void selectUserById() throws Exception{
        User user = userDao.selectUserById(2);
        System.out.println(user);
        Assert.assertNotNull(user);
    }

    @Test
    public void selectUserByName() throws Exception{
        List<User> users = userDao.selectUserByName("江");
        System.out.println(users);
        Assert.assertNotNull(users);
    }

    @Test
    public void insertUser() throws Exception {
        User user = new User();
        user.setId(5);
        user.setName("小郑");
        user.setSex("女");
        Assert.assertEquals(1,userDao.insertUser(user));
    }

    @Test
    public void updateUser() throws Exception {
        User user = userDao.selectUserById(5);
        user.setName("大郑");
        Assert.assertEquals(1,userDao.updateUser(user));
    }

    @Test
    public void deleteUser() throws Exception {
        Assert.assertEquals(1,userDao.deleteUser(5));
    }
}

6、运行单元测试即可查看结果(增删改查

测试查找单个用户操作:
图片.png

测试查找多个用户操作:
图片.png

测试插入用户操作:
图片.png

测试修改用户操作:
图片.png

测试删除用户操作:
图片.png
小Demo我已经放在我的码云上,有需要看源码的小伙伴可直接点击跳转到这里mybatisDemo代码传送门

附:
1、期间使用IDEApush到码云上出现的project reject报错解决方案
2、git的使用学习看我这篇


来个漂漂亮亮的分割线~~~~~~~~~~~

以上已经实现了一个完整的基于XML配置的方式的小例子,下面还有通过注解的方式来实现,代码就不push到码云了,直接贴出来方便查看吧,总结:采用注解的方式方便,采用XML配置的方式强大,不过有个小看法,当采用注解的话,sql语句还是耦合在代码中,采用XML配置的方式就把sql语句与代码分离了出来,还是推荐第二种采用XML配置的方式。 注:所有代码都贴于下方。

pom.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.xiaojiang.mybatisDemo01</groupId>
    <artifactId>mybatisDemo01</artifactId>
    <version>1.0-SNAPSHOT</version>

    <dependencies>
        <!--MyBatis-->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.4.6</version>
        </dependency>
        <!--mysql数据库驱动包-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.15</version>
        </dependency>
        <!--Junit单元测试工具-->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.10</version>
            <scope>test</scope>
        </dependency>
    </dependencies>
</project>

SqlSessionFactoryUtil工具类

/**
 * FileName: SqlSessionFactoryUtil
 * Author:   小江
 * Date:     2019/2/12 20:45
 * History:
 */
package utils;

import dao.UserDao;
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;

/**
*@Author 小江  [com.zhbit]
*@Date 2019/2/12 22:59
*Description   抽取出来的工具类
*/
public class SqlSessionFactoryUtil {

    public static SqlSessionFactory getFactory(){
        InputStream inputStream = null;
        SqlSessionFactory sqlSessionFactory = null;
        try{
            inputStream = UserDao.class.getClassLoader().getResourceAsStream("mybatis-cfg.xml");
            //根据配置的输入流构造一个SQL会话工厂
            sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        }finally {
            if(inputStream!=null){
                try {
                    inputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        return sqlSessionFactory;
    }

    /**
    *@Author 小江  [com.zhbit]
    *@Date 2019/2/12 23:00
    *Description   获得SQL会话,自动提交
    */
    public static SqlSession openSession(boolean isAutoCommit){
        return getFactory().openSession(isAutoCommit);
    }

    /**
    *@Author 小江  [com.zhbit]
    *@Date 2019/2/12 23:00
    *Description    关闭SQL会话
    */
    public static void closeSession(SqlSession sqlSession){
        if(sqlSession!=null){
            sqlSession.close();
        }
    }
}

UserMapper接口(用于使用注解注入sql语句)

/**
 * FileName: UserMapper
 * Author:   小江
 * Date:     2019/2/12 21:22
 * History:
 */
package dao;

import entity.User;
import org.apache.ibatis.annotations.Delete;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.Update;

import java.util.List;

public interface UserMapper {

    @Select("select * from user where id = #{id}")
    User selectUserById(int id);

    @Select("select * from user where name like '%${value}%'")
    List<User> selectUserByName(String name);

    @Insert("insert into user(id,name,sex) values(#{id},#{name},#{sex})")
    int insertUser(User user);

    @Update("update user set name=#{name} where id=#{id}")
    int updateUser(User user);

    @Delete("delete from user where id=#{id}")
    int deleteUser(int id);
}

mybatis-cfg.xml配置文件(注:采用XML方式和采用注解方式的区别在于此处的mapper标签

<?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://数据库:3306/mybatis?useUnicode=true&amp;characterEncoding=UTF-8&amp;serverTimezone=UTC"/>
                <property name="username" value="root"/>
                <property name="password" value="数据库密码"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <mapper class="dao.UserMapper"/>
    </mappers>
</configuration>

UserDao类

/**
 * FileName: UserDao
 * Author:   小江
 * Date:     2019/2/12 21:21
 * History:
 */
package dao;

import entity.User;
import org.apache.ibatis.session.SqlSession;
import utils.SqlSessionFactoryUtil;

import java.util.List;

public class UserDao implements UserMapper {

    /**
    *@Author 小江  [com.zhbit]
    *@Date 2019/2/12 22:56
    *Description   根据id查找对象
    */
    public User selectUserById(int id) {
        User user = null;
        //打开一个会话
        SqlSession sqlSession = SqlSessionFactoryUtil.openSession(true);
        //获得一个映射器
        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
        //查询单个对象,指定参数
        user = userMapper.selectUserById(id);
        //关闭会话
        SqlSessionFactoryUtil.closeSession(sqlSession);
        return user;
    }

    /**
    *@Author 小江  [com.zhbit]
    *@Date 2019/2/12 22:56
    *Description   根据用户名查找对象
    */
    public List<User> selectUserByName(String name) {
        List<User> users = null;
        SqlSession sqlSession = SqlSessionFactoryUtil.openSession(true);
        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
        users = userMapper.selectUserByName(name);
        SqlSessionFactoryUtil.closeSession(sqlSession);
        return users;
    }

    /**
    *@Author 小江  [com.zhbit]
    *@Date 2019/2/12 22:56
    *Description  插入用户对象
    */
    public int insertUser(User user) {
        int rows = 0;
        SqlSession sqlSession = SqlSessionFactoryUtil.openSession(true);
        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
        rows = userMapper.insertUser(user);
        SqlSessionFactoryUtil.closeSession(sqlSession);
        return rows;
    }

    /**
    *@Author 小江  [com.zhbit]
    *@Date 2019/2/12 22:57
    *Description   根据id来修改用户对象
    */
    public int updateUser(User user) {
        int rows = 0;
        SqlSession sqlSession = SqlSessionFactoryUtil.openSession(true);
        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
        rows = userMapper.updateUser(user);
        SqlSessionFactoryUtil.closeSession(sqlSession);
        return rows;
    }

    /**
    *@Author 小江  [com.zhbit]
    *@Date 2019/2/12 22:57
    *Description   根据id来删除用户对象
    */
    public int deleteUser(int id) {
        int rows = 0;
        SqlSession sqlSession = SqlSessionFactoryUtil.openSession(true);
        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
        rows = userMapper.deleteUser(id);
        SqlSessionFactoryUtil.closeSession(sqlSession);
        return rows;
    }
}

UserDaoTest单元测试类

package dao;

import entity.User;
import org.junit.After;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;

import java.util.List;

public class UserDaoTest {

    UserMapper userDao;    //面向接口编程
    @Before
    public void setUp() throws Exception {
        userDao = new UserDao();
    }

    @After
    public void tearDown() throws Exception {
    }

    @Test
    public void selectUserById() {
        User user = userDao.selectUserById(2);
        System.out.println(user);
        Assert.assertNotNull(user);
    }

    @Test
    public void selectUserByName() {
        List<User> users = userDao.selectUserByName("江");
        System.out.println(users);
        Assert.assertNotNull(users);
    }

    @Test
    public void insertUser() {
        User user = new User();
        user.setId(5);
        user.setName("小琼");
        user.setSex("女");
        userDao.insertUser(user);
        Assert.assertEquals(1,userDao.insertUser(user));
    }

    @Test
    public void updateUser() {
        User user = userDao.selectUserById(3);
        user.setName("小李");
        Assert.assertEquals(1,userDao.updateUser(user));
    }

    @Test
    public void deleteUser() {
        Assert.assertEquals(1,userDao.deleteUser(3));
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,406评论 6 503
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,732评论 3 393
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,711评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,380评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,432评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,301评论 1 301
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,145评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,008评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,443评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,649评论 3 334
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,795评论 1 347
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,501评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,119评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,731评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,865评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,899评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,724评论 2 354

推荐阅读更多精彩内容