MyBatis简介MyBatis 技术
开发环境的准备environmentsproperties#{}和${}动态SQL
下载网址
https://github.com/mybatis/mybatis-3/
1)MyBatis 是支持定制化 SQL、存储过程以及高级映射的优秀的持久层框架
2)MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集
3)MyBatis可以使用简单的XML或注解用于配置和原始映射,将接口和Java的POJO(Plain Old Java Objects,普通的Java对象)映射成数据库中的记录
4)Mybatis 是一个 半自动的ORM(Object Relation Mapping)框架
为什么要使用MyBatis – 现有持久化技术的对比
1)JDBC
①SQL夹在Java代码块里,耦合度高导致硬编码内伤
②维护不易且实际开发需求中sql有变化,频繁修改的情况多见
2)Hibernate和JPA
①长难复杂SQL,对于Hibernate而言处理也不容易
②内部自动生产的SQL,不容易做特殊优化
③基于全映射的全自动框架,大量字段的POJO进行部分映射时比较困难。导致数据库性能下降
3)MyBatis
①对开发人员而言,核心sql还是需要自己优化
②sql和java编码分开,功能边界清晰,一个专注业务、一个专注数据
1、导入MyBatis框架的jar包、Mysql驱动包、log4j的jar包
myBatis-3.4.1.jar
mysql-connector-java-5.1.37-bin.jar
log4j.jar
2、导入log4j 的配置文件
3、创建MyBatis的全局配置文件
参考MyBatis的官网手册
(如何连接数据库)
多个映射mapper
-
4、创建Mybatis的sql(mapper)映射文件
参考MyBatis的官方手册
(如何操作数据库)
5、创建mapper接口
public interface UserMapper {
public User getUserByUid(String uid);
}
6、将四五步创建的sql(mapper)映射文件和mapper接口实现绑定
①Mapper接口与Mapper映射文件的绑定
在Mppper映射文件中的
②Mapper映射文件中的增删改查标签的id必须指定成Mapper接口中的方法名.
注:
1、mapper接口的全类名要和mapper映射文件的namespace保持一致
2、接口中的方法名要和sql语句中的id保持一致
7、测试
获取mybatis操作数据库的会话对象SqlSession,通过getMapper()获取接口的动态代理实现类
package com.mybatis.mapper;
import com.mybatis.bean.User;
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;
public class TestMybatis {
@Test
public void test() throws IOException {
//通过ibatis的Resource类的getResourceAsStream方法读取全局配置文件为IO流
InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
//通过IO流新建一个SqlSessionFactory工厂
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
SqlSession sqlSession = sqlSessionFactory.openSession();
//getMapper():会通过动态代理动态生成UserMapper的代理实现类
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
User user = mapper.getUserByUid("1");
System.out.println(user);
}
}
总结:
整体mybatis结构:
执行:
通过全局配置先连接数据库———>执行mapper接口中的方法————>执行mapper配置文件的sql语句
//SqlSession sqlSession = sqlSessionFactory.openSession();//需要手动处理事务 SqlSession sqlSession = sqlSessionFactory.openSession(true);//自动处理事务properties
#{}和${}
mybatis中获取参数有两种方式:#{}和${}
${}:用于Statement:通过字符串的拼接需要手动假单引号:
Emp emp = new Emp(null, "admin", 23, "男"); mapper.insertEmp(emp);
//直接将至拼接成sql语句
insert into emp values(null, '${ename}', ${age}, '${sex}')
#{}:适用于PreparedStatement,可以使用通配符使用
建议使用#{},在特殊情况下,需要使用${},例如模糊查询和批量删除。
不同的参数类型,${}和#{}的不同取值的方式:
动态SQL1)动态 SQL是MyBatis强大特性之一。极大的简化我们拼装SQL的操作
2)动态 SQL 元素和使用 JSTL 或其他类似基于 XML 的文本处理器相似
3)MyBatis 采用功能强大的基于 OGNL 的表达式来简化操作
if
choose (when, otherwise)
trim (where, set)
foreach
4)OGNL( Object Graph Navigation Language )对象图导航语言,这是一种强大的
表达式语言,通过它可以非常方便的来操作对象属性。 类似于我们的EL,SpEL等
访问对象属性: person.name
调用方法: person.getName()
调用静态属性/方法: @java.lang.Math@PI
@java.util.UUID@randomUUID()
调用构造方法: new com.atguigu.bean.Person(‘admin’).name
运算符: +,-*,/,%
逻辑运算符: in,not in,>,>=,<,<=,==,!=
注意:xml中特殊符号如”,>,<等这些都需要使用转义字符
if where
1)If用于完成简单的判断.
2)Where用于解决SQL语句中where关键字以及条件中第一个and或者or的问题
trim
1)Trim 可以在条件判断完的SQL语句前后 添加或者去掉指定的字符
prefix: 添加前缀
prefixOverrides: 去掉前缀
suffix: 添加后缀
suffixOverrides: 去掉后缀
set
1)set 主要是用于解决修改操作中SQL语句中可能多出逗号的问题
update tbl_employee where id =#{id} last_name = #{lastName}, email = #{email} , gender = #{gender}
choose(when、otherwise)
choose 主要是用于分支判断,类似于java中的switch case,只会满足所有分支中的一个
foreach
1)foreach 主要用于循环迭代
collection: 要迭代的集合
item: 当前从集合中迭代出的元素
open: 开始字符
close:结束字符
separator: 元素与元素之间的分隔符
index:
迭代的是List集合: index表示的当前元素的下标
迭代的Map集合: index表示的当前元素的key



