一篇文章告诉你什么是Mybatis+Mybatis的搭建及使用

什么是Mybatis?

mybatis原是Apache的一个开源项目iBatis,2010年6月这个项目由Apache Software Foundation 迁移到了 Google Code,随着开发团队转投Google Code 旗下, iBatis3.x正式更名为MyBatis。是 一个基于Java的持久层框架。 iBatis提供的持久层框架包括SQL Maps和Data Access Objects(DAO)。

Mybatis概述

1.Mybatis是一款优秀的(数据)持久层框架,它支持定制化的SQL、存储过程以及高级映射。

2.Mybatis避免了几乎所有的JDBC代码手动获取参数以及结果集。

3.Mybatis可以使用简单的XML或注解来配置和映射原生信息,将接口和Java的POJO(Plain Old Java Objects,普通的java对象)映射成数据库的记录,是一种ORM(Object Relational Mapping,对象关系映射)实现。

4.Mybatis将基本的JDBC常用接口封装,对外提供操作即可。

5.Mybatis中文官网:https://mybatis.org/mybatis-3/zh/getting-started.html

传统的JDBC编程

我们首先来回顾一下传统JDBC编程的步骤:

1.加载数据库驱动(Mysql8的方式)

Class.forName("com.mysql.cj.jdbc.Driver");//利用反射机制加载Driver类,给的是类的地址

2.创建并获取数据库链接

String url = "jdbc:mysql://127.0.0.1:3306/school_db?characterEncoding=utf-8&useSSL=false&serverTimezone=UTC";
Connection connection = DriverManager.getConnection(url, "root", "root");

3.创建statement对象,拼接sql语句

PreparedStatement ps = connection.prepareStatement("delete from t_stu where s_name = ?");

4.设置sql语句中的占位符的值

ps.setString(1,name);

5.执行sql语句并获取结果

ResultSet rs =ps.executeQuery();

6.对sql执行结果进行解析处理

while(rs.next()){
	System.out.println("对执行sql的结果进行解析处理!")
}

7.关闭连接,释放资源。

通过我们对传统JDBC编程步骤的回顾,可以总结处以下四点问题:

1.数据库连接的频繁创建和释放造成了系统资源的浪费,进而影响系统性能。

2.SQL语句编写在Java代码中,这种硬编码造成代码不易维护,当SQL变动时需要修改Java源代码。

3.使用preparedStatement向占位符传参数存在硬编码,因为SQL语句的where条件中占位符的个数可能会改变。

4.对结果集解析存在硬编码,SQL语句改变会导致解析代码变化。

Mybatis的出现就可以很好的解决传统JDBC编程中出现的各种问题,这对于程序员专注业务和系统维护有着重大的意义。

MyBatis架构

MyBatis的架构从配置文件到底层java代码都是一环套一环的存在,下面的一幅图就是对此最完美的解析,一句话,读懂Mybatis架构图,会使你在学习Mybatis框架的过程中不迷茫。

在这里插入图片描述

MyBatis环境搭建

首先,我们需要创建一个Maven项目,可以参照maven介绍+maven开发环境的搭建+常用maven命令这篇文章创建maven项目。我们需要在pom.xml文件中导入相关联的jar包,一个是Mybatis的相关jar包,这是实现Mybatis框架的根基,其次我们还需要导入我们所使用数据库的JDBC驱动包,我这里以MySql驱动包为例。

<!--导入mybatis jar包-->
<dependency>
	<groupId>org.mybatis</groupId>
	<artifactId>mybatis</artifactId>
	<version>3.4.2</version>
</dependency>
<!-- mysql-connector-java mysql驱动包 -->
<dependency>
	<groupId>mysql</groupId>
	<artifactId>mysql-connector-java</artifactId>
	<version>8.0.16</version>
</dependency>

创建Mybatis全局配置文件

MyBatis的配置文件包含了对Mybatis行为的设置信息,即上图中的SqlMapConfig.xml文件。配置文件的顶层结构如下(所有的标签必须要按照特定的顺序排放,如果没有可以不写,如果有必须按照响应顺序)

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
    PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
    "http://mybatis.org/dtd/mybatis-3-config.dtd">

<!--
	mybatis框架核心配置文件的相关标签顺序
