Mybatis的作用

一、Mybatis是什么?

  • Mybatis是一种持久层框架
  • Mybatis是一种ORM框架
  • Mybatis是增强版的JDBC
在对上面的进行一个解释:

持久层的目的就是,完成对象数据和关系数据的转换

也就是哪个类对应哪个表,哪个属性对应哪个列。

JDBC 就是官方定义的一套操作数据库的规范(API)

MyBatis 是一个基于 Java 的持久层框架。MyBatis 提供的持久层框架包括 SQL Maps 和 Data Access Objects(DAO),它消除了几乎所有的 JDBC 代码和参数的手工设置以及结果集的检索。

MyBatis 使用简单的 XML 或注解用于配置和原始映射,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java 对象)映射成数据库中的记录。

MyBatis 是一个半自动映射的框架,因为 MyBatis 需要手动匹配 POJO、SQL 和映射关系。

二、Mybatis主配置文件:
<?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">
<configuration>
    <environments default="development">
        <!-- 配置数据源  -->
        <environment id="development">

            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql:///pc"/>
                <property name="username" value="root"/>
                <property name="password" value="root"/>
            </dataSource>
        </environment>
    </environments>
    <!-- 映射文件路径 -->
    <mappers>
        <mapper resource="org/example/dao/mapper.xml"/>
    </mappers>
</configuration>
三、 Mybatis如何实现与数据库的数据交换

SqlSession是MyBatis的关键对象,似于JDBC中的Connection.它是应用程序与持久层之间执行交互操作的一个单线程对象,也是MyBatis执行持久化操作的关键对象。

因此,要实现Mybatis和数据库之间的数据操作,获取SqlSession对象是必不可少的一部分。

对于SqlSession对象的获取:

    SqlSessionFactoryBuilder builder=new SqlSessionFactoryBuilder();//SqlSessionFactoryBuilder对象可直接new
    InputStream inputstream=Resources.getResourceAsStream(String resource);//将映射文件转化为InputStream输出流,该方法会的调用过程中会抛出异常
    SqlSessionFactory factory=builder.build(InputStream inputstream);//SqlSessionFactoryBuilder对象的build(InputStream)方法,调用InputStream输出流生成SqlSessionFactory
    SqlSession session=factory.openSession();//SqlSessionFactory对象的openSession()方法,生成SqlSession对象。

考虑到SqlSession是一个单线程的,即每次会话都需要创建一个。而每一个MyBatis的应用程序都以一个SqlSessionFactory对象的实例为核心.同时SqlSessionFactory也是线程安全的,SqlSessionFactory一旦被创建,应该在应用执行期间都存在.或者是从资源利用方面来说,SqlSession都不宜每次都创建。因此较好的一个方法是:创建一个工具类,在该类中建议使用单例模式.或静态代码块的方式来获取SqlSessio对象。.

工具类创建如下:

package org.example.config;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import java.io.IOException;
import java.io.InputStream;
public class Utils {
    public static SqlSessionFactory factory=null;
    public static SqlSession getsession() throws IOException {
        InputStream stream=Resources.getResourceAsStream("mybatis.xml");
        if(factory == null)
        {
            factory=new SqlSessionFactoryBuilder().build(stream);
        }
        return factory.openSession();
    }
}

获取到SqlSession对象后,以下两种方式均可对数据库数据进行操作(以插入一个元组举例):

四、现在以往数据库插入数据为例:

一、利用接口实现类:
1.在dao层里创建持久层接口( 映射器接口 ):

package org.example.dao;
import org.example.pojo.Student;
import java.io.IOException;
public interface StudentDao {
    public void insertdao(Student st) ;
}

2.在dao层里的接口实现类中写相关的实现方法:

package org.example.dao;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.example.config.Utils;
import org.example.pojo.Student;
import java.io.IOException;
public class StudentDaoImple implements StudentDao {
    @Override
    public void insertdao(Student st)  {
        SqlSession session= null;//将SqlSession对象声明为全局变量
        try {					//try{ }catch{ }解决异常
            session = Utils.getsession();
        } catch (IOException e) {
            e.printStackTrace();
        }
   session.insert("insertdao",st);
      session.commit();			//将更改结果保存到数据库中
    }

3.映射器(即 mapper.xml )中添加SQL语句(即mapper.xml ):
MyBatis也支持使用注解来配置映射语句。当我们使用基于注解的映射器接口时,我们不再需要在XML配置文件中配置了。

	<?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">
<!-- namespace:填写映射当前的Mapper接口,所有的增删改查的参数和返回值类型,
		就可以直接填写缩写,不区分大小写,直接通过方法名去找类型-->
<mapper namespace="org.example.dao.Insertdao">

