MyBatis简介,包括架构分析、提供功能、常见使用类、动态代理使用和输出结构分析等内容

一、什么是MyBatis?

MyBatis 是一个优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs (Plain Old Java Objects, 普通的 Java 对象) 映射成数据库中的记录。

MyBatis是一个sql映射框架,提供的数据库的操作能力,增强的JDBC,使用mybatis让开发人员集中精神写sql就可以了,不必关心Connection,Statement,ResultSet的创建,销毁,sql的执行。

MyBatis的作用:增强的jdbc,访问数据库,执行增删改查

  • 轻量级: MyBatis 是一个小巧的框架,没有太多的依赖,使用简单。
  • 灵活性: MyBatis 不会对应用程序或者数据库的现有设计强加任何影响。SQL 写在 XML 里,从程序代码中彻底分离,降低耦合度,便于统一管理和优化,可重用。
  • 提供映射标签: 支持对象与数据库的 ORM 字段关系映射。
  • 提供动态 SQL: MyBatis 最大的优点就是提供了动态 SQL 的功能,用户可以根据需要编写适合自己的 SQL 语句。
  • 提供 XML 标签: 简化 SQL 语句的编写,尤其对于字段多、关联表多时,更是如此,极大地提高了开发效率。
  • 与 Spring 集成: MyBatis 可以与 Spring 框架无缝集成。

二、三层设计架构

1、MyBatis中的三层设计架构

  • 接口层(API接口层)
  • 这一层是提供给外部使用的接口API,开发人员通过这些本地API来操纵数据库。接口层的核心对象是SqlSession,它是上层应用和MyBatis打交道的桥梁,定义了非常多的对数据库的操作方法。当接口层接收到调用请求时,它会调用核心处理层的相应模块来完成具体的数据库操作。
  • 核心处理层(数据处理层)
  • 这一层主要处理与数据库操作相关的所有动作。它负责具体的SQL查找、SQL解析、SQL执行以及执行结果的映射处理等。在处理过程中,核心处理层会将接口中传入的参数解析并映射成JDBC类型,解析XML文件中的SQL语句(包括插入参数和动态SQL的生成),执行SQL语句,并处理结果集,将其映射成Java对象。插件也属于核心层,这是因为它们的工作方式和拦截的对象决定的。
  • 基础支持层(数据访问层)
  • 这一层主要负责最基础的功能支撑,包括连接管理、事务管理、配置加载和缓存处理等。这些基础功能被抽取出来作为最基础的组件,为上层的数据处理层提供支撑。基础支持层还包含类型转换模块等,为简化配置文件提供了别名机制等功能。

2、三层对应的包

  • 接口层(API接口层):controller包 (servlet)接收用户请求,显示处理结果,使用框架SpringMVC。
  • 核心处理层(数据处理层):service 包(XXXService类)Spring创建service,Dao,工具类等,使用框架Spring。
  • 基础支持层(数据访问层):dao包(XXXDao类)访问数据库,对数据库进行增删改查,使用框架MyBatis。

3、三层中类的交互

用户使用 --> 界面层–> 业务逻辑层—>数据访问层(持久层)–>数据库(mysql)

4、MyBatis框架:

MyBatis:是 MyBatis SQL Mapper Framework for Java (sql映射框架)

  • sql mapper:sql映射
  • 可以把数据库表中的一行数据 映射为 一个java对象,一行数据可以看做是一个java对象,操作这个对象,就相当于操作表中的数据。
  • Data Access Objects(DAOs):数据访问
  • 对数据库执行增删改查

5、MyBatis提供了哪些功能:

  • 提供了创建Connection,Statement,ResultSet的能力,不用开发人员创建这些对象了。
  • 提供了执行sql语句的能力, 不用你执行sql。
  • 提供了循环sql,JDBC中得到的结果集可以直接循环,不用再使用while的方式。
  • 把sql的结果转为java对象,List集合的能力。
