MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis 。MyBatis是一个基于Java的持久层框架。iBATIS提供的持久层框架包括SQL Maps和Data Access Objects(DAO)MyBatis 消除了几乎所有的JDBC代码和参数的手工设置以及结果集的检索。MyBatis 使用简单的 XML或注解用于配置和原始映射,将接口和 Java 的POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。
-
框架:
应用的半成品
一个框架程序员可以配置的选择/选项越多,认为这款框架的可扩展性强。
面向SQL的一个框架 SQL程序员入参自动装配返回值自动装配
可重用的公共结构
按一定规则组织的一组组件
-
组件
Component
对数据和方法的简单封装
封装了特定功能和属性的一个对象
-
持久化,ORM
持久化是程序数据在瞬时状态和持久状态间转换的过程
ORM:(Object Relational Mapping)对象关系映射
第一步创建核心配置文件
第二步创建数据库表对应的实体类
第三步创建Mapper配置文件,再加入核心配置文件
第四步加载核心配置文件,创建SqlSessionFactory,使用工厂产生SqlSession
第五步使用MyBatis的各种方法完成增删查改操作
所使用的jar包需要:
Idea创建maven工程慢的解决方案:
-DarchetypeCatalog=internal:
第一步:
创建项目,我的完整版如下:
大配置(mybatis-config.xml)里面写连接数据库的字符串:
package cn.ljl.test; import cn.ljl.dao.DeptDao; import cn.ljl.entity.Dept; 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 org.junit.Test; import java.io.IOException; import java.io.InputStream; import java.util.List; public class MyBatisTest01 { /*查询所有*/ @Test public void testall() { String path = "mybatis-config.xml"; try { InputStream is = Resources.getResourceAsStream(path); SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is); SqlSession session = factory.openSession(); List<Dept> list = session.selectList("cn.ljl.dao.DeptDao.getAllList"); for (Dept dept : list) { System.out.println(dept.getUname()); } } catch (IOException e) { e.printStackTrace(); } } /*按照id查询姓名*/ @Test public void testgetMapper() { System.out.println("mapper"); String path = "mybatis-config.xml"; try { InputStream is = Resources.getResourceAsStream(path); SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is); SqlSession session = factory.openSession(); DeptDao dao = session.getMapper(DeptDao.class); List<Dept> list = dao.getAllList(); for (Dept dept : list) { System.out.println(dept.getUname()); } } catch (IOException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } } //02.带条件查询 resultMap的使用 @Test public void testGetOneDeptResultMap() { System.out.println("resultMap"); String path = "mybatis-config.xml"; try { InputStream is = Resources.getResourceAsStream(path); SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is); SqlSession session = factory.openSession(); DeptDao dao = session.getMapper(DeptDao.class); Dept dept = dao.getDeptResultMapById(1); System.out.println(dept.getUname()); } catch (IOException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } } }
第二步:
-
编写MyBatis配置文件 mybatis-config.xml(以下是我的mybatis-config.xml)
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPEconfigurationPUBLIC"-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration><!--根节点--> <typeAliases> <package name="cn.ljl.entity" ></package> </typeAliases> <environments default="development"> <!--环境--> <environment id="development"> <transactionManager type="JDBC"/><!--事务管理机制:JDBC|Managed--> <dataSource type="POOLED"> <!--UNPooled,JNDI--> <property name="driver" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql:///mybatiits"/> <property name="username" value="sa"/> <property name="password" value="ljl19980427"/> </dataSource> </environment> </environments> <mappers> <mapper resource="cn/ljl/dao/DeptDao.xml"/> </mappers> </configuration>
-
创建实体类:(Dept)
public class Dept { private Integer uid; private String uname; (不要忘记属性封装get,set) }
-
创建SQL映射文件 DeptDao.xml
(我这里是三个方法)(这个是小配置)
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPEmapper PUBLIC"-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="cn.ljl.dao.DeptDao"> <!--resultMap--> <resultMap id="deptResultMap" type="Dept"> <id property="uid" column="uid"></id> <result property="uname" column="uname"></result> </resultMap> <!--查询所有--> <select id="getAllList" resultType="Dept"> select * from userinfo </select> <!--按照id查询姓名--> <select id="getDeptById" parameterType="int" resultType="Dept"> select * from userinfo where uid=#{uid} </select> <!--按照id查询姓名 返回resultMap--> <select id="getDeptResultMapById" parameterType="int" resultMap="deptResultMap"> select * from userinfo where uid=#{uid} </select> </mapper>
-
书写测试类
package cn.ljl.test; import cn.ljl.dao.DeptDao; import cn.ljl.entity.Dept; 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 org.junit.Test; import java.io.IOException; import java.io.InputStream; import java.util.List; public class MyBatisTest01 { /*查询所有*/ @Test public void testall() { String path = "mybatis-config.xml"; try { InputStream is = Resources.getResourceAsStream(path); SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is);
(SqlSessionFactoryBuilder与SqlSessionFactory没有关系,但是要用到) SqlSession session = factory.openSession(); List<Dept> list = session.selectList("cn.ljl.dao.DeptDao.getAllList"); for (Dept dept : list) { System.out.println(dept.getUname()); } } catch (IOException e) { e.printStackTrace(); } } /*按照id查询姓名*/ @Test public void testgetMapper() { System.out.println("mapper"); String path = "mybatis-config.xml"; try { InputStream is = Resources.getResourceAsStream(path); SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is); SqlSession session = factory.openSession(); DeptDao dao = session.getMapper(DeptDao.class); List<Dept> list = dao.getAllList(); for (Dept dept : list) { System.out.println(dept.getUname()); } } catch (IOException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } } //02.带条件查询 resultMap的使用 @Test public void testGetOneDeptResultMap() { System.out.println("resultMap"); String path = "mybatis-config.xml"; try { InputStream is = Resources.getResourceAsStream(path); SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is); SqlSession session = factory.openSession(); DeptDao dao = session.getMapper(DeptDao.class); Dept dept = dao.getDeptResultMapById(1); System.out.println(dept.getUname()); } catch (IOException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } } }
这里需要注意一个知识点:
* 在MyBatis中执行事务的方式(执行完毕某个操作成功后以后不进行数据回滚)
* 第一种方式:直接在openSession方法中添加参数true,自动提交的方式
* 第二种方式:在完成整个逻辑操作后,添加代码session.commit();,完成事务的手动提交
以上就是上课的时候的一个小例子,下面介绍MyBatis的其他:
1、 mybatis配置
SqlMapConfig.xml,此文件作为mybatis的全局配置文件,配置了mybatis的运行环境等信息。
mapper.xml文件即sql映射文件,文件中配置了操作数据库的sql语句。此文件需要在SqlMapConfig.xml中加载。
2、 通过mybatis环境等配置信息构造SqlSessionFactory即会话工厂
3、 由会话工厂创建sqlSession即会话,操作数据库需要通过sqlSession进行。
4、 mybatis底层自定义了Executor执行器接口操作数据库,Executor接口有两个实现,一个是基本执行器、一个是缓存执行器。
5、 Mapped Statement也是mybatis一个底层封装对象,它包装了mybatis配置信息及sql映射信息等。mapper.xml文件中一个sql对应一个Mapped Statement对象,sql的id即是Mapped statement的id。
6、 Mapped Statement对sql执行输入参数进行定义,包括HashMap、基本类型、pojo,Executor通过Mapped Statement在执行sql前将输入的Java对象映射至sql中,输入参数映射就是jdbc编程中对preparedStatement设置参数。
7、 Mapped Statement对sql执行输出结果进行定义,包括HashMap、基本类型、pojo,Executor通过Mapped Statement在执行sql后将输出结果映射至java对象中,输出结果映射过程相当于jdbc编程中对结果的解析处理过程。
输出映射(返回的结果集可以有哪些类型)
1)基本类型
2)pojo类型
3)List类型
动态sql:动态的拼接sql语句,因为sql中where条件有可能多也有可能少
1)where:可以自动添加where关键字,还可以去掉第一个条件的and关键字
2)if:判断传入的参数是否为空
3)foreach:循环遍历传入的集合参数
4)sql:封装查询条件,以达到重用的目的
对单个对象的映射关系:
1)自动关联(偷懒的办法):可以自定义一个大而全的pojo类,然后自动映射其实是根据数据库总的字段名称和
pojo中的属性名称对应.
2)手动关联: 需要指定数据库中表的字段名称和java的pojo类中的属性名称的对应关系.
使用association标签
对集合对象的映射关系
只能使用手动映射:指定表中字段名称和pojo中属性名称的对应关系
使用collection标签
spring和mybatis整合
整合后会话工厂都归spring管理
1)原生Dao实现:
需要在spring配置文件中指定dao实现类
dao实现类需要继承SqlSessionDaoSupport超类
在dao实现类中不要手动关闭会话,不要自己提交事务.
2)Mapper接口代理实现:
在spring配置文件中可以使用包扫描的方式,一次性的将所有mapper加载
逆向工程:自动生成Pojo类,还可以自动生成Mapper接口和映射文件
注意:生成的方式是追加而不是覆盖,所以不可以重复生成,重复生成的文件有问题.
如果想重复生成将原来生成的文件删除