mybatis是一个持久层框架,其主要思想就是想将程序中大量的SQL语句剥离出来,配置在配置文件中,实现SQL的灵活配置.
使得SQL与程序代码分离,即在不修改程序代码的情况下,直接在配置文件中修改SQL.
mybatis的搭建步骤
下载jar包并部署包
mybatisjar下载网址:https://github.com/mybatis/mybatis-3/releases,mybatis压缩包解压后结构目录如下
此外lib目录下存放着编译依赖包如下
最后只需把jar包放入项目的此lib 目录下即可
或者选中项目右键 build path
进入此窗口
单击第二个按钮直接从本地进行添加jar,亦或者按下按钮从此工作空间的项目中选择jar进行添加
编写mybatis核心配置文件
在此之前需要调整下xml的代码提示(引入dtd文件)
请先看第6点
- 选择window → preferences
- 搜索xml → xml catalog出现如下窗口
-
add → file system 选择你所需要的文件dtd
这两个文件都是经常使用的所以都添加进去
-
key 需要与配置文件中的 此部分相同
所以key是 -//mybatis.org//DTD Config 3.0//EN,那么dtd文件到哪里找呢?
- 所需的dtd文件都在mybatis解压后的 mybatis-3.4.4orgapacheibatisuilderxml 下面如图
创建核心配置文件
- 找到如下窗口 → next
- 选择第一个 → next
-
选择第二个 → 选择config → next→finish即可
- 此时创建好的xml文件便会自动生成如下代码
编写核心配置文件
话不多说直接上代码
1 <?xml version="1.0" encoding="UTF-8"?> 2 <!DOCTYPE configuration 3 PUBLIC "-//mybatis.org//DTD Config 3.0//EN" 4 "http://mybatis.org/dtd/mybatis-3-config.dtd"> 5 <configuration> 6 <!-- 引入database.propeerties --> 7 <properties resource="database.properties"/> 8 <!-- 配置mybatis的log实现log4j --> 9 <settings> 10 <setting name="logImpl" value="LOG4J"/> 11 </settings> 12 <typeAliases> 13 <package name="cn.smbms.pojo"/> 14 </typeAliases> 15 <!-- 配置mybatis多套运行环境 --> 16 <environments default="development"> 17 <environment id="development"> 18 <!-- 配置事物管理,采用jdbc的事物管理 --> 19 <transactionManager type="JDBC"/> 20 <!-- POOLED:mybatis自带的数据源,jndi:基于Tomcat的数据源 --> 21 <dataSource type="POOLED"> 22 <property name="driver" value="${driver}"/> 23 <property name="url" value="${url}"/> 24 <property name="username" value="${user}"/> 25 <property name="password" value="${pwd}"/> 26 </dataSource> 27 </environment> 28 </environments> 29 <!-- 将mapper文件加入到配置文件中 --> 30 <mappers> 31 <mapper resource="cn/smbms/dao/UserMapper.xml"/> 32 </mappers> 33 </configuration>
属性 | 作用 |
configuration | 配置文件的根元素节点 |
propertes | 通过resource属性从外表知道properties属性文件,该属性文件描述数据库的相关配置 |
settings | 设置mybatis运行中的一些行为,比如此处设置mybatis的log日志实现为LOG4J,即使用log4j实现日志功能 |
environments | 表示配置mybatis的多套运行环境,将SQL映射到多个不同的数据库上,元素节点中可配置多个,但必须指定默认运行环境 |
environment | 配置mybatis的一套运行环境,需指定运行环境id,事务管理,数据源配置等相关信息 |
mappers | 作用是告诉mybatis去哪里找SQL映射文件(该内容是开发者定义的映射SQL语句),整个项目可以有1个或多个 |
mapper | mappers的子元素节点,具体知道SQL映射文件的路径,其中resource属性表SQL映射文件的路径 |
创建实体类并为其创建DAO接口
结构如下
创建sql映射文件
代码如下
1 <?xml version="1.0" encoding="UTF-8"?> 2 <!DOCTYPE mapper 3 PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" 4 "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> 5 <mapper namespace="cn.smbms.dao.UserMapper"> 6 <!-- 查询用户表记录数 --> 7 <select id="count" resultType="int"> 8 select count(1) as count from smbms_user 9 </select> 10 <!-- 查询用户列表 --> 11 <select id="getUserList" resultType="User"> 12 select * from smbms_user 13 </select> 14 </mapper>
- mapper:映射文件的根元素节点,只有一个属性namespace
- namespace:用于区分不同的mapper,全局唯一.
- select:表示查询语句,是mybatis最常用的元素之一,常用属性如下
- id属性:改命名空间下唯一标识符
- resultType属性:表示SQL语句返回值类型,第一个select返回的是int,后者则是user类型
编写测试类运行
工具类代码如下
1 package cn.smbms.utils; 2 3 import java.io.InputStream; 4 5 import org.apache.ibatis.io.Resources; 6 import org.apache.ibatis.session.SqlSession; 7 import org.apache.ibatis.session.SqlSessionFactory; 8 import org.apache.ibatis.session.SqlSessionFactoryBuilder; 9 10 public class MyBatisUtil { 11 private static SqlSessionFactory factory; 12 static { 13 try { 14 //获取mybatis-config.xml文件的输出流 15 InputStream is=Resources.getResourceAsStream("mybatis-config.xml"); 16 factory=new SqlSessionFactoryBuilder().build(is); 17 } catch (Exception e) { 18 e.printStackTrace(); 19 } 20 } 21 22 public static SqlSession createSqlSession() { 23 return factory.openSession(false); //默认true自带提交事务 24 } 25 public static void closeSqlSession(SqlSession sqlSession) { 26 if(null!=sqlSession) { 27 sqlSession.close(); 28 } 29 } 30 }
测试类代码方法一 基于mapper接口方式操作如下
public static void main(String[] args) { Logger logger = Logger.getLogger(Test.class); SqlSession sqlSession =null; List<User> userList = new ArrayList<>(); try { sqlSession = MyBatisUtil.createSqlSession(); userList = sqlSession.getMapper(UserMapper.class).getUserList(); for (User user : userList) { logger.debug("testGetUserList UserCode:"+user.getUserCode()+"and userName:"+user.getUserName()); } } catch (Exception e) { e.printStackTrace(); }finally { MyBatisUtil.closeSqlSession(sqlSession); } }
基于mapper接口方式操作此接口必须对应select映射SQL语句中的id对应
测试类代码方法二 运行映射SQL语句
public static void main(String[] args) { Logger logger = Logger.getLogger(Test.class); SqlSession sqlSession =null; List<User> userList = new ArrayList<>(); try { sqlSession = MyBatisUtil.createSqlSession(); //直接运行已映射的SQL语句 userList = sqlSession.selectList("cn.smbms.dao.UserMapper.getUserList"); for (User user : userList) { logger.debug("testGetUserList UserCode:"+user.getUserCode()+"and userName:"+user.getUserName()); } } catch (Exception e) { e.printStackTrace(); logger.error(e); }finally { MyBatisUtil.closeSqlSession(sqlSession); } }
在使用SQLsession实例执行已映射的语句,没有与id所对应的方法也不会出错,即使UserMpper这个接口没有也不会影响运行结果.