什么是MyBatis
起源Apache基金会开源项目iBatis, 2010年由Apache迁移到google code,并改名MyBatis
作用支持普通SQL查询,存储过程和高级映射
封装几乎所有的JDBC代码/参数的手工设置/结果集的检索
优势 简化数据库访问代码
MyBatis体系结构
1:加载配置
两种形式:XML配置文件 / Java代码注解
SQL配置信息加载 --> MappedStatement对象--> 内存
(传入参数映射配置、执行SQL语句、结果映射配置)
2:SQL解析
API接口接收请求(SQL ID:obj//可以是Map、JavaBean或基本数据类型)
MyBatis 根据 ID --> MappedStatement --> 解析 --> SQL语句 参数
3:SQL执行
解析后的SQL语句 参数 --> Database execute --> result
4:结果映射
result --> 根据映射配置转换 --> HashMap JavaBean 基本数据类型 --> return
MyBatis配置文件
1 eg. SqlMapConfig.xml 2 <configuration> 3 <environments default="environment"> 4 <environment id="environment"> 5 6 <transactionManager type="JDBC"/> 7 8 <dataSource type="POOLED"> 9 <property nam="driver" value="com.mysql.jdbc.Driver"/> 10 <property name="url" value="jdbc:mysql://localhost:33066/MyDatabase?useUnicode=true&characterEncoding=gbk"/> 11 <property name="username" value="root"/> 12 <property name="password" value=""/> 13 </dataSource> 14 15 </environment> 16 </environment> 17 </configuration>
1 eg. SqlMap.xml 2 <mapper> 3 <!-- mysql insert sentence --> 4 <insert id="addEmp" parameterType="Emp"> 5 insert into EMP(NAME,SALARY,AGE) 6 values(#{name},#{salary},#{age}) 7 </insert> 8 <!-- mysql select sentence --> 9 <select id="findAll" resultMap="empMap"> 10 select NAME,SALARY,AGE from EMP 11 </select> 12 <!-- result Map --> 13 <resultMap id="empMap" type="cn.com.azcode.entity.Emp"> 14 <result property="name" column="NAME"/> 15 <result property="salary" column="SALARY"/> 16 <result property="age" cloumn="AGE"/> 17 </resultMap> 18 </mapper>
MyBatis框架API介绍
根据MyBatis配置文件SqlMapConfig.xml构建SqlSessionFactory实例
每一个MyBatis的应用程序都以一个SqlSessionFactory对象为核心
该对象包含了所有执行SQL操作的方法,用于执行已映射的SQL语句
MyBatis 基本应用
1 搭建MyBatis技术环境
· MyBatis-jar包,SQL-jar包
· src/SqlMapConfig.xml配置参数
· 获取SqlSession实例
1 //inject SqlMapConfig.xml 2 String conf="SqlMapConfig.xml"; 3 Reader reader=Resource.getResourceAsReader(conf); 4 //Entity SessionFactory 5 SqlSessionFactoryBuilder sfb=new SqlSessionFactoryBudiler(); 6 SqlSessionFactory sf=sfb.build(reader); 7 //Entity Session 8 SqlSession session=sf.openSession();
3:利用SqlSession实现CRUD操作
· 根据表编写实体类 Java POJOs(Plain Old Java Objects)· 编写SqlMap.xml映射文件,定义SQL操作和映射信息
· 获取SqlSession对象,执行增删改查操作
· 提交事物(DML操作)
· 释放SqlSession对象资源
//返回类型是实体对象 parameterType="Emp" <!-- mysql insert sentence --> <insert id="addEmp" parameterType="Emp"> insert into EMP(NAME,SALARY,AGE) values(#{name},#{salary},#{age}) </insert> //insert mission session.insert("addEmp",emp); session.commit(); Session.close(); ------------------------------------------ <!-- mysql update sentence --> <update id="updateDept" parameterType="Emp"> update EMP set NAME=#{name},SALARY=#{salary}where AGE=#{age} </update> //update mission session.update("updateDept",25); session.commit(); Session.close(); ------------------------------------------ <!-- mysql delet sentence--> <delete id="deleteByName" parameterType="String"> delete from EMP where NAME=#{name} </delete> //delete mission session.delete("deletByName",susan); ------------------------------------------ <!-- mysql findOne sentence--> <select id="findByName" parameterType="String" resultType="Emp"> select NAME,SALARY,AGE from EMP where NAME=#{name} </select> //findOne mission Emp emp = (Emp)session.selectOne("findByName",susan); ------------------------------------------ <!-- mysql findAll sentence--> <select id="findAll" resultType="Emp"> select NAME,SALARY,AGE from EMP </select> //findAll mission List<Emp> list = seesion.selectList("finAll");
<!-- reusultType="java.util.HashMap" --> <select id="findAge" parameterType="int" resultType="java.util.HashMap"> select NAME,SALARY from EMP where AGE=#{age} </select> //map find Map map=(Map)session.selectOne("findAge",20); String name=(String)map.get("NAME"); double salary=(double)map.get("SALARY")
什么是Mapper映射器:开发者创建绑定映射语句的接口获取映射器接口实例
使用Mapper映射器的好处:不用多次通过session进行操作,简化操作流程,方便方法复用
SqlSession session=sqlSessionFactory.openSession(); try{ EmpMapper mapper=session.getMapper(EmpMapper.class); //do work ... }finally{ session.close(); } //DeptMapper 接口定义 public interface EmpMapper{ public List<Emp> findAll(); public Emp find(String name); public void addEmp(int age); public void updateEmp(int age); public void deleteByAge(int age); } //Mapper接口中的方法名和SqlMap.xml中SQL-id一致
SqlMap.xml定义<select>操作时
若查询字段名和Java POJOs属性不一致时
需要使用<resultMap>指定映射关系
eg. <!-- mysql select sentence --> <select id="findAll" resultMap="empMap"> select NAME,SALARY,AGE from EMP </select> <!-- result Map --> <resultMap id="empMap" type="cn.com.azcode.entity.Emp"> <result property="name" column="NAME"/> <result property="salary" column="SALARY"/> <result property="age" cloumn="AGE"/> </resultMap>