如何使用Mybatis替换JDBC(一)

Mybatis初学笔记-如何使用Mybatis替换JDBC

首先需要下载Mybatis(下载地址:https://github.com/mybatis/mybatis-3/releases),在下载Mybatis的文件中找到核心配置文件(位置:F:\MyBatis\mybatis-3-mybatis-3.5.4\mybatis-3-mybatis-3.5.4\src\test\java\org\apache\ibatis\submitted\complex_property)“Configuration.xml”导入到项目包(可新建一个专门用于存放配置文件的package)中。打开配置文件,由于是初学,因此将不需要的东西注释掉(<!-- -->),只需要留下:

(关于url的值报错The reference to entity "serverTimezone" must end with the ';' delimiter.是由于在xml文件中的&符号需要进行转义了才能正常使用,因此需要将value中的&改成&amp;)

  <environments default="development">
    <environment id="development">
      <transactionManager type="JDBC">
        <property name="" value=""/>
      </transactionManager>
      <dataSource type="UNPOOLED">
        <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
        <property name="url" value="jdbc:mysql:///micro_message?useSSL=false&amp;serverTimezone=UTC"/>
        <property name="username" value="root"/>
        <property name="password" value=""/>
      </dataSource>
    </environment>
  </environments>

先来找点熟悉的东西<dataSource>标签,其中:
        <property name="driver" value="com.mysql.cj.jdbc.Driver"/>//这一行表示jdbc的驱动程序,不同的mysql版本有不同的写法
        <property name="url" value="jdbc:mysql:///micro_message?useSSL=false&amp;serverTimezone=UTC"/>//表示数据库的地址,不同的mysql版本有不同的写法
        <property name="username" value="root"/>//数据库的登录账户
        <property name="password" value=""/>//数据库登录的密码

这四个property标签中的内容只需要对应着JDBC中的进行替换就好了。

再继续往下之前,先来分析Dao层的需求,或者说是Dao层应该做什么?

Dao层实际上只需要负责:a. 对象能与数据库交互; b. 能执行SQL语句这两点功能。

那么Mybatis如何向Dao层提供这样一个对象的?提供的这个对象又叫什么?

答案是SqlSession

SqlSession的作用:

a. 如果使用JDBC的方式,那么需要一个对象来对预编译的SQL语句中的参数“?”赋值,那么SqlSession同样的具备这样的能力;

b. 传入参数之后,自然需要具备执行SQL语句的能力;

c. 执行SQL语句之后,需要能够获取执行结果的能力;

d. 同时SqlSession还具备对事务的控制能力;

那么如何获取SqlSession对象?

为了更好的区分JDBC和Mybatis,新建一个名为db的package,在该包下面新建一个名为DBAccess的类,也就是真正和数据库打交道的类,在DBAccess类中,编写getSqlSession()方法,方法中需要实现下面三步,即可获得SqlSession对象。

1. 通过配置文件(Configuration.xml)获取数据库连接信息

Reader reader = Resources.getResourceAsReader("com/test/config/Configuration.xml");

//配置文件的路径需要从根包开始,Resources.getResourceAsReader是Mybatis的内置方法,该对象获取到的是一个Reder类型的对象

2. 通过配置信息构建SqlSessionFactory

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

//通过SqlSessionFactoryBuilder来Build配置信息对象,从而创建出一个SqlSessionFactory类型的对象sqlSessionFactory

3. 通过sqlSessionFactory打开一次数据库会话

sqlSession sqlSession = sqlSessionFactory.openSession();

4. 返回会话对象sqlSession

那么在得到了sqlSession 对象之后如何来使用它?

既然是替换,那么首先在Dao层中,将原来使用JDBC的方法注释掉,重新创建一个同名同参数同返回值类型的方法,方法体中使用Mybatis方式来实现之前JDBC的功能。

在这个方法中,需要做三件事情:

1. 获取SqlSession对象:

//实例化DBAccess和查询结果对象:

DBAccess dbAccess = new DBAccess();

List<Message> messageList = new ArrayList<Message>();

//通过DBAccess中定义的获取sqlSession的方法来获取sqlSession对象:

SqlSession sqlSession = dbAccess.getSqlSession ();

2. 通过SqlSession对象来执行SQL语句;

在此之前,需要引入另一个东西:和SQL语句打交道的配置文件,Mybatis和JDBC最大的区别之一就在于SQL语句是写在配置文件中的,而JDBC是将SQL语句写死在代码中。

在和核心配置文件Configuration.xml的同目录下面,有一个User.xml文件,将其拷贝到项目中,并打开。仍然找到需要的东西,不需要的可以直接删除,后续要用到再进行补充。

<mapper namespace="Message">

  <resultMap type="com.test.bean.Message" id="MessageResult">
    <id column="ID" jdbcType="INTEGER" property="id"/>
    <result column="COMMAND" jdbcType="VARCHAR" property="command"/>
    <result column="DESCRIPTION" jdbcType="VARCHAR" property="description"/>
    <result column="CONTENT" jdbcType="VARCHAR" property="content"/>
  </resultMap>

  <select id="queryMessageList" resultMap="MessageResult">
    SELECT ID, COMMAND, DESCRIPTION, CONTENT FROM MESSAGE WHERE 1=1
  </select>

</mapper>

select 标签,id表示该条select语句的名字,用于java代码中的SqlSession通过这个名称来调用这条语句;parameterType此处不涉及参数,暂时删除掉这一属性,有参数的情况请看下篇文章:如何使用Mybatis替换JDBC(二);resultMap对应resultMap标签的id;

resultMap 标签,type表明mysql中对应java中哪一个类对应的对象属性;id对此标签命名;

resultMap 中的子标签,一共有两种标签,id和result:

    id:对应数据库表中的主键;

    result为普通列;

id和result 中的属性:

    column:对应数据库表中的列名;

    jdbcType:对应数据库表中的数据类型;

    property:对应java对象中的属性名;

mapper 标签,namespace:用于区分使用某一个SQL语句

对于select标签中的select语句,没有参数的情况下,可以直接使用JDBC中的SQL语句,有参数的情况请看下篇文章:如何使用Mybatis替换JDBC(二)

终于修改好配置文件,接下来在java代码中来实现执行SQL语句:

通过DBAccess中定义的获取sqlSession的方法来获取sqlSession对象之后,通过这个对象来执行SQL语句:

messageList = sqlSession.selectList(Message.qureyMessageList);

//selectList:根据SQL语句的类型来决定,如果是update则是update,如果返回类型是列表类型,则加上List;

//括号中的内容Message.qureyMessageList:定位到指定的SQL语句,其中Message为配置文件中mapper标签中的namespace属性的值,qureyMessageList 为SQL语句所在标签(此处为select)id的值。

通过这一行代码即实现了执行SQL语句了吗?貌似少了点什么东西。

我们现在只是在Message.xml(即User.xml,根据自己命名)文件中配置了执行SQL语句相关的东西,但是如果在核心配置文件Configuration.xml中没有将Message.xml配置进去,是无法读到Message.xml的因此我们还需要在Configuration.xml中将Message.xml配置进去。如下:

在之前注释掉的东西里面找到mappers标签,将其解注释(emm就是将这里的注释删掉,把它放开),最终的配置信息如下(当然这些所有的内容都是在<configuration></configuration>标签中的):

  <environments default="development">
    <environment id="development">
      <transactionManager type="JDBC">
        <property name="" value=""/>
      </transactionManager>
      <dataSource type="UNPOOLED">
        <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
        <property name="url" value="jdbc:mysql:///micro_message?useSSL=false&amp;serverTimezone=UTC"/>
        <property name="username" value="root"/>
        <property name="password" value=""/>
      </dataSource>
    </environment>
  </environments>

  <mappers>
    <mapper resource="com/test/config/sqlxml/Message.xml"/>
  </mappers>

其中<mapper>标签中的resource的值即为Message.xml的路径(从根包算起)。

3. 关闭SqlSession会话;

所有的配置文件都配置好之后,SQL语句才能正确地顺利地执行。

执行完SQL语句之后,需要关闭SqlSession会话,为了防止程序出现其它异常而不能正确关闭会话,因此将这部分代码写进finally代码块中:

if(sqlSession != null){
    sqlSession.close();
}

这样一来,总算大功告成,而对于SQL语句中含有参数的情况,且看下篇文章:如何使用Mybatis替换JDBC(二)

[参考视频]:https://www.imooc.com/video/2585

原创文章 6 获赞 12 访问量 806

猜你喜欢

转载自blog.csdn.net/qq_40602986/article/details/106025766