您的位置:首页 > 其它

【mybatis xml】数据层框架应用--Mybatis 基于XML映射文件实现数据的CRUD

2020-04-24 21:59 701 查看

使用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>

    写在最后

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

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

    内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
    标签: 
    相关文章推荐