-->
<configuration>

  <!-- 1.properties (属性) -->
  <properties resource="config.properties"></properties>
  
  <!-- 2.settings (设置) -->
  <settings>
    <setting name="logImpl" value="LOG4J"/>
  </settings>

  <!-- 3.typeAliases (类型别名) -->
  <typeAliases>
    <package name="com.cwd.mybatis.bean"/>
  </typeAliases>

  <!-- 4.typeHandlers (类型处理器) -->
  
  <!-- 5.objectFactory (对象工厂) -->
    
  <!-- 6.plugins (插件) -->

  <!-- 7.environments (环境配置) -->
  <environments default="work">
    <!-- 7-1 environment (环境变量) -->
    <environment id="development">
      <!-- 7-2 transactionManager (事务管理器) -->
      <transactionManager type="JDBC"></transactionManager>
      <!-- 7-3 dataSource (数据源) -->
      <dataSource type="UNPOOLED">
        <property name="driver" value="" />
        <property name="url" value="jdbc:hsqldb:mem:batch_keys" />
        <property name="username" value="sa" />
      </dataSource>
    </environment>
  </environments>
    
  <!-- 8.databaseIdProvider (数据库厂商标识) -->

  <!-- 9.mappers (映射器) -->
  <mappers>
    <mapper resource="mapper/UserMapper.xml" />
  </mappers>
</configuration>

创建sql映射文件

我们在sql的映射文件中配置操作数据库的sql语句,这里的sql映射文件对应Mybatis架构中的mapper.xml文件。sql映射文件需要在MyBatis全局配置文件中进行加载,在上面的9.mappers标签中引入映射文件地址。同时我们需要为映射文件创建对应的java接口,用来在java代码中调用对应的方法进行数据库操作。

我们以UserMapper.xml为例:

1.新建一个UserDao.java接口,可以让java代码通过此接口调用对应方法进行数据库操作。

package com.cwd.mybatis.dao;

import com.cwd.mybatis.bean.User;
import org.apache.ibatis.annotations.Param;

import java.util.List;
import java.util.Map;

public interface UserDao {
    /*
      接口中的方法名与映射文件中 id名相同 <insert id="saveUser"
      接口中参数类型,返回值类型映射文件中相同
     */
    public void saveUser(User user);
}

2.新建UserMapper.xml映射文件

提示:需要往sql语句中传入参数时要区分#{}和${}

(1)#{}占位符,是经过预编译的,编译好SQL语句再取值,#方式能够防止sql注入;

(2) 拼 接 符 , 会 传 入 参 数 字 符 串 , 取 值 以 后 再 去 编 译 s q l 语 句 , {}拼接符,会传入参数字符串,取值以后再去编译sql语句, sql方式无法防止注入;

注意:排序时使用order by动态参数时要使用$而不是#

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<!-- mapper:根元素 namespace:接口存放路径 类路径-->
<mapper namespace="com.cwd.mybatis.dao.UserDao">
    <!--
     id="与接口中的方法名相同"
     ParameterType="参数的类型/基本类型可以不写"
    -->
    <insert id="saveUser" parameterType="com.cwd.mybatis.bean.User">
        insert into t_user(name,age,birthday) values(#{name},#{age},#{birthday});
    </insert>
    
    <!--
  		<insert id="唯一标识" parameterType="参数类型">插入语句标签</insert>
  		<update id="唯一标识" parameterType="参数类型">修改语句标签</update>
  		<delete id="唯一标识" parameterType="参数类型">删除语句标签</delete>
  		<select id="唯一标识" resultType="返回结果集类型">查询语句标签</select>
	-->
</mapper>

注意:映射文件中的mapper标签的namespace属性值对应着UserDao接口的包路径,因为我们是通过SqlSession的mapper接口的方式执行sql语句,而且insert标签的id属性值要与接口中定义的方法名一致,否则会找不到映射的SQL标签。

3.在Mybatis全局配置文件中配置sql映射文件

<!-- 9.mappers (映射器) -->
<mappers>
  <mapper resource="mapper/UserMapper.xml" />
</mappers>

测试使用Mybatis(java代码)

1.读取Mybatis全局配置文件

 Reader reader = Resources.getResourceAsReader("SqlMapConfig.xml");

2.创建SqlSessionFactory,用来封装mybatis的配置信息,创建SqlSession对象,由于创建SqlSessionFactory开销比较大,所以整个应用程序中只有一个实例

SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(reader);

3.创建SqlSession,每次与数据库交互都需要创建一个轻量级的SqlSession对象,意味着创建数据库会话,与数据库会话完毕后关闭。

SqlSession sqlSession = sessionFactory.openSession();

4.获取要使用的接口对象,从而调用对应的方法

UserDao userDao = sqlSession.getMapper(UserDao.class);
userDao.saveUser(user);

5.提交事务

sqlSession.commit();

6.关闭SqlSession

sqlSession.close();
  • 5
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值