首页 > 代码库 > MyBatis 知识点梳理
MyBatis 知识点梳理
简单地梳理下MyBatis相关的知识点,主要想让自己重新捡起以前学的框架,如果能给广大程序猿朋友有所帮助那就更好了。有疏漏的地方也欢迎大家评论指出。闲言少叙,进入正题。。。。。。。
MyBatis知识梳理
简介(百度,随便看看)
- MyBatis最早源自Apache基金会的一个开源项目iBatis,2010年这个项目有Apache software foundation迁移到了google code,并且改名为MyBatis。
- MyBatis是支持普通SQL查询,存储过程和高级映射的优秀持久层框架。
- MyBatis封装了几乎所有的JDBC代码和参数的手工设置以及结果集的检索。
- MyBatis使用简单地XML或注解做配置和定义映射关系,将Java的POJOs(Plain Old Java Objects)映射成数据库中的记录。
MyBatis体系结构中的几个关键部分
- 加载配置 —— 可以是XML配置文件方式,也可以是Java代码的注释。MyBatis将SQL的配置信息加载成为一个个的MappedStatement对象(包括了传入参数映射配置,执行的SQL语句、结果映射配置) ,并将其存储在内存中
- SQL解析 —— 当API接口层接收到调用请求时,会收到传入SQL的ID和传入对象(Map、JavaBean或者基本数据类型),MyBatis会根据SQL的ID找到对应的MappedStatement,然后根据传入参数对象对MappedStatement进行解析,解析后可以得到最终要执行的SQL语句和参数。
- SQL执行 —— 将得到的SQL和参数拿到数据库进行执行,得到操作数据库的结果。
- 结果映射 —— 将结果按照映射的配置进行转换,可以转换成HashMap、JavaBean或者基本数据类型,并将最终结果返回。
MyBatis的配置文件
- SqlMapConfig.xml(1个):主配置文件,用于指定数据库连接参数和框架参数
1 <?xml version="1.0" encoding="UTF-8" ?> 2 <!DOCTYPE configuration 3 PUBLIC "-//mybatis.org//DTD Config 3.0//EN" 4 "http://mybatis.org/dtd/mybatis-3-config.dtd"> 5 6 7 <configuration> 8 <!-- 全局别名,之后映射文件引用可以使用PersonEntity代替com.maven.mybatis.entity.PersonEntity--> 9 <typeAliases> 10 <typeAlias type="com.maven.mybatis.entity.PersonEntity" alias="PersonEntity"/> 11 </typeAliases> 12 13 <environments default="development"> 14 <environment id="development"> 15 <transactionManager type="JDBC"/> 16 <dataSource type="POOLED"> 17 <property name="driver" value="com.mysql.jdbc.Driver"/> 18 <property name="url" value="jdbc:mysql://localhost:3306/test"/> 19 <property name="username" value="root"/> 20 <property name="password" value=""/> 21 </dataSource> 22 </environment> 23 </environments> 24 <!-- 指定映射定义文件 --> 25 <mappers> 26 <mapper resource="com/maven/mybatis/mapper/PersonEntityMapper.xml"/> 27 </mappers> 28 29 </configuration>
- SqlMap.xml(n个):映射定义文件,用于定义SQL语句和映射信息
!!注:namespace有重要作用,不要重复,调用此文件定义增删改查操作是需要指定namespace;
1 <?xml version="1.0" encoding="UTF-8" ?> 2 <!DOCTYPE mapper 3 PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" 4 "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> 5 6 <mapper namespace="com.maven.mybatis.mapper.PersonEntityMapper"> 7 <select id="queryAll" resultType="PersonEntity"> 8 select * from t_person 9 </select> 10 11 <insert id="insert" parameterType="PersonEntity"> 12 insert into t_person(id, name) values(#{id}, #{name}) 13 </insert> 14 15 </mapper>
MyBatis框架主要API简介
- SqlSessionFactoryBuilder:该对象负责根据MyBatis配置文件SqlMapConfig.xml构建SqlSessionFactory实例
- SqlSessionFactory:每一个MyBatis的应用程序都以一个SqlSessionFactory对象为核心。该对象负责创建SqlSession对象实例。
- SqlSession:该对象包含了所有执行SQL操作的方法,用于执行已映射的SQL语句。
MyBatis基本应用
- 搭建MyBatis技术环境
- 为工程添加MyBatis开发包和数据库驱动包
-
- 在src下添加MyBatis配置文件SqlMapConfig.xml
- 修改SqlMapConfig.xml,指定数据库连接参数
- 利用MyBatis API编程,获取SqlSession实例
- 获取SqlSession对象
String conf = "SqlMapConfig.xml"; InputStream in = Resources.getResourceAsStream(resource); //创建SqlSessionFactoryBuilder对象 SqlSessionFactoryBuilder sfb = new SqlSessionFactoryBuilder(); //通过SessionFactoryBuilder对象获取SqlSessionFactory SqlSessionFactory sf = sfb.build(in); //创建Session SqlSession session = sf.openSession();
- 实现CRUD操作
- 添加操作
SqlMap.xml定义<!--parameterType因为前面定义过Alias所以不需要写包名,否则要写全包名加类名--> <insert id="insert" parameterType="PersonEntity"> insert into t_person(id, name) values(#{id}, #{name}) </insert>
id属性:用于表示映射文件的sql,可以理解为MappedStatement的id
#{}:标识一个占位符
parameterType:指定输入参数的类型
#{name}:其中name表示输入的参数,参数名为name;如果输入参数为简单类型,#{}中参数可以任意。
Java代码//NAMESPACE为SqlMapper.xml文件根标签的namespace属性 SqlSession session = sf.openSession();
//第一个参数:指映射文件的id值:namespace.id
//第二个参数:指映射文件中匹配parameterType类型的实参 session.insert(NAMESPACE + ".insert", person); session.commit(); session.close(); - 添加后返回主键
- mysql自增主键返回,mysql每次在调用完一个INSERT语句时会自动生成一个自增主键,可以通过函数LAST_INSERT_ID()获取到插入记录的自增主键。
<insert id="insert" parameterType="PersonEntity"> <!--查询后将自增主键返回到实体对象-->
<selectKey keyProperty="id" order="AFTER" resultType="int"> SELECT LAST_INSERT_ID() </selectKey> INSERT INTO t_person(name) VALUES(#{name}) </insert>keyProperty属性:配置返回user对象的属性名
order属性:配置相对于insert语句执行前或执行后
resultType:指定结果类型 - 非自增主键返回,使用UUID()函数。在INSERT语句之前执行UUID函数,再将结果插入到INSERT语句中作为主键(主键必须是字符串类型,长度至少是35位)
<insert id="insert" parameterType="PersonEntity"> <selectKey keyProperty="id" order="BEFORE" resultType="java.lang.String"> SELECT REPLACE(UUID(),‘-‘,‘‘) </selectKey> INSERT INTO t_person(id, name) VALUES(#{id},#{name}) </insert>
- Oracle中自增主键返回
<selectKey keyProperty="id" order="BEFORE" resultType="java.lang.String"> SELECT 序列名.nextVal() </selectKey>
- mysql自增主键返回,mysql每次在调用完一个INSERT语句时会自动生成一个自增主键,可以通过函数LAST_INSERT_ID()获取到插入记录的自增主键。
- 更新操作
SqlMap.xml定义
<update id="update" parameterType="PersonEntity"> update t_person set name=#{name} where id=#{id} </update >
Java代码
SqlSession session = sf.openSession(); session.update(NAMESPACE + ".update", person); session.commit(); session.close();
-
删除操作
SqlMap.xml定义
<delete id="delete" parameterType="int"> delete from t_person where id=#{id} </select>
Java代码
SqlSession session = sf.openSession(); session.delete(NAMESPACE + ".delete", 100); session.commit(); session.close();
- 查询操作
SqlMap.xml定义
<!--查询单行记录--> <select id="queryById" parameterType="int" resultType="PersonEntity"> select * from t_person </select> <!--查询多行记录--> <select id="queryAll" resultType="PersonEntity"> select * from t_person </select> <!--查询返回Map类型查询结果--> <select id="queryPerson" parameterType="int" resultType="java.util.HashMap"> select id, name from t_person where id=#{id} </select>
${}:表示拼接sql字符串,如select * from t_person where name like ‘%${value}%‘
${value}:接受输入参数的内容;如果传入的类型是简单类型,只能使用value
Java代码
SqlSession session = sf.openSession(); /* //查询单行记录 PersonEntity person = (PersonEntity)session.selectOne(NAMESPACE + ".queryById", 100); //返回Map查询结果 Map map = (Map)session.selectOne("queryPerson", 100); */ //查询多行记录 List<PersonEntity> personList = session.selectList(NAMESPACE + ".queryAll"); session.commit(); session.close();
- 添加操作
- MyBatis实现分页查询 —— 在使用SqlSession的selectList()方法时,指定一个RowBounds分页器参数,即可查询指定范围的记录。提示:MyBatis分页是基于内存分页,原理是查询出所有记录,然后基于jdbc的absolute()和next()方法定位获取部分记录,因此在遇到大量数据情况下,不推荐使用MyBatis自带分页功能。需要开发者指定分页查询的SQL语句或对MyBatis进行扩展使用。
- RowBounds(offset, limit)
- offset指定抓取记录的起始行,从0开始
- limit指定抓取记录的数量 - 使用方法:sqlSession.selectList(SQL的ID, 参数, RowBounds对象);
- RowBounds(offset, limit)
- Mapper映射器:是开发者创造绑定映射语句的接口,映射器接口的实例可以从SqlSession中获得。
SqlSession session = sqlSessionFactory.openSession(); PersonMapper mapper = session.getMapper(PersonEntity.class); session.close();
PersonMapper接口定义:
public interface PersonMapper{ public List<PersonEntity> queryAll(); public PersonEntity queryById(int id); public void insert(Person person); public void update(Person person); public void delete(int id); //!提示:Mapper接口中的方法名要和SqlMap.xml中的SQL的id保持一致 }
遵循如下规范,MyBatis会自动给我们创建实现该接口的代理对象
- 在mapper.xml的namespace属性值必须是mapper接口的全路径
- mapper接口中的方法名必须和mapper.xml文件中的id值相同
- mapper接口中的输入参数类型必须和mapper.xml中statement中的parameterType类型相同
- mapper接口中的方法的返回值类型和mapper.xml中statement中的resultType的类型相同 - ResultMap映射定义
在SqlMap.xml定义<select>操作时,如果查询结果字段名和Java POJO属于不一致时,需要使用<resultMap>元素显示指定映射关系,例如
<select id="queryAll1" resultMap="personMap"> select id, name from t_person </select> <resultMap id="personMap" type="PersonEntity"> <result property="no" column="id" /> <result property="username" column="name" /> </resultMap>
- SqlMapConfig.xml核心配置文件介绍
未完,待续。。。。。。
MyBatis 知识点梳理