第一个MyBatis项目,MyBatis简单实战

第一个MyBatis项目,MyBatis简单实战

在学习MyBatis之前,建议先学习一下maven,因为MyBatis涉及到很多jar包,如果自己一个个去找去下载是很麻烦的,而maven的强大之处就在于可以导入一个jar还有它所有所依赖的jar包.

创建一个maven项目

第一个MyBatis项目,MyBatis简单实战
填写好GAV之后下一步就选好项目存储路径可以了
第一个MyBatis项目,MyBatis简单实战

项目的目录结构

刚开始的项目结构可能看上去很多不知道什么东西的文件,很不舒服,但是删除又怕出问题
第一个MyBatis项目,MyBatis简单实战
我们就可以把这些“无关紧要”的文件隐藏掉,第四步中填写的文字:

第一个MyBatis项目,MyBatis简单实战

 ;*.hprof;*.idea;*.iml;*.pyc;*.pyo;*.rbc;*.yarb;*~;.DS_Store;.git;.hg;.svn;CVS;__pycache__;_svn;target;vssver.scc;vssver2.scc;

这时候项目结构简洁得多
第一个MyBatis项目,MyBatis简单实战
然后接下来一步,我们看看src中的项目结构
第一个MyBatis项目,MyBatis简单实战

main文件夹下主要一个java目录,一个resources目录,但是需要注意这两个文件夹的标:java文件夹是个蓝色的,resources文件夹标的右下角有一叠金币一样的东西,如果没有特殊标请看下图
第一个MyBatis项目,MyBatis简单实战
或者:
第一个MyBatis项目,MyBatis简单实战
然后就可以开始我们的下一步了,如果是我们之前普通的JavaWeb项目,目录结构是这样的第一个MyBatis项目,MyBatis简单实战
而现在作为MyBatis项目,也需要符合MyBatis的项目结构习惯,如下:
第一个MyBatis项目,MyBatis简单实战
了解了项目结构,我们就差不多开始这篇文章最关键的地方:
也就是resources文件夹,里面也有一个mapper文件夹,而java文件夹的mapper包却缺少了impl这个dao层实现类的包
MyBatis用通俗的话来概括就是基于ORM(对象/关系映射)的对JDBC操作进行简化的框架
而resources文件夹的mapper包下的xml文件和java文件夹中的mapper包的接口所对应,也是对接口的实现

代码演示

具体的实现细节,我们上代码:
我们将图片中关键的文件(java文件和xml文件)的代码附上:

首先是数据库(数据库的sql,我这这个表在“mybatis”数据库中):

DROP TABLE IF EXISTS `user`;
CREATE TABLE `user`  (
  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  `name` varchar(30) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '姓名',
  `age` int NULL DEFAULT NULL COMMENT '年龄',
  `email` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '邮箱',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;

-- ----------------------------
-- Records of user
-- ----------------------------
INSERT INTO `user` VALUES (1, 'Jon', 32, 'test1@baomidou.com');
INSERT INTO `user` VALUES (2, 'Jack', 20, 'test2@baomidou.com');
INSERT INTO `user` VALUES (3, 'Tom', 28, 'test3@baomidou.com');
INSERT INTO `user` VALUES (4, 'Sandy', 21, 'test4@baomidou.com');
INSERT INTO `user` VALUES (5, 'Billie', 24, 'test5@baomidou.com');

SET FOREIGN_KEY_CHECKS = 1;

pom.xml文件的依赖

<!--依赖-->
    <dependencies>
        <!--maven是有一个本地仓库的,下载好的jar包就存在本地-->
        <!-- 现在就是代表已经导入了一个java连接mysql的jar包 -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.13</version>
        </dependency>

        <!--ctrl+x删除一整行    ctrl+D-->
        <!--引入mybatis的jar包-->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.4.6</version>
        </dependency>

        <!--这是做单元测试的jar包,单元测试如果不懂,你就直接理解:导入一个jar包,然后利用@Test注解就可以注解多个方法,这些注解的方法都可以看作一个main()方法,重点是这些方法都可以写在一个类中-->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>compile</scope>
        </dependency>

        <!--需要提前安装lombok插件,不知道如何安装的自行百度,很简单。(小辣椒),自动封装实体类的插件所需的jar包-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.18</version>
        </dependency>
    </dependencies>

entity包下User.java类的代码:

package entity;

import lombok.Data;

@Data//这时候就是发挥lombok插件的作用了
public class User {
    private Integer id;
    private String name;
    private Integer age;
    private String email;
}

mapper包下UserDao.java接口的代码:

package mapper;

import entity.User;

import java.util.List;

public interface UserDao {
    /**
     * 查询所有的学生信息
     * @return
     */
    List<User> findUsers();

    /**
     * 添加用户信息
     * @param user
     * @return
     */
    int addUser(User user);

    /**
     * 根据id删除用户信息
     * @param id
     * @return
     */
    int deleteUser(Long id);

    /**
     * 更新用户
     * @param user
     * @return
     */
    int updateUser(User user);
}

resource文件夹下mybatis-config.xml(MyBatis的全局配置文件):

<?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>
    <!--运行环境,可以配置多个运行环境,但是我们这里就需要一个,并且要与其中的一个环境的id对应上-->
    <environments default="development">
    	<!--id可以自己命名-->
        <environment id="development">
            <!--事物管理器 默认使用JDBC进行事物管理-->
            <transactionManager type="JDBC"/>
            <!--配置数据源-->
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/mybatis?characterEncoding=UTF-8&amp;useUnicode=true&amp;serverTimezone=GMT%2B8"/>
                <property name="username" value="root"/>
                <property name="password" value="root"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <!--对应的mybatis的xml文件-->
        <mapper resource="mapper/UserDao.xml"/>
    </mappers>
</configuration>

java文件夹util包下MyBatisUtil.java工具类(为了简化测试类中的代码):

package 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 {
    static SqlSession sqlSession=null;
	
	//说在前面
	//基于 MyBatis 的应用都是以一个 SqlSessionFactory 的实例(为了获取SqlSession对象)为核心的
	//SqlSessionFactory :factory是工厂的意思
	//SqlSessionFactoryBuilder :builder是工人的意思
	//所以下面的代码为了方便理解:SqlSessionFactoryBuilder工人产生SqlSessionFactory工厂,然后SqlSessionFactory工厂生产(openSession打开)SqlSession产品
	
    /**
     * 获取SqlSession对象
     */
    public static SqlSession getSqlSession(){
        String resouce= "mybatis-config.xml";
        InputStream inputStream=null;
        try {
            inputStream = Resources.getResourceAsStream(resouce);
        } catch (IOException e) {
            e.printStackTrace();
        }
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);//builder工人创建工场factory
        sqlSession=sqlSessionFactory.openSession();
        return sqlSession;
    }

    /**
     * 关闭sqlSession
     */
    public static void closeSqlSession(SqlSession sqlSession) {
        if (sqlSession != null) {
            sqlSession.close();
        }
    }
}

resource文件夹的mapper包下UserDao.xml(一个接口对应一个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="mapper.UserDao">
    <!--每一种slq语句对应每一种标签-->
    <!--id对应方法名,那么我们这里也就是实现了Dao接口的四个方法,同时id不可以重名,所以在MyBatis中不支持方法的重载,resultType为返回值类型,需要全路径-->
    <select id="findUsers" resultType="entity.User">
        select * from user
    </select>
    <!--parameterType为参数类型,增删改方法都可以不指定参数类型,但是便于理解,这里就指定了-->
    <insert id="addUser" parameterType="entity.User">
        --因为id是自增长列,所以values中id的值可以为null,也可以填写0,让其实现自增长
        INSERT INTO `mybatis`.`user`(`id`, `name`, `age`, `email`) VALUES (null, #{name}, #{age}, #{email});
    </insert>
    <delete id="deleteUser" parameterType="java.lang.Long">
        delete from user where id=#{id};
    </delete>
    <update id="updateUser" parameterType="entity.User">
        UPDATE `mybatis`.`user` SET `name` = #{name}, `age` = #{age} WHERE `id` = #{id};
    </update>
</mapper>

java文件夹text包下的MyBatis.java测试类

package text;

import entity.User;
import mapper.UserDao;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;
import util.MyBatisUtil;

import java.util.List;

public class MyBatisTest {
    @Test
    public void findUsers(){
    	//
        //创建SqlSession对象
        SqlSession sqlSession= MyBatisUtil.getSqlSession();
        try {
            List<User> users = sqlSession.selectList("mapper.UserDao.findUsers");
            for (User user : users
            ) {
                System.out.println(user.toString());
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            //每次用完记得关闭连接对象
            MyBatisUtil.closeSqlSession(sqlSession);
        }
    }

    @Test
    public void addUser(){
        SqlSession sqlSession= MyBatisUtil.getSqlSession();
        try {
            User user=new User();
            user.setName("李伟伟");
            user.setAge(32);
            user.setEmail("3322@qq.com");
            int i = sqlSession.insert("mapper.UserDao.addUser",user);
            //手动提交事物
            sqlSession.commit();
            System.out.println(i);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            //每次用完记得关闭连接对象
            MyBatisUtil.closeSqlSession(sqlSession);
        }
    }

    @Test
    public void addUser2(){
        //在addUser()方法的基础上拓展
        SqlSession sqlSession= MyBatisUtil.getSqlSession();
        try {
            User user=new User();
            user.setName("戴富豪");
            user.setAge(23);
            user.setEmail("7788@qq.com");
            UserDao userDao = sqlSession.getMapper(UserDao.class);//使用反射的方式
            //仅仅是在内存中增加一个用户
            int i = userDao.addUser(user);
            //手动提交事物
            sqlSession.commit();
            System.out.println(i);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            //每次用完记得关闭连接对象
            MyBatisUtil.closeSqlSession(sqlSession);
        }
    }

    @Test
    public void deleteUser(){
        SqlSession sqlSession= MyBatisUtil.getSqlSession();
        try {
            UserDao userDao = sqlSession.getMapper(UserDao.class);//使用反射的方式
            //仅仅是在内存中删除一个用户
            int i = userDao.deleteUser(6L);
            //手动提交事物
            sqlSession.commit();
            System.out.println(i);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            //每次用完记得关闭连接对象
            MyBatisUtil.closeSqlSession(sqlSession);
        }
    }

    @Test
    public void updateUser(){
        //在addUser()方法的基础上拓展
        SqlSession sqlSession= MyBatisUtil.getSqlSession();
        try {
            UserDao userDao = sqlSession.getMapper(UserDao.class);//使用反射的方式
            User user=new User();
            user.setId(1);
            user.setName("李伟伟");
            user.setAge(32);
            //仅仅是在内存中更新一个用户
            int i = userDao.updateUser(user);
            //手动提交事物
            sqlSession.commit();
            System.out.println(i);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            //每次用完记得关闭连接对象
            MyBatisUtil.closeSqlSession(sqlSession);
        }
    }
}

最后

参考的文档:
MyBatis官方文档:https://mybatis.org/mybatis-3/zh/getting-started.html

此文作为个人总结,如果此文章有什么错误、或者有什么疑问欢迎留言。

上一篇:【Android自动化打包】03. APK的数字签名


下一篇:Mybatis-4