Mybatis知识点总结

阅读: 评论:0

Mybatis知识点总结

Mybatis知识点总结

目录

Mybatis由来:

Mybatis作用:

ORM框架补充:

ORM框架-对象关系映射模式

方式:

流行的ORM框架:

MyBatis的优势:

核心组件:

各核心组件的作用:

SqlSessionFactoryBuilder(构造器)

SqlSessionFactory(工厂)

SqlSession(会话)

SqlMapper(映射器):

映射器实例化代码

MyBatis实例及其步骤:

步骤总结:

mybatis的常用注解

聚合查询:

动态SQL:

常用的动态sql元素:

简单示例:


Mybatis由来:

mybatis本来是apache的一个开源项目iBatis,后来转移到GitHub,是一个基于Java的持久层框架。因为使用JDBC连接数据库会造成释放资源平凡从而浪费性能,也存在硬编码问题,不易于维护。因此引入ORM框架(Mybatis使用的一种框架。)

Mybatis作用:

Mybatis支持普通SQL查询、存储过程和高级映射的持久层框架,消除了所有关于JDBC配置链接等代码和参数的手工设置以及结果集检索Statement。并且使用简单的XML或注解方式配置和映射原生信息。

ORM框架补充:

ORM框架-对象关系映射模式

是一种提供持久化类与表的映射关系的连接数据库的桥梁,ORM框架能在运行时参照映射文件信息,将对象持久化到数据库中。他能把对持久化对象的增删改查操作转换成对数据库的sql操作。

方式

采用元数据来描述对象与关系映射的细节,元数据一般采用xml格式,存放在专门的对象映射文件中。

(补充)元数据:是描述其他数据的数据,用于提供某种资源有关信息的结构数据

流行的ORM框架:

Hibernate:最为流行的ORM框架,Java EE官方标准JPA就是收到Hibernate影响,具有开源免费,可扩展等特点。SpringDATAJPA的底层实际上主要也是使用Hibernate实现的。

Toplink:Orcale公司产品。

MyBatis:Apache组织的项目。

MyBatis的优势:

  1. 可在程序中直接使用SQL语句进行对数据库操作,可以对其进行优化和改造
  2. 提供强大灵活的映射机制,提供动态SQL的功能。
  3. MyBatis中,提供了Mapper接口编程,使用一个接口和XML就能创建映射器,使开发者能更集中于业务逻辑。

核心组件:

构造器:SqlSessionFactoryBuilder

工厂SqlSessionFactory

会话SqlSession

        执行器:Executor

                是一个真正执行Java和数据库交互的对象

        参数处理器:ParameterHandler

                Mybatis通过参数处理器对预编译语句进行参数设置

        jdbc封装器:StatementHandler

                专门处理一次数据库会话的,会话记录了本次连接的信息。

        结果处理器:ResultSetHandler

                Mybatis通过结果处理器对返回结果集进行组装

映射器:SqlMapper

各核心组件的作用:

SqlSessionFactoryBuilder(构造器)

根据全局配置文件生成SqlSessionFactory,采用分布构建的建造者模式工作,包括插件插入等,一般使用其build方法创建SqlSessionFactory对象。当SqlSessionFactory对象创建成功后,构造器生命周期结束,失去作用。

SqlSessionFactory(工厂)

每个数据库只会对应一个SqlSessionFactory对象,创建多个会造成资源浪费,它可以当作是一个数据库连接池,使用openSession创建SqlSession对象。

SqlSessionFactory对象是线程安全的,其生命周期是整个MyBatis的应用中,直到不再使用MyBatis。

SqlSessionFactory是一个接口,在MyBatis中有两个实现类,SqlSessionManager和DefaultSqlSessionFactory,SqlSessionManager使用在多线程的环境中,他具体是依靠DefaultSqlSessionFactory实现的。

SqlSession(会话)

会话是执行持久化操作的,其对象是程序与持久层之间执行交互的一个单线程对象,代表一个连接资源的的启用。

主要作用:使动态代理模式获取Mapper接口,发送SQL给数据库,控制数据库事务等。

其常用方法:

方法作用
T getMapper(Classs<T>type)返回Mapper接口代理对象
Commit()提交事务
Rollback()回滚事务
ClearCache()清除缓存
Close()关闭SQlSession对象,使用完后要及时关闭。

SqlMapper(映射器):

映射器是的最重要的组件,由一个接口和对应的XML文件(或注解)组成,他的生命周期等于或小于SqlSession。

主要作用:将SQL语句查询到的结果映射到一个持久化类上,或将持久化类的数据添加到数据库中。映射器开发只是一个接口,不是一个实现类,不能直接运行,其运用了动态代理技术,使接口能运行起来。