while (rs.next()) {
		Student stu = new Student();
		stu.setId(rs.getInt("id");
		stu.setName(rs.getString("name"));
		stu.setAge(rs.getInt("age"));
		// 从数据库取出数据转为 Student 对象,封装到 List 集合
		stuList.add(stu);
	  }
  • 提供了关闭资源的能力,不用你关闭Connection,Statement和ResultSet。
  • 开发人员做的是:提供sql语句

流程:
开发人员提供sql语句 --> mybatis处理sql --> 开发人员得到List集合或java对象(表中的数据)

6、MyBatis的基本步骤

  • 加入maven的依赖,在pom.xml文件中创建org.mybatis的依赖。
  • 创建Dao接口:定义了你操作数据的方法。
  • 创建mapper文件,也叫做sql映射文件,写sql语句的,和接口中方法对应的sql语句,mapper文件也存在于Dao包中。
  • 创建一个MyBatis.xml的主配置文件:连接和写进数据库,执行mapper文件的位置。
  • 创建测试文件,使用MyBatis的对象的SqlSession,通过它的方法执行sql语句。

二、MyBatis中的常见类介绍

1、Resources

mybatis中的一个类,负责读取主配置文件

InputStream in = Resources.getResourceAsStream("mybatis.xml");

2、SqlSessionFactoryBuilder

先创建SqlSessionFactoryBuilder对象,在创建SqlSessionFactory对象,

SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
// 创建SqlSessionFactory对象,
SqlSessionFactory factory = builder.build(in);

3、SqlSessionFactory

重量级对象,程序创建一个对象耗时比较长,使用资源比较多。在整个项目中,有一个就够用了。

  • SqlSessionFactory:接口,接口实现类:DefaultSqlSessionFactory
  • SqlSessionFactory作用:获取SqlSession对象
SqlSession sqlSession = factory.openSession();
  • openSession()
  • openSession():获取是非自动提交事务的SqlSession对象。
  • openSession(boolean)
  • openSession(true):获取自动提交事务的SqlSession。
  • openSession(false) :非自动提交事务的SqlSession对象。

4、SqlSession

SqlSession接口:定义了操作数据的方法
例如 selectOne(),selectList(),insert(),update(),delete(),commit(),rollback()
SqlSession接口的实现类DefaultSqlSession。

使用要求:SqlSession对象不是线程安全的,需要在方法内部使用,在执行sql语句之前,使用openSession()获取SqlSession对象。
在执行完sql语句后,需要关闭它,执行SqlSession.close()。这样能保证他的使用是线程安全的。

三、什么是MyBatis的动态代理

1、动态代理

MyBatis帮你创建dao接口的实现类,获得动态代理,使用sqlSession.getMapper(dao接口.class) 获取这个dao接口的对象,在实现类中调用SqlSession的方法执行sql语句。

2、传入参数

从java代码中把数据传入到mapper文件的sql语句中:

1)parameterType:写在mapper文件中的一个属性,表示dao接口中方法的参数的数据类型。

// 代表传入sql中的属性的设置类型为Integer类型
public Student selectStudentById(Integer id);

2)简单类型:mybatis把java的基本数据类型和String都叫简单类型。在mapper文件获取简单类型的一个参数的值,使用 #{任意字符}。

public Student selectStudentById(Integer id);
// mapper
select id, name, email, age from student where id=#{id}

3)多个参数:使用@Param命名参数

public List<Student> selectMulitParam(@Param("myname") String name, @Param("myage") Integer age);
// 使用@Param("参数名")  String name
// mapper
select * from student where name = #{myname} or age = #{myage}

4)多个参数:使用java对象,这个是使用最多的,语法 #{属性名}。

  • vo:value object,放一些存储数据的类。
  • vo:view object,从servlet把数据返回给浏览器使用的类,表示显示结果的类。
  • pojo:普通的有set,get方法的java类,普通的java对象。
  • Servlet:StudentService(addStudent(MyParam param))。
  • entity(domain域):实体类,和数据库中的表对应的类。

5)多个参数传值:按位置传值
mybatis.3.4之前 #{0} #{1}
mybatis.3.4之后 #{0} #{1} #{2} 以此类推

6)多个参数传值:按Map传值
List selectMultiByMap(Map<String, Object> map);
多个参数使用Map,使用的语法:#{map的key}

7)#和$

select id, nameemail, age from student where id = #{studentId}
// #的结果: select id,name, email,age from student where id=? 

select id, name, email, age from student where id = ${studentId}
// $ 的结果:select id,name, email,age from student where id=1001

String sql = "select id, name, email, age from student where id=" + "1001";

注意:使用的Statement对象执行sql,效率比PreparedStatement低,容易产生sql注入!
$ 可以替换表名或者列名。你能确定数据是安全的,就使用$。

3、#和$区别

  • #使用?在sql语句中做占位符的,使用PreparedStatement执行sql,效率高。
  • #能够避免sql注入,更安全。
  • $ 不使用占位符,是字符串连接方式,使用Statement对象执行sql,效率低。
  • $ 有sql注入的风险,缺乏安全性。
  • $ 可以替换表名或者列名。

三、MyBatis的输出

mybatis执行sql语句,会得到java对象。

1、resultType结果类型

指sql语句执行完毕后, 数据转为的java对象, java类型是任意的。

resultType结果类型的值:

  • 类型的全限定名称
  • 类型的别名,例如 java.lang.Integer别名是int

处理方式:

  • MyBatis执行sql语句, 然后MyBatis调用类的无参数构造方法,创建对象。
  • MyBatis把ResultSet指定列值付给同名的属性。
<select id="selectMultiPosition" resultType="com.bjpowernode.domain.Student">;
	select id, name, email, age from student
</select>

对等的jdbc:

ResultSet rs = executeQuery("select id,name, email,age from student"while(rs.next()) {
	Student student = new Student();
	student.setId(rs.getInt("id"));
	student.setName(rs.getString("name"));
}

2、定义自定义类型的别名

  • 在mybatis主配置文件中定义,使定义别名。
  • 可以在resultType中使用自定义别名。

3、resultMap

结果映射,指定列名和java对象的属性对应关系。

  • 你自定义列值赋值给哪个属性
  • 当你的列名和属性名不一样时,一定使用resultMap

注意:resultMap和resultType不要一起用,二选一。

四:动态sql

  • 动态sql:sql的内容是变化的,可以根据条件获取到不同的sql语句,主要是where部分发生变化。
  • 动态sql的实现,使用的是mybatis提供的标签<if><where><foreach>
  • 动态sql,使用java对象作为参数。
<if> 是判断条件的,如果条件为true,就会把if之间的sql加入到主sql之后

// 语法:
<if test="判断java对象的属性值">
	部分sql语句;
</if>

<where> 用来包含多个<if>的, 当多个if有一个成立的,<where>会自动增加一个where关键字,并去掉 if 中多余的and,or等。

<foreach> 循环java中的数组,list集合的。 主要用在sql的in语句中。

例如:学生id是 1001,1002,1003的三个学生

// 普通定义的一个字符串连接方法。
select * from student where id in (1001, 1002, 1003)

public List<Student> selectFor(List<Integer> idlist) {
	List<Integer> list = new ArrayList<Integer>();
	list.add(1001);
	list.add(1002);
	list.add(1003);
	dao.selectFor(list);
}

<foreach collection="" item="" open="" close="" separator="">
	#{xxx}
</foreach>
  • collection:表示接口中的方法参数的类型,如果是数组使用array,如果是list集合使用list
  • item:自定义的,表示数组和集合成员的变量
  • open:循环开始是的字符
  • close:循环结束时的字符
  • separator:集合成员之间的分隔符

sql代码片段就是复用一些语法

// 1、先定义
<sql id="自定义名称唯一">sql语句,表名,字段等</sql>
// 2、再使用
<include refid="id的值" />

五、数据库的属性配置文件

把数据库连接信息放到一个单独的文件中,和mybatis主配置文件分开,目的是便于修改、保存、处理多个数据库的信息。

1、在resources目录中定义一个属性配置文件,xxxx.properties ,例如 jdbc.properties。

在属性配置文件中,定义数据,格式是 key=value

  • key:一般使用 . 做多级目录的。例如:jdbc.mysql.driver,jdbc.driver,mydriver
jdbc.driver = com.mysql.jdbc.Driver
jdbc.url = jdbc:mysql//localhost:3306/springdb
jdbc.username = root
jdbc.password = 123456

2、在mybatis的主配置文件,使用<property> 指定文件的位置在,需要使用值的地方:${key}。

3、mapper文件,使用package指定路径。

<mappers> 
     <!--第二种方式: 使用包名
          name: xml文件(mapper文件)所在的包名, 这个包中所有xml文件一次都能加载给mybatis
          使用package的要求:
          1、mapper文件名称需要和接口名称一样, 区分大小写的一样
          2、mapper文件和dao接口需要在同一目录
     -->
     <package name="com.qdwn.dao"/>
</mappers>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值