前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >数据层框架应用--Mybatis(二) 基于注解实现数据的CRUD

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

作者头像
lomtom
发布于 2021-10-27 07:38:16
发布于 2021-10-27 07:38:16
59500
代码可运行
举报
文章被收录于专栏:博思奥园博思奥园
运行总次数:0
代码可运行

使用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的驱动包

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<!--        数据库  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(对应数据表userinfo)。UserInfo类包含一些属性(对应数据表userinfo的部分字段),以及与之对应的getXXX()和setXXX()方法,还可添加构造方法 。

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/**
 * @Author: LOMTOM
 * @Date: 2020/4/20
 * @Time: 15:12
 * @Email: lomtom@qq.com
 */
@Data
public class UserInfo {

    private Integer id;

    private String userName;

    private String passWord;

    private Date regDate;

}
3、创建属性文件jdbc.properties

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

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
请根据自己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的连接配置。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<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()方法
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/**
 * @Author: LOMTOM
 * @Date: 2020/4/26
 * @Time: 16:16
 * @Email: lomtom@qq.com
 */
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工具类
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/**
 * @Author: LOMTOM
 * @Date: 2020/4/20
 * @Time: 15:49
 * @Email: lomtom@qq.com
 */
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、编写测试类

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<!--        测试-->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </dependency>

新建Test.java

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/**
 * @Author: LOMTOM
 * @Date: 2020/4/20
 * @Time: 15:44
 * @Email: lomtom@qq.com
 */



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客户端版本过低

描述:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
MySQLNonTransientConnectionException: Client does not support authentication protocol requested by server; consider upgrading MySQL client

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

写在最后

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

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-05-03,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 博思奥园 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
【C语言】基本语法知识&&C语言函数&&操作符详解
首先介绍一下我使用的工具:VS2019——集成了很多的功能:编辑、编译、链接、运行、调试等
用户10925563
2024/06/04
3440
【C语言】基本语法知识&&C语言函数&&操作符详解
初识C语言
自己整理的C语言基础学习笔记,参考了挺多资料的,适合梳理知识框架,进而攻克各个知识点。
小孙同学
2022/01/14
4000
初识C语言
[工具推荐]NetAssist网络调试助手
http://free.cmsoft.cn/download/cmsoft/assistant/netassist5.0.2.zip
科控物联
2022/03/29
14.7K0
[工具推荐]NetAssist网络调试助手
2. 变量与运算符
在Java程序中 , 不同的基本数据类型(只有7中 , 不包含boolean类型)变量的值经常需要进行相互转换
捞月亮的小北
2023/12/01
2100
2. 变量与运算符
c 语言学习第三天
当我们定义了一个字符变量 c 为a时,打印的时候让它使整数形式显示。会出现怎么一个情况?
冬夜先生
2021/09/05
2170
串口调试工具推荐
在进行嵌入式开发时,总是要面对着来自终端的各种报文。不同的设备、终端厂商都有一套自己的报文协议,如何调试和测试是开发过程中很重要的事情,做好了事半功倍,做差了事倍功半。
happlyfox
2021/03/09
4.6K0
Python基础教程(补中秋的文章)
身份运算符用于比较两个对象是否为同一个对象。身份运算符共有两个:is和is not。
云深无际
2020/10/23
6850
Python基础教程(补中秋的文章)
C语言运算符优先级列表(超详细)
每当想找哪个运算符优先级高时,很多时候总是想找的就没有,真让人气愤!现在,终于有个我个人觉得非常全的,分享给大家。
全栈程序员站长
2022/11/09
9.7K0
C语言运算符优先级 详细列表
文章作者:姜南(Slyar) 文章来源:Slyar Home (www.slyar.com) 转载请注明,谢谢合作。
繁花云
2018/07/31
1.3K0
第二章 变量与运算符
例如 : 关键字 class , public , static , void 等早就已经被定义好的
捞月亮的小北
2023/12/01
1780
第二章 变量与运算符
初识C语言·2
signed和unsigned都是C语言中的关键字,它们的作用是决定字符或者整型的正负号。
_lazy
2024/10/16
1640
初识C语言·2
【必读】C语言基础知识大全
C语言程序的结构认识 用一个简单的c程序例子,介绍c语言的基本构成、格式、以及良好的书写风格,使小伙伴对c语言有个初步认识。 例1:计算两个整数之和的c程序: #include main() { int a,b,sum; /*定义变量a,b,sum为整型变量*/ a=20; /*把整数20赋值给整型变量a*/ b=15; /*把整数15赋值给整型变量b*/ sum=a+b; /*把两个数之和赋值给整型变量sum*/ printf(“a=%d,b=%d,su
老九君
2018/03/06
6.4K0
【必读】C语言基础知识大全
运算符优先级
优先级 运算符 名称或含义 使用形式 结合方向 说明 1 [] 数组下标 数组名[常量表达式] 左到右 () 圆括号 (表达式)/函数名(形参表) . 成员选择(对象) 对象.成员名 -> 成员选择(指针) 对象指针->成员名 2 - 负号运算符 -表达式 右到左 单目运算符 (类型) 强制类型转换
猿人谷
2018/01/17
7040
初识 C# 编程语言
  .NET是一种用于构建多种应用的免费开源开发平台,可以使用多种语言,编辑器和库开发Web应用、Web API和微服务、云中的无服务器函数、云原生应用、移动应用、桌面应用、Windows WPF、Windows窗体、通用 Windows平台 (UWP)、游戏、物联网 (IoT)、机器学习、控制台应用、Windows服务。