 <insert id="insert"  parameterType="org.example.pojo.Student" resultType="org.example.pojo.Student">
    insert into student(name,sex) values(#{name},#{sex})

 </insert>
</mapper>

这里的parameterType和resultType的值都是全限定类名,即包名加类名的格式(不定义别名的情况下)。

4.在测试类中测试:

	@Test
    public void inserttest(){
        Student stu = new Student(10, "2225", "男");//构建带参的Student对象
        StudentDaoImple in = new StudentDaoImple();//创建一个接口实现类对象
        in.insertdao(stu);						  //调用接口的insertdao()方法				
    }

二、动态代理

  1. 在dao层里创建持久层接口:
package org.example.dao;
import org.example.pojo.Student;
import java.io.IOException;
public interface StudentDao {
    public void insertdao(Student st) ;
}

2.映射文件中添加SQL语句(即mapper.xml):

	<?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">
<!-- namespace:填写映射当前的Mapper接口,所有的增删改查的参数和返回值类型,
		就可以直接填写缩写,不区分大小写,直接通过方法名去找类型-->
<mapper namespace="org.example.dao.Insertdao">

 <insert id="insert"  parameterType="org.example.pojo.Student">
    insert into student(name,sex) values(#{name},#{sex})

 </insert>
</mapper>

3.在测试类中测试:

   @Test
    public void inserttest() throws Exception {
        Student stu = new Student(10, "2225", "男");
        //StudentDaoImple in = new StudentDaoImple();
        //in.insertdao(stu);
        SqlSession session=Utils.getsession();
        StudentDao in=session.getMapper(StudentDao.class);//将 mapper.xml 生成接口的实现类,通过调用接口对象就可以获取 mapper.xml 中编写的 sql.
        in.insertdao(stu);
    }

分析可以看出,使用动态代理,免去了业务逻辑层中接口实现类的一系列操作。但是,使用mapper的动态代理,需要有一下条件:

1.namespace 必须和 接口全限定路径 ( 包名 + 类名 ) 一致
2. id 值 必须和 接口中方法名 相同
3.如果接口中方法为多个参数,可以省略 parameterType

同时,由于SqlSession对象是由factory.openSession()获取得到,进行数据操作后为了将结果保存至数据库,还需要session.commit()完成对数据库更新。

### MyBatis的主要作用及其在Java开发中的应用场景 #### 1. 主要作用 MyBatis 是一种基于 Java 的持久化框架,其主要作用在于简化数据库操作流程并提升开发效率。以下是 MyBatis 的几个核心功能: - **SQL 灵活管理** MyBatis 提供了对 SQL 语句的灵活管理能力,允许开发者通过 XML 文件或注解的方式自定义 SQL 查询[^4]。这种机制使得复杂的业务逻辑可以直接映射到对应的 SQL 上,减少了硬编码带来的复杂性。 - **对象关系映射 (ORM)** MyBatis 支持将 Java 对象与数据库表之间建立映射关系,使开发者无需手动处理 JDBC 结果集和实体类之间的转换工作[^4]。这不仅提高了代码的可读性,还降低了错误率。 - **高效的数据访问控制** 借助内置的连接池技术和缓存策略,MyBatis 能够显著优化数据库访问性能。它通过对数据库连接的有效管理和查询结果的缓存利用,减少不必要的开销。 - **高度可扩展性** 开发者可以通过插件机制(如拦截器)进一步增强 MyBatis 功能[^2]。例如,在不修改原有逻辑的情况下,可以轻松实现日志记录、权限校验等功能。 --- #### 2. 应用场景 MyBatis 在实际项目中有广泛的应用价值,尤其适用于以下几种情况: - **需要精确控制 SQL 执行的情况** 当应用程序涉及大量复杂查询或者特定于某种数据库的功能时,MyBatis 提供的手写 SQL 方式显得尤为重要[^3]。相比完全依赖 ORM 自动生成 SQL 的工具,这种方式更贴近底层需求。 - **中小型项目的快速开发** 鉴于 MyBatis 较低的学习曲线以及丰富的在线资源支持[^1],它是中小型企业构建后台服务的理想选择之一。即使团队成员缺乏深厚经验也能迅速上手。 - **多数据库兼容环境下的解决方案** 如果目标系统需同时对接多个不同类型的 RDBMS,则选用像 MyBatis 这样具备良好跨平台特性的库尤为关键[^4]。因为它的设计天然考虑到了各种主流 DBMS 特征差异。 - **高性能要求的任务** 凭借精细调整能力和强大的缓存体系结构,MyBatis 成为了追求极致速度表现系统的有力帮手。特别是在面对海量数据检索请求时表现出色。 --- ```python # 示例代码展示如何使用 MyBatis 实现基本 CRUD 操作 def insert_user(user_data): """ 插入新用户信息至数据库中。 :param user_data: 用户详情字典形式输入 """ sql = """INSERT INTO users(name, email) VALUES(#{name}, #{email})""" session.execute(sql, user_data) def fetch_all_users(): """ 获取所有用户的列表。 """ sql = "SELECT * FROM users" result = session.select_list(sql) return result ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值