目录
Mybatis由来:
Mybatis作用:
ORM框架补充:
ORM框架-对象关系映射模式
方式:
流行的ORM框架:
MyBatis的优势:
核心组件:
各核心组件的作用:
SqlSessionFactoryBuilder(构造器)
SqlSessionFactory(工厂)
SqlSession(会话)
SqlMapper(映射器):
映射器实例化代码
MyBatis实例及其步骤:
步骤总结:
mybatis的常用注解
聚合查询:
动态SQL:
常用的动态sql元素:
简单示例:
mybatis本来是apache的一个开源项目iBatis,后来转移到GitHub,是一个基于Java的持久层框架。因为使用JDBC连接数据库会造成释放资源平凡从而浪费性能,也存在硬编码问题,不易于维护。因此引入ORM框架(Mybatis使用的一种框架。)
Mybatis支持普通SQL查询、存储过程和高级映射的持久层框架,消除了所有关于JDBC配置链接等代码和参数的手工设置以及结果集检索Statement。并且使用简单的XML或注解方式配置和映射原生信息。
是一种提供持久化类与表的映射关系的连接数据库的桥梁,ORM框架能在运行时参照映射文件信息,将对象持久化到数据库中。他能把对持久化对象的增删改查操作转换成对数据库的sql操作。
采用元数据来描述对象与关系映射的细节,元数据一般采用xml格式,存放在专门的对象映射文件中。
(补充)元数据:是描述其他数据的数据,用于提供某种资源有关信息的结构数据
Hibernate:最为流行的ORM框架,Java EE官方标准JPA就是收到Hibernate影响,具有开源免费,可扩展等特点。SpringDATAJPA的底层实际上主要也是使用Hibernate实现的。
Toplink:Orcale公司产品。
MyBatis:Apache组织的项目。
构造器:SqlSessionFactoryBuilder
工厂:SqlSessionFactory
会话:SqlSession
执行器:Executor
是一个真正执行Java和数据库交互的对象
参数处理器:ParameterHandler
Mybatis通过参数处理器对预编译语句进行参数设置
jdbc封装器:StatementHandler
专门处理一次数据库会话的,会话记录了本次连接的信息。
结果处理器:ResultSetHandler
Mybatis通过结果处理器对返回结果集进行组装
映射器:SqlMapper
根据全局配置文件生成SqlSessionFactory,采用分布构建的建造者模式工作,包括插件插入等,一般使用其build方法创建SqlSessionFactory对象。当SqlSessionFactory对象创建成功后,构造器生命周期结束,失去作用。
每个数据库只会对应一个SqlSessionFactory对象,创建多个会造成资源浪费,它可以当作是一个数据库连接池,使用openSession创建SqlSession对象。
SqlSessionFactory对象是线程安全的,其生命周期是整个MyBatis的应用中,直到不再使用MyBatis。
SqlSessionFactory是一个接口,在MyBatis中有两个实现类,SqlSessionManager和DefaultSqlSessionFactory,SqlSessionManager使用在多线程的环境中,他具体是依靠DefaultSqlSessionFactory实现的。
会话是执行持久化操作的,其对象是程序与持久层之间执行交互的一个单线程对象,代表一个连接资源的的启用。
主要作用:使动态代理模式获取Mapper接口,发送SQL给数据库,控制数据库事务等。
其常用方法:
方法 | 作用 |
T getMapper(Classs<T>type) | 返回Mapper接口代理对象 |
Commit() | 提交事务 |
Rollback() | 回滚事务 |
ClearCache() | 清除缓存 |
Close() | 关闭SQlSession对象,使用完后要及时关闭。 |
映射器是的最重要的组件,由一个接口和对应的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);}
}
以对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&useUnicode=true&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中)
注解 | 说明 |
@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代码的拼装,MyBatis提供对SQL语句动态组装能力,使用几个简单的XML元素完成动态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小时内删除。
留言与评论(共有 0 条评论) |