小孙同学
2022/01/14
21.6K0
初识 C# 编程语言
C语言入门
人与人之间交流需要通过语言,我们中国人之间交流用普通话,英国人用英语,俄国人用俄语等。
小颜同学
2023/08/21
1K0
C语言万字基础笔记总结(一)
当运算符左右两个操作数类型不同时,编译器会将它们共同转换位某种数据类型,通常情况下,会向精度较大的那个类型转化。
远方的星
2021/08/02
9270
C语言万字基础笔记总结(一)
如何深入掌握C语言操作符及表达式求值(详解)
2. 对于 / 操作符如果两个操作数都为整数,执行整数除法(相当于取余返回整数值)
用户9645905
2022/11/30
6610
如何深入掌握C语言操作符及表达式求值(详解)
Java入门(2)-- 语言基础
Java程序的基本组成单位是类,类体中又包括属性和方法两个部分。每个应用程序都必须包含一个main()方法,含有main()方法的类称为主类。
爱学习的程序媛
2022/04/07
5240
Java入门(2)-- 语言基础
【C语言】室友看了这操作符,连王者都不准备打 |
注意:数学上的是乘法(x),而在我们编程当中是星号(*)。 运行结果:Arabic numerals = 4
謓泽
2022/12/12
5910
【C语言】室友看了这操作符,连王者都不准备打 |
C语言常用的知识没多少之运算符与表达式
在现实中学完数数就要开始学习数的运算,如加减乘除等。C语言也有对数的运算,有算数运算、赋值运算、关系运算、逻辑运算、位运算、条件运算、逗号运算、sizeof运算。在此按照顺序讲解一些常用的运算。
用户5935416
2019/08/01
6360
C语言常用的知识没多少之运算符与表达式
相关推荐
【C语言】基本语法知识&&C语言函数&&操作符详解
更多 >
LV.1
这个人很懒,什么都没有留下~
目录
  • 使用MyBatis框架进行持久层开发
    • 你需要了解的知识点
      • 1、什么是SqlSessionFactory?
      • 2、为什么要使用注解版
    • 使用
      • 1、MyBatis下载
      • 2、创建实体类
      • 3、创建属性文件jdbc.properties
      • 4、创建XML映射配置文件
      • 5、创建Mapper接口
      • 6、编写mybatis工具类
      • 7、编写测试类
    • 你可能会出现的问题
      • 问题一:mysql客户端版本过低
    • 写在最后
    • 你的支持是作者最大的动力
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档