Article

【mybatis annotation】数据层框架应用--Mybatis(二) 基于注解实现数据的CRUD

围绕工程实践、云原生与开发经验的深度整理。

【mybatis annotation】数据层框架应用--Mybatis(二) 基于注解实现数据的CRUD

使用 MyBatis 框架进行持久层开发

  • MyBatis 是支持普通 SQL 查询,存储过程和高级映射的优秀持久层框架。
  • MyBatis 消除了几乎所有的 JDBC 代码和参数的手工设置以及对结果集的检索。
  • MyBatis 可以使用简单的 XML 或注解用于配置和原始映射,将接口和 Java 的 POJO(Plain Old Java Objects,普通的 Java 对象)映射成数据库中的记录。

你需要了解的知识点

1、什么是 SqlSessionFactory?

SqlSessionFactory是 MyBatis 框架中十分重要的对象,它是单个数据库映射关系经过编译后的内存镜像,其主要作用是创建 SqlSession。

SqlSessionFactory对象的实例可以通过 SqlSessionFactoryBuilder 对象来构建,而 SqlSessionFactoryBuilder 则可以通过 XML 配置文件或一个预先定义好的 Configuration 实例构建出 SqlSessionFactory 的实例

SqlSessionFactory 对象是线程安全的,它一旦被创建,在整个应用执行期间都会存在。如果我们多次的创建同一个数据库的 SqlSessionFactory,那么此数据库的资源将很容易被耗尽。为此,通常每一个数据库都会只对应一个 SqlSessionFactory,所以在构建 SqlSessionFactory 实例时,建议使用单列模式。

2、为什么要使用注解版

相信同学们已经了解到,mybatis 有 xml 版与注解版两种形式,那我们实际开发中使用 xml 版还是注解版呢,我只能告诉你,两种版本各有各的优点,可以根据自己的需求再不同的环境使用不同的方式。

1、注解版:简单方便 2、xml 版:可维护性高

使用

1、MyBatis 下载

在 Java 或 Java Web 项目中添加 MyBatis 框架后,就能对数据表进行 CRUD 操作了。

方法一:可以从官方网站: https://github.com/mybatis下载所需要的MyBatis版本。 🔗

方法二:使用 maven 的直接加入依赖,需要 MySQL 的驱动包、mybatis 的驱动包

        <!--        数据库  start-->
        <!--        引入jdbc与mysql依赖-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.18</version>
        </dependency>
        <!--        mybatis-->
        <!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.4.6</version>
        </dependency>
        <!--        数据库 end-->

注意这里的 mysql 的驱动包,根据你自己安装的 mysql 版本,使用mysql -V查询,例如我的是 8 版本,所以用 8 版本的驱动包

2、创建实体类

在 src 目录下新建com.lomtom.mybatis.entity包,并在其中创建实体类 UserInfo(对应数据表 user_info)。UserInfo 类包含一些属性(对应数据表 user_info 的部分字段),以及与之对应的 getXXX()和 setXXX()方法,还可添加构造方法 。

当然你如果使用 lombok 可以不写他的 getter、setter 以及 constructor。

/**
 * @Author: LOMTOM
 * @Date: 2020/4/20
 * @Time: 15:12
 * @Email: lomtom@lomtom.cn
 */
@Data
public class UserInfo {

    private Integer id;

    private String userName;

    private String passWord;

    private Date regDate;

}

3、创建属性文件 jdbc.properties

在 resources 目录下创建属性文件 jdbc.properties,保存数据库的连接信息。

<properties>是一个配置属性的元素,该元素通常用来将内部的配置外在化,即通过外部的配置来动态的替换内部定义的属性。例如,数据库的连接等属性,就可以通过典型的 Java 属性文件中的配置来替换,

请根据自己mysql版本,确认之后再食用

1、mysql for version 8
jdbc.driverClassName=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/javaweb2?characterEncoding=UTF-8
jdbc.username=root
jdbc.password=123456

2、mysql for version 5
jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/javaweb2?characterEncoding=UTF-8
jdbc.username=root
jdbc.password=123456

4、创建 XML 映射配置文件

resources目录下创建 MyBatis 的 XML 配置文件mybatis-config.xml,用于加载 mysql 的连接配置。

<configuration>
    <!--加载属性文件-->
    <properties resource="jdbc.properties"></properties>

    <!--给包中的类注册别名,注册后可以直接使用类名,而不用使用全限定的类名就是不用包含包名)。-->
    <typeAliases>
        <package name="com.lomtom.mybatis.entity"/>
    </typeAliases>

    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="${jdbc.driverClassName}"/>
                <property name="url" value="${jdbc.url}"/>
                <property name="username" value="${jdbc.username}"/>
                <property name="password" value="${jdbc.password}"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <mapper class="com.lomtom.mybatis.mapper.UserInfoMapperAnnotation"></mapper>
    </mappers>
</configuration>
  1. <typeAliases>元素用于为配置文件中的 Java 类型设置一个简短的名字,即设置别名。别名的设置与 XML 配置相关,其使用的意义在于减少全限定类名的冗余。 当 POJO 类过多时可以指定一个包名,MyBatis 会在包名下面搜索需要的 Java Bean。每一个在包 中的 Java Bean,在没有注解的情况下,会使用 Bean 的首字母小写的非限定类名来作为它的别名。若有注解,则别名为其注解值

  2. <environments>元素用于对环境进行配置。MyBatis 的环境配置实际上就是数据源的配置,我们可以通过<environments>元素配置多种数据源,即配置多种数据库。

5、创建 Mapper 接口

