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

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

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


你须要了解的知识点

一、什么是SqlSessionFactory?

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

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

SqlSessionFactory对象是线程安全的,它一旦被建立,在整个应用执行期间都会存在。若是咱们屡次的建立同一个数据库的SqlSessionFactory,那么此数据库的资源将很容易被耗尽。为此,一般每个数据库都会只对应一个SqlSessionFactory,因此在构建SqlSessionFactory实例时,建议使用单列模式。git

二、MyBatis框架的核心配置文件

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

三、mapper映射文件

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

使用

一、MyBatis下载

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

方法一:能够从官方网站: https://github.com/mybatis下载所须要的MyBatis版本。数据库

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

<!--        数据库  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版本的驱动包
安全

二、建立实体类

在src目录下新建com.lomtom.mybatis.entity包,并在其中建立实体类UserInfo(对应数据表user_info)。UserInfo类包含一些属性(对应数据表user_info的部分字段),以及与之对应的getXXX()和setXXX()方法,还可添加构造方法 。
固然你若是使用lombok能够不写他的getter、setter以及constructor。session

/**
 * @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;

}

三、建立属性文件jdbc.properties

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

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

请根据本身mysql版本,确认以后再食用

一、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

二、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

四、建立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>元素配置多种数据源,即配置多种数据库。

五、建立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的值应该是集合所包含的元素类型,而不能是集合自己。

六、建立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);
}

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

八、编写测试类

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

<!--        测试-->
        <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>

写在最后

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

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

相关文章
相关标签/搜索