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

写在最后

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

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

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

  1. 【mybatis xml】数据层框架应用--Mybatis(三)关系映射之一对一关系映射

    实际的开发中,对数据库的操作常常会涉及到多张表,这在面向对象中就涉及到了对象与对象之间的关联关系. 针对多表之间的操作,MyBatis提供了关联映射,通过关联映射就可以很好的处理对象与对象之间的关联关 ...

  2. 【mybatis annotation】数据层框架应用--Mybatis(二) 基于注解实现数据的CRUD

    使用MyBatis框架进行持久层开发 MyBatis是支持普通SQL查询,存储过程和高级映射的优秀持久层框架. MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及对结果集的检索. MyBa ...

  3. 闭关修炼180天--手写持久层框架(mybatis简易版)

    闭关修炼180天--手写持久层框架(mybatis简易版) 抛砖引玉 首先先看一段传统的JDBC编码的代码实现: //传统的JDBC实现 public static void main(String[ ...

  4. int不可为null引发的 MyBatis做持久层框架,返回值类型要为Integer问题

    MyBatis做持久层框架,返回值类型要为Integer MyBatis 做持久层时,之前没注意,有时候为了偷懒使用了int类型做为返回的类型,这样是不可取的,MyBatis做持久层框架,返回值类型要 ...

  5. JAVA 利用反射自定义数据层框架

    之前的随笔一直都在介绍c#,主要公司最近的业务都是做桌面程序,那么目前c#中的WPF肯定是我做桌面程序的不二之选,做了半年的WPF,也基本摸清了c#写代码的套路和规则(本人之前是两年多的JAVA开发者 ...

  6. 持久层框架:MyBatis 3.2(2)

    每个MyBatis应用程序主要都是使用SqlSessionFactory实例的,一个SqlSessionFactory实例可以通过SqlSessionFactoryBuilder获得.SqlSessi ...

  7. 持久层框架:MyBatis 3.2(1)

    MyBatis 的前身就是 iBatis .是一个数据持久层(ORM)框架. iBATIS一词来源于“internet”和“abatis”的组合,是一个基于Java的持久层框架.iBATIS提供的持久 ...

  8. Java 持久层框架之 MyBatis

    MyBatis 简介 MyBatis 是一个基于 Java 的持久层框架,它内部封装了 JDBC,使开发者只需关注 SQL 语句本身,而不用再花费精力去处理诸如注册驱动.创建 Connection.配 ...

  9. 持久层框架之MyBatis

    1.mybatis框架介绍: MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并 ...

随机推荐

  1. 搜索引擎如何检索结果:Python和spaCy信息提取简介

    概览 像Google这样的搜索引擎如何理解我们的查询并提供相关结果? 了解信息提取的概念 我们将使用流行的spaCy库在Python中进行信息提取 介绍 作为一个数据科学家,在日常工作中,我严重依赖搜 ...

  2. Redis 集群--------Redis-cluster

    1集群方案 1.官方方案redis-cluster搭建实战 2.客户端分片技术(不推荐),扩容/缩容时,必须手动调整分片程序,出现故障不能自动转移 3.可以使用主从复制方式(不推荐) 4.使用一些代理 ...

  3. 自适应线性神经网络Adaline

    自适应线性神经网络Adaptive linear network, 是神经网络的入门级别网络. 相对于感知器, 采用了f(z)=z的激活函数,属于连续函数. 代价函数为LMS函数,最小均方算法,Lea ...

  4. NSObject常用方法

    类 @interface NSObject <NSObject> { Class isa OBJC_ISA_AVAILABILITY; } // 初始化加载 + (void)load; / ...

  5. 17.用cmd创建maven web工程

    1.跳转到需要创建maven工程的目录,输入 mvn archetype:generate 2.找到webapp的那一项,输入它的序号(这里是10) 3.输入groupId,artifactId,ve ...

  6. vue中的生命周期事件和钩子函数

    vue实例有一个完整的生命周期,也就是从开始创建.初始化数据.编译模板.挂载Dom.渲染->更新->渲染.卸载等一系列过程,我们称这是vue的生命周期.通俗的将就是vue实例从创建到销毁的 ...

  7. [ddt01篇]十年测试老鸟帮您解析:ddt数据驱动实现自动化测试入门基础应用

    一.什么是DDT数据驱动框架 ​ 全称:data driver test数据驱动测试框架,可以完美的应用于unittest框架实现数据驱动.ddt使用简介: 1.测试数据为多个字典的list类型 2. ...

  8. (二) vim的Tabbar插件

    关闭Tabbar中一个buffer的技巧: 如果你使用Tabbar的同时还集成了某种窗口分割插件(如 Winmanager,NERDTree)或者vim处于分栏显示状态,这时你想用传统的 :bd 或 ...

  9. Scratch2的鸡兔同笼

    解题思路鸡兔同笼新算法:已知共有鸡和兔15只,共有40只脚,问鸡和兔各有几只.算法:假设鸡和兔训练有素,吹一声哨,它们抬起一只脚,(40-15=25) .再吹一声哨,它们又抬起一只脚,(25-15=1 ...

  10. zabbix模板的自动发现规则(ldd)实现被监控项自动发现

    zabbix模板的自动发现规则(ldd)实现被监控项自动发现 自动发现规则(ldd)用途说明 在zabbix自带的linux模板的自动发现规则中,有一个Mounted filesystem disco ...