com.lomtom.mybatis.mapper包中创建 UserInfoMapperAnnotation.java 接口,并且加入

  • testAddUserInfo()方法
  • testGetUserInfoById()方法
  • testGetAllUserInfo()方法
  • testUpdateUserInfo()方法
  • testDeleteUserInfo()方法
/**
 * @Author: LOMTOM
 * @Date: 2020/4/26
 * @Time: 16:16
 * @Email: lomtom@lomtom.cn
 */
public interface UserInfoMapperAnnotation {

    /**
     * 插入
     * @param userInfo
     * @return
     */
    @Insert(" insert into user_info(userName, passWord, regDate)\n" +
            "        values(#{userName},#{passWord}, #{regDate})")
    int addUserInfo(UserInfo userInfo);

    /**
     * 删除
     * @param id
     * @return
     */
    @Delete("delete from user_info where id = #{id}")
    int deleteUserInfo(Integer id);

    /**
     * 获取
     * @param id
     * @return
     */
    @Select("select * from user_info where id = #{id}")
    UserInfo getUserInfoById(Integer id);

    /**
     * 获取全部
     * @return
     */
    @Select("select * from user_info")
    List<UserInfo> getALLUserInfo();

    /**
     * 更新
     * @param userInfo
     * @return
     */
    @Update("update user_info set userName = #{userName}, passWord = #{passWord}, regDate = #{regDate} where id = #{id}")
    void updateUserInfo(UserInfo userInfo);
}

6、编写 mybatis 工具类


/**
 * @Author: LOMTOM
 * @Date: 2020/4/20
 * @Time: 15:49
 * @Email: lomtom@lomtom.cn
 */
public class MybatisUtils {
    private static SqlSessionFactory sqlSessionFactory = null;
    static {
        try {
            Reader reader = Resources.getResourceAsReader("mybatis-config.xml");
            sqlSessionFactory =  new SqlSessionFactoryBuilder().build(reader);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static SqlSession getSession() {
        return sqlSessionFactory.openSession();
    }
}

7、编写测试类

首先,需要加入必不可少的依赖

        <!--        测试-->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </dependency>

新建 Test.java

/**
 * @Author: LOMTOM
 * @Date: 2020/4/20
 * @Time: 15:44
 * @Email: lomtom@lomtom.cn
 */


public class MybatisTest {


    @Test
    public void testAddUserInfoAnnotation(){
        SqlSession sqlSession= MybatisUtils.getSession();
        UserInfoMapperAnnotation userInfoMapper = sqlSession.getMapper(UserInfoMapperAnnotation. class);
        UserInfo userInfo= new UserInfo();
        userInfo.setUserName("qq小冰");
        userInfo.setPassWord("123");
        userInfo.setRegDate(new Date());
        int i= userInfoMapper.addUserInfo(userInfo);
        System. out. println (i+ " record has inserted !");
        sqlSession.commit();
        sqlSession.close();
    }


    @Test
    public void testGetUserInfoByIdAnnotation(){
        SqlSession sqlSession= MybatisUtils.getSession();
        UserInfoMapperAnnotation userInfoMapper = sqlSession.getMapper(UserInfoMapperAnnotation. class);
        System.out.println(userInfoMapper.getUserInfoById(1));
        System. out. println ("record has got !");
        sqlSession.commit();
        sqlSession.close();
    }

    @Test
    public void testGetAllUserInfoAnnotation(){
        SqlSession sqlSession= MybatisUtils.getSession();
        UserInfoMapperAnnotation userInfoMapper = sqlSession.getMapper(UserInfoMapperAnnotation. class);
        System.out.println(userInfoMapper.getALLUserInfo());
        System. out. println ("record has got !");
        sqlSession.commit();
        sqlSession.close();
    }

    @Test
    public void testUpdateUserInfoAnnotation(){
        SqlSession sqlSession= MybatisUtils.getSession();
        UserInfoMapperAnnotation userInfoMapper = sqlSession.getMapper(UserInfoMapperAnnotation. class);
        UserInfo userInfo= new UserInfo();
        userInfo.setId(1);
        userInfo.setUserName("qq大冰");
        userInfo.setPassWord("123456");
        userInfo.setRegDate(new Date());
        try {
            userInfoMapper.updateUserInfo(userInfo);
            System. out. println ("record has updated !");
        }catch (Exception e){
            e.printStackTrace();
        }
        sqlSession.commit();
        sqlSession.close();
    }

    @Test
    public void testDeleteUserInfoAnnotation(){
        SqlSession sqlSession= MybatisUtils.getSession();
        UserInfoMapperAnnotation userInfoMapper = sqlSession.getMapper(UserInfoMapperAnnotation. class);
        int i= userInfoMapper.deleteUserInfo(1);
        System. out. println (i+ " record has deleted !");
        sqlSession.commit();
        sqlSession.close();
    }

你可能会出现的问题

问题一:mysql 客户端版本过低

描述:

MySQLNonTransientConnectionException: Client does not support authentication protocol requested by server; consider upgrading MySQL client

分析: 这是前面一直强调的 mysql 驱动包的,一定要根据自己的 mysql 版本导入相应的 mysql 驱动包 解决: 我的是 version 8,而我用的是 5 的驱动包,更改驱动包后解决

写在最后

关注公众号:博奥思园 ,精彩内容不错失

你的支持是作者最大的动力

标题:【mybatis annotation】数据层框架应用--Mybatis(二) 基于注解实现数据的CRUD

作者:lomtom

链接:https://lomtom.cn /mybatis-annotation数据层框架应用--mybatis二-基于注解实现数据的crud