zoukankan      html  css  js  c++  java
  • 【mybatis xml】数据层框架应用--Mybatis 基于XML映射文件实现数据的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框架的核心配置文件

    在MyBatis框架的核心配置文件中,元素是配置文件的根元素,其他元素都要在元素内配置。

    3、mapper映射文件

    在映射文件中,元素是映射文件的根元素,其他元素都是它的子元素。

    使用

    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"/>
        </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 resource="com/lomtom/mybatis/mapper/UserInfoMapper.xml"/>
        </mappers>
    </configuration>
    
    1. <typeAliases>元素用于为配置文件中的Java类型设置一个简短的名字,即设置别名。别名的设置与XML配置相关,其使用的意义在于减少全限定类名的冗余。
      当POJO类过多时可以指定一个包名,MyBatis 会在包名下面搜索需要的 Java Bean。每一个在包 中的 Java Bean,在没有注解的情况下,会使用 Bean 的首字母小写的非限定类名来作为它的别名。若有注解,则别名为其注解值

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

    5、创建SQL映射的XML文件

    resources包中创建SQL映射的XML文件userInfoMapper.xml。

    <mapper namespace="com.lomtom.mybatis.mapper.UserInfoMapper">
        <!--数据表 user_info的CRUD操作-->
        <insert id="addUserInfo" parameterType="com.lomtom.mybatis.entity.UserInfo">
            insert into user_info(userName, passWord, regDate)
            values(#{userName},#{passWord}, #{regDate})
        </insert>
    
        <delete id="deleteUserInfo" parameterType="int">
            delete from user_info where id = #{id}
        </delete>
    
        <update id="updateUserInfo" parameterType="com.lomtom.mybatis.entity.UserInfo">
            update user_info set userName = #{userName}, passWord = #{passWord}, regDate = #{regDate} where id = #{id}
        </update>
    
        <select id="getUserInfoById" parameterType="int" resultType="com.lomtom.mybatis.entity.UserInfo">
            select * from user_info where id = #{id}
        </select>
    
        <select id="getALLUserInfo" resultType="com.lomtom.mybatis.entity.UserInfo">
            select * from user_info
        </select>
    </mapper>
    

    在上述SQL映射文件中,

    • <insert>元素用于映射插入语句,
    • <delete>元素用于映射删除语句,
    • <update>元素用于映射更新语句,
    • <select>元素用于映射查询语句。

    在这些元素中,id属性设置在命名空间中唯一的标识符,用于引用这条语句。

    • parameterType属性指定传入这条语句的参数类的完全限定名或别名。
    • resultType属性指定从这条语句中返回的期望类型的类的完全限定名或别名,若查询结果是集合,则resultType的值应该是集合所包含的元素类型,而不能是集合本身。

    6、创建Mapper接口

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

    • testAddUserInfo()方法
    • testGetUserInfoById()方法
    • testGetAllUserInfo()方法
    • testUpdateUserInfo()方法
    • testDeleteUserInfo()方法
    
    /**
     * @Author: LOMTOM
     * @Date: 2020/4/20
     * @Time: 15:24
     * @Email: lomtom@qq.com
     */
    public interface UserInfoMapper {
    
        /**
         * 插入
         * @param userInfo
         * @return
         */
        int addUserInfo(UserInfo userInfo);
    
        /**
         * 删除
         * @param id
         * @return
         */
        int deleteUserInfo(Integer id);
    
        /**
         * 获取
         * @param id
         * @return
         */
        UserInfo getUserInfoById(Integer id);
    
        /**
         * 获取全部
         * @return
         */
        List<UserInfo> getALLUserInfo();
    
        /**
         * 更新
         * @param userInfo
         * @return
         */
        void updateUserInfo(UserInfo userInfo);
    }
    

    7、编写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();
        }
    }
    
    

    8、编写测试类

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

            <!--        测试-->
            <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 testAddUserInfo(){
            SqlSession sqlSession= MybatisUtils.getSession();
            UserInfoMapper userInfoMapper = sqlSession.getMapper(UserInfoMapper. 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 testGetUserInfoById(){
            SqlSession sqlSession= MybatisUtils.getSession();
            UserInfoMapper userInfoMapper = sqlSession.getMapper(UserInfoMapper. class);
            System.out.println(userInfoMapper.getUserInfoById(1));
            System. out. println ("record has got !");
            sqlSession.commit();
            sqlSession.close();
        }
    
        @Test
        public void testGetAllUserInfo(){
            SqlSession sqlSession= MybatisUtils.getSession();
            UserInfoMapper userInfoMapper = sqlSession.getMapper(UserInfoMapper. class);
            System.out.println(userInfoMapper.getALLUserInfo());
            System. out. println ("record has got !");
            sqlSession.commit();
            sqlSession.close();
        }
    
        @Test
        public void testUpdateUserInfo(){
            SqlSession sqlSession= MybatisUtils.getSession();
            UserInfoMapper userInfoMapper = sqlSession.getMapper(UserInfoMapper. 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 testDeleteUserInfo(){
            SqlSession sqlSession= MybatisUtils.getSession();
            UserInfoMapper userInfoMapper = sqlSession.getMapper(UserInfoMapper. class);
            int i= userInfoMapper.deleteUserInfo(1);
            System. out. println (i+ " record has deleted !");
            sqlSession.commit();
            sqlSession.close();
        }
    }
    

    你可能会出现的问题

    问题一:找不到mapper映射文件

    描述:

    ### The error may exist in com/lomtom/mybatis/mapper/UserInfoMapper.xml
    ### Cause: org.apache.ibatis.builder.BuilderException: Error parsing SQL Mapper Configuration. Cause: java.io.IOException: Could not find resource com/lomtom/mybatis/mapper/UserInfoMapper.xml
    

    分析: idea对目录结构里的存放的文件类型有要求,mapper文件必须放入到resources目录里
    解决: 在pom.xml中加入资源解析,**/*.xml 代表src/main/java底下全部目录下的全部xml文件

        <build>
            <!--        解决读取不到main里面的xml-->
            <resources>
                <resource>
                    <directory>src/main/java</directory>
                    <includes>
                        <include>**/*.xml</include>
                    </includes>
                    <filtering>false</filtering>
                </resource>
            </resources>
        </build>
    

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

    描述:

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

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

    问题三:提示找不到UserInfo

    描述:

    ### The error may exist in com/lomtom/mybatis/mapper/UserInfoMapper.xml
    ### Cause: org.apache.ibatis.builder.BuilderException: Error parsing SQL Mapper Configuration. Cause: org.apache.ibatis.builder.BuilderException: Error parsing Mapper XML. The XML location is 'com/lomtom/mybatis/mapper/UserInfoMapper.xml'. Cause: org.apache.ibatis.builder.BuilderException: Error resolving class. Cause: org.apache.ibatis.type.TypeException: Could not resolve type alias 'UserInfo'.  Cause: java.lang.ClassNotFoundException: Cannot find class: UserInfo
    

    分析: 这是因为找不到UserInfo类导致的,如果parameterType是UserInfo,原则上使用小写开头的就不会报错,如果报错的话需要将其路径写完整,即包名加类名com.lomtom.mybatis.entity.UserInfo

        <insert id="addUserInfo" parameterType="UserInfo">
            insert into user_info(userName, passWord, regDate)
            values(#{userName},#{passWord}, #{regDate})
        </insert>
    

    解决:修改parameterType参数

        <insert id="addUserInfo" parameterType="com.lomtom.mybatis.entity.UserInfo">
            insert into user_info(userName, passWord, regDate)
            values(#{userName},#{passWord}, #{regDate})
        </insert>
    

    写在最后

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

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

  • 相关阅读:
    7月15日考试 题解(链表+状压DP+思维题)
    暑假集训日记
    C# .NET 使用 NPOI 生成 .xlsx 格式 Excel
    JavaSE 基础 第42节 局部内部类
    JavaSE 基础 第41节 匿名内部类
    JavaSE 基础 第40节 内部类概述
    JavaSE 基础 第39节 接口的应用
    JavaSE 基础 第38节 接口的实现
    JavaSE 基础 第37节 接口概述
    JavaSE 基础 第36节 抽象类概述与使用
  • 原文地址:https://www.cnblogs.com/lomtom/p/12770516.html
Copyright © 2011-2022 走看看