zoukankan      html  css  js  c++  java
  • 【mybatis annotation】数据层框架应用--Mybatis(二) 基于注解实现数据的CRUD

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

    你需要了解的知识点

    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@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属性文件中的配置来替换,

    请根据自己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@qq.com
     */
    public interface UserInfoMapperAnnotation {
    
        /**
         * 插入
         * @param userInfo
         * @return
         */
        @Insert(" insert into user_info(userName, passWord, regDate)
    " +
                "        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@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、编写测试类

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

            <!--        测试-->
            <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@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客户端版本过低

    描述:

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

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

    写在最后

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

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

  • 相关阅读:
    新手如何运营自媒体?必看!
    公众号停更,短视频岗位暴增,2020年,新媒体人如何更值钱?
    别再费力讨好,先看看你的标题有没有入这些坑!
    经常反思自己的自媒体账号,为什么还只是几百的阅读量?
    文章发布显示“敏感词汇”怎么办?如何提升文章原创率?
    如何利用标题最大化引流,让属于自己原创、混剪视频的推荐量直线上升?
    【转载】JAVA字符串格式化-String.format()的使用
    【转载】浅谈大型网络入侵检测建设
    渗透测试工具 —— Nmap
    【转载】任意用户密码重置的10种常见姿势
  • 原文地址:https://www.cnblogs.com/lomtom/p/12804029.html
Copyright © 2011-2022 走看看