首先需要下载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中的&改成&)
先来找点熟悉的东西
这四个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
//通过DBAccess中定义的获取sqlSession的方法来获取sqlSession对象:
SqlSession sqlSession = dbAccess.getSqlSession ();
2. 通过SqlSession对象来执行SQL语句;
在此之前,需要引入另一个东西:和SQL语句打交道的配置文件,Mybatis和JDBC最大的区别之一就在于SQL语句是写在配置文件中的,而JDBC是将SQL语句写死在代码中。
在和核心配置文件Configuration.xml的同目录下面,有一个User.xml文件,将其拷贝到项目中,并打开。仍然找到需要的东西,不需要的可以直接删除,后续要用到再进行补充。
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就是将这里的注释删掉,把它放开),最终的配置信息如下(当然这些所有的内容都是在
其中
3. 关闭SqlSession会话;
所有的配置文件都配置好之后,SQL语句才能正确地顺利地执行。
执行完SQL语句之后,需要关闭SqlSession会话,为了防止程序出现其它异常而不能正确关闭会话,因此将这部分代码写进finally代码块中:
if(sqlSession != null){
sqlSession.close();
}
这样一来,总算大功告成,而对于SQL语句中含有参数的情况,且看下篇文章:如何使用Mybatis替换JDBC(二)!