映射器实例化代码

public class MyBatisTest {//因为测试类中会有其他方法可能用到session以及dao,所以全局变量InpudaotStream in;SqlSession session;Dao dao;@Before//在其他方法执行前执行的初始化方法,用了代理模式public void init() throws IOException{in = ResourceAsStream(&#l");//传入配置文件SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();//创建数据库工厂建筑师SqlSessionFactory factory = builder.build(in);//使用xml当资源给工厂session = factory.openSession();dao = Mapper(Dao.class);}
}

MyBatis实例及其步骤:

以对Book数据表进行增删改查工作为例子:

1、创建好数据库并且连接

Book表创建:

CREATE TABLE book (id int(11) NOT NULL auto_increment,title varchar(32) NOT NULL COMMENT '书名',author varchar(32) default NULL COMMENT '作者',publication_date datetime default NULL COMMENT '出版日期',price int(32) default NULL COMMENT '价格',PRIMARY KEY  (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;insert  into book(id,title,author,publication_date,price) values (1,'西游记','吴承恩','1980-02-27 17:47:08',65),(2,'三国演义','罗贯中','1991-03-02 15:09:37',59),(3,'水浒传','施耐庵','1984-05-02 17:29:33',61),(4,'红楼梦','曹雪芹','1994-06-06 21:33:18',88);

 2、创建l配置文件:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configurationPUBLIC "-//mybatis//DTD Config 3.0//EN"".dtd">
<configuration><!-- 配置文件的根标识 --><properties resource="jdbc.properties"></properties><!-- 要引入的资源文件,我这里是JDBC的配置起名文件对应${jdbc.username}等属性--><!-- 别名 --><typeAliases><package name="ity"/></typeAliases><environments default="mysql"> <!--数据库环境,及连接配置 --><environment id="mysql"><transactionManager type="JDBC"></transactionManager><dataSource type="POOLED"><property name="driver" value="${jdbc.driver}"/><property name="url" value="jdbc:mysql://localhost:3307/experiment03?useSSL=true&amp;useUnicode=true&amp;characterEncoding=utf8"/><property name="username" value="${jdbc.username}"/><property name="password" value="${jdbc.password}"/></dataSource></environment></environments><mappers> <!-- 图纸资源配置,要将所有的持久化类对应xml映入配置文件中,才能找得到并且使用 --><mapper resource="mjy/l"/><mapper resource="mjy/l"/></mappers>
</configuration>

3、创建映射器:

首先明白它是由持久化类对应的xml+一个接口组成:

持久化类:

public class book implements Serializable {private int id;private String title;private String author;private String PublicationDate;private int price;public int getPrice() { return price; }public void setPrice(int price) { this.price = price; }public String getPublicationDate() { return PublicationDate; }public void setPublicationDate(String publicationDate) { PublicationDate = publicationDate; }public String getAuthor() { return author; }public void setAuthor(String author) { this.author = author; }public String getTitle() { return title; }public void setTitle(String title) { this.title = title; }public int getId() { return id; }public void setId(int id) { this.id = id; }@Overridepublic String toString() {return "book{" +"id=" + id +", title='" + title + ''' +", author='" + author + ''' +", PublicationDate='" + PublicationDate + ''' +", price=" + price +'}';}}

持久化类接口BookDao:

public interface dao {//增加一条itemint insertBook(book Book);//insert是没有传出参数,所以xml中不需要resultType
//删除int deleteBook(int id);
//更新Book表int updateBook(book Book);
//查看查看整个book表List<book> findBook();
}

与接口对应的l:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis//DTD Mapper 3.0//EN"".dtd">
<mapper namespace=&#st.dao"><--这里的namespace一定要写对应接口的包地址--><insert id="insertBook"  parameterType=&#st.book" useGeneratedKeys="true" keyProperty="id">insert  into book( title, author, publication_date, price) values(#{title},#{author},#{PublicationDate},#{price})</insert><delete id="deleteBook" parameterType="int" >delete from book where id=#{id}</delete><update id="updateBook" parameterType="int" >update book set title = #{title} where id = #{id}</update><select id="findBook" resultType=&#st.book" >select * from book</select>
</mapper>

4、测试类:进行增删改查操作(在后面一般写道控制层Controller)

public class MyBatisTest {InputStream in;SqlSession session;dao Dao;@Beforepublic void init() throws IOException{in = ResourceAsStream(&#l");//传入配置文件SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();//创建数据库工厂建筑师SqlSessionFactory factory = builder.build(in);//使用xml当资源给工厂session = factory.openSession();Dao = Mapper(dao.class);}@Test//查public void testfindBook() throws IOException {List<book> books = Dao.findBook();for (book Book :books){System.out.println(Book);}}@Test//增public void insertA() throws ClassNotFoundException {book book2 = new book();book2.setPrice(34);book2.setAuthor("哈哈哈");book2.setPublicationDate("2021-01-02");book2.setTitle("论财富是怎样积累的");System.out.println("新增加"+Dao.insertBook(book2)+"条记录");System.out.println(book2);}@Test//删public void testdelete(){System.out.println("删除"+Dao.deleteBook(8)+"条记录");}@Test//改public void testupdate(){book book3 = new book();book3.setId(7);book3.setTitle("momo");System.out.println("修改"+Dao.updateBook(book3)+"条数据");System.out.println(book3);}@After//使用完记得将会话关闭public void destory() throws IOException {sessionmit();session.close();in.close();}
}

步骤总结:

1、创建数据库表格()

2、创建l配置文件,将数据库配置进去

3、创建映射器:持久化类->持久化类接口+对应XML

4、编写测试类(对数据进行操作,后续开发一般写到controller中)

mybatis的常用注解

注解说明
@Insert新增
@Update 更新
@Delete删除
@Select查询
@Results与@Result 一起使用,封装多个结果集
@Result实现结果集封装
@ResultMap实现引用@Results 定义的封装
@One实现一对一结果集封装
@Many实现一对多结果集封装
@SelectProvider 实现动态 SQL 映射
@CacheNamespace实现注解二级缓存的使用

聚合查询:

对于统计总数、平均数这类计算,SQL提供了专门的聚合函数,使用聚合函数进行查询,就是聚合查询,它可以快速获得结果。

常用内置函数:

sum(列名) 求和      
max(列名) 最大值     
min(列名) 最小值     
avg(列名) 平均值     
first(列名)   第一条记录   
last(列名)    最后一条记录  
count(列名) count(*)  统计记录条目数  

count(列名)和count(*)的区别:区别不大

例子:

count(*)

SELECT COUNT(*) grils FROM students WHERE gender = 'F';//统计学生中女生有多少人
SELECT COUNT(*) studentid FROM student GROUP BY age; //统计学生中每个学生年龄段有多少人

动态SQL:

为了减少SQL代码的拼装,MyBatis提供对SQL语句动态组装能力,使用几个简单的XML元素完成动态SQL功能.

常用的动态sql元素:

        ·if

        ·choose(when、otherwise)

        ·where

        ·set

        ·foreach

        ·bind

简单示例:

<sql id="Base_Column_List">userid, nike_name, real_name, phone, `password`, last_logintime, last_login_id</sql><select id="selectByPrimaryKey" parameterType="java.lang.Integer" resultMap="BaseResultMap">select/*查询最好不要用*号,会增加性能开销*/<include refid="Base_Column_List" />from userwhere userid = #{userid,jdbcType=INTEGER}</select><insert id="insertSelective" keyColumn="userid" keyProperty="userid" parameterType=&#jingyi.ity.User" useGeneratedKeys="true">insert into user<trim prefix="(" suffix=")" suffixOverrides=","><if test="nikeName != null">nike_name,</if><if test="realName != null">real_name,</if><if test="phone != null">phone,</if><if test="password != null">`password`,</if><if test="lastLogintime != null">last_logintime,</if><if test="lastLoginId != null">last_login_id,</if></trim><trim prefix="values (" suffix=")" suffixOverrides=","><if test="nikeName != null">#{nikeName,jdbcType=VARCHAR},</if><if test="realName != null">#{realName,jdbcType=VARCHAR},</if><if test="phone != null">#{phone,jdbcType=VARCHAR},</if><if test="password != null">#{password,jdbcType=VARCHAR},</if><if test="lastLogintime != null">#{lastLogintime,jdbcType=TIMESTAMP},</if><if test="lastLoginId != null">#{lastLoginId,jdbcType=VARCHAR},</if></trim></insert>

    还有很多知识点还木有记完,原来总和起来实在是太多了,慢慢来⑧

本文发布于:2024-02-03 07:51:29,感谢您对本站的认可!

本文链接:https://www.4u4v.net/it/170691788849657.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:知识点   Mybatis
留言与评论(共有 0 条评论)
   
验证码:

Copyright ©2019-2022 Comsenz Inc.Powered by ©

网站地图1 网站地图2 网站地图3 网站地图4 网站地图5 网站地图6 网站地图7 网站地图8 网站地图9 网站地图10 网站地图11 网站地图12 网站地图13 网站地图14 网站地图15 网站地图16 网站地图17 网站地图18 网站地图19 网站地图20 网站地图21 网站地图22/a> 网站地图23