MyBatis入门(手写框架)

     在看完老杜的mybatis手写框架之后也对mybatis底层运行逻辑有了更深的了解,在这里我仅做mybatis快速入门以及手撕mybatis框架的详细步骤,其他的关于mybatis框架使用规则及技巧会在后期的文章中写。

MyBatis入门程序

(1)既然要使用mybatis框架,我们就要使用mybatis相关jar包,同时mybatis框架是关联数据库的一个框架,那自然还需要引入mysql相关jar包,这就需要使用到maven来引入这些jar包。<artifactId>分别为mybatis和mysql-connector-j。

(2)一般想要成功使用框架,我们都会取配置相关XML配置文件,就和Spring框架一样。我们从mybatis提供的入门手册可知我们要从XML中配置SqlSessionFactory,这一步需要编写mybatis核心配置文件:mybatis-config.xml。

        mybatis中有两个主要的配置文件:
        其中一个是mybatis-config.xml,这是核心配置文件,主要配置连接数据库的信息等(一个配置文件)
        另一个是XxxxMapper.xml,这个文件是专门用来编写SQL语句的配置文件(一个表对应一个配置文件)

(3)配置mybatis-config.xml和XxxMapper.xml配置文件,我们先配置mybatis-config.xml,又称为mybatis核心配置文件:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "https://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.cj.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/t_car"/>
                <property name="username" value="root"/>
                <property name="password" value="ryy"/>
            </dataSource>
        </environment>
    </environments>

    <mappers>
        <mapper resource="CarMapper.xml"/>
    </mappers>
</configuration>

 mybatis-config.xml中标签的解释

(1)<environments>和<environment>都是配置数据库环境,<environments>中的default参数意为创建SqlSessionFactory对象时,未指定环境的话,默认就使用哪个环境,这里的值是和<environment>中的id对应的,一个<environment>对应了一个数据库。通俗来说就是默认会匹配哪个数据库进行连接。


(2)<transactionManager>:这里配置的是mybatis的事务管理机制,数据库中都有事务管理,因此在mybatis框架中也必须配置。这里的type属性值包括两个:JDBC和MANAGED。

JDBC:mybatis框架自己管理事务,自己采用原生的JDBC代码去管理事务

                conn.setAutoCommit(false); //开启事务

                conn.commit(); //手动提交事务

Managed:mybatis不再负责事务的管理了,事务管理交给其他容器来负责,例如Spring。


(3)<dataSource>:dataSource的作用是为程序提供Connection对象的,又称为配置数据源。

我们自己也可以编写数据源组件,只要实现javax.sql.DataSource接口就行了,实现接口当中的所有方法,这样就有了自己的数据源(比如可以写一个属于自己的数据库连接池)【在后面手写框架会使用到】。

dataSource的type属性指定数据源类星星其实就是指定使用哪个数据库连接池,type属性有三个值,必须是三选一:UNPOOLED,POOLED,JNDI。

UNPOOLED:不使用数据库连接池技术,每次请求过来就创建新的Connection对象。

POOLED:使用mybatis自己实现的数据库连接池。

JNDI:即成其他第三方的数据库连接池。(*JNDI是一套规范,大部分的web容器实现了JNDI规范,如tomcat,Jetty等服务器)


(4)<property>:这个标签就是配置连接数据库的具体信息了,具体写法和JDBC的写法一致。


(5)<mapper>:这个标签就是指定XxxMapper.xml文件的路径,而等会会讲到XxxMapper.xml里面配置的就是各种sql语句。核心配置文件通过这个标签来给数据库发送信息或接收信息。


XxxMapper.xml中标签解释

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

<mapper namespace="org.mybatis.example.BlogMapper">

    <!--insert语句,id是这条sql语句的唯一标识,这个id就代表了这条sql语句-->
    <insert id="insertCar">
        insert into t_car(id,car_num,brand,guide_price,produce_time,car_type)
        values(null,'1003','丰田霸道',30.0,'2000-10-11','燃油车')
    </insert>
</mapper>

namespace作用:如果不同的配置文件中出现了id相同的sql,此时可用namespace+id的方式来指定对应的sql语句(即防止id重复,这里命名就是BlogMapper.insertCar)


<insert><update><delete><select>这些标签都是执行CRUD操作的标签,这在mysql数据库中也很常见。在标签中我们写上sql语句,但是一般sql语句不按照我上面那个例子写,一般的写法如下:

<mapper namespace="user">

    <!--insert语句,id是这条sql语句的唯一标识,这个id就代表了这条sql语句-->
    <insert id="insertUser">
        insert into t_user values(#{id},#{name},#{age})
    </insert>

    <!--select查询语句-->
    <select id="selectById" resultType="org.god.ibatis.pojo.User">
        select * from t_user where id = #{id}
    </select>
</mapper>

在mybatis中,我们使用#{}的形式来代替JDBC的带有?的写法。


MyBatis实现CRUD:

我们在这里需要知道一个思想叫ORM(对象关系映射思想):

O指Object,JVM中的java对象;

R指Relational,关系型数据库;

M指Mapping,映射。

由上图可知我们需要一个POJO类,数据库表中的字段应该和POJO类属性一一对应,然后用setter, getter等方法对数据进行封装。


 以上面我提到的user表的例子来看,我们可以清晰得看到我们创建得pojo类中需要三个属性分别是id,name,age。

注:#{}里要写的是pojo类中创建得属性名:#{id},#{name},#{age}。后期手撕框架的时候我们会知道实际底层找的是属性对应的getter方法并把get去掉后把剩余单词首字母变小写,也就是说mybatis在底层给?赋值的时候先调用pojo类的getter方法来获取值。


然后我们可以在测试类中创建pojo对象并给对象赋值发送给数据库:(执行sql语句)

User user = new User("1112", "zhangsan", "20");
int count = sqlSession.insert("user.insertUser", user);

编写MyBatis程序:

(5)编写mybatis程序:

在mybatis中,负责执行sql语句的那个对象叫做SqlSession(Java程序和数据库之间的一次会话)。
想要获取SqlSession对象,需要先获取SqlSessionFactory对象,通过该工厂类来生产SqlSession对象。

通过SqlSessionFactoryBuilder的build方法,来获取一个SqlSessionFactory对象。

以这三步曲去编写主程序代码:

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 MyBatisIntroduction {
    public static void main(String[] args) throws IOException {

        //获取SqlSessionFactoryBuilder对象
        SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();

        //读取配置文件作为输入流
        InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
        SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(is);

        //获取SqlSession对象
        SqlSession sqlSession = sqlSessionFactory.openSession();

        //执行sql语句
        int count = sqlSession.insert("insertCar");

        System.out.println(count);

        //手动提交事务
        sqlSession.commit(); 
    }
}

手写MyBatis框架

在编写完mybatis程序后,我们也应该要了解一下其底层运行逻辑是什么,接下来我将通过总共13步来带着大家一起手写mybatis框架,在这之前我们需要有的预备知识是如何通过dom4j解析XML文件。

dom4j解析XML文件

(1)创建SAXReader对象

SAXReader reader = new SAXReader();

(2)获取输入流

InputStream is = ClassLoader.getSystemClassLoader().getResourceAsStream("mybatis-config.xml") ;

(3)读XML文件,返回document对象,代表了整个XML文件

Document document = reader.read(is); 

(4)获取default默认的环境id

//xpath是做标签路径匹配的,能够让我们快速定位XML文件中的元素

//如下的xpath代表了:从根路径下开始找configuration标签,然后找configuration标签下的子标签environments

String xpath = "/configuration/environments";

E

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值