ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2021-04-08 22:57:44  阅读:158  来源: 互联网

标签:实战 MyBatisUtil java 第一个 SqlSession sqlSession user MyBatis import


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

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

创建一个maven项目

在这里插入图片描述
填写好GAV之后下一步就选好项目存储路径可以了

项目的目录结构

刚开始的项目结构可能看上去很多不知道什么东西的文件,很不舒服,但是删除又怕出问题

我们就可以把这些“无关紧要”的文件隐藏掉,第四步中填写的文字:

在这里插入图片描述

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

这时候项目结构简洁得多
在这里插入图片描述
然后接下来一步,我们看看src中的项目结构
在这里插入图片描述

main文件夹下主要一个java目录,一个resources目录,但是需要注意这两个文件夹的标:java文件夹是个蓝色的,resources文件夹标的右下角有一叠金币一样的东西,如果没有特殊标请看下图
在这里插入图片描述
或者:
在这里插入图片描述
然后就可以开始我们的下一步了,如果是我们之前普通的JavaWeb项目,目录结构是这样的在这里插入图片描述
而现在作为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

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

标签:实战,MyBatisUtil,java,第一个,SqlSession,sqlSession,user,MyBatis,import
来源: https://blog.csdn.net/weixin_46562226/article/details/115533783

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有