MyBatis中文官网:https://mybatis.org/mybatis-3/zh/getting-started.html
MyBatis是支持普通SQL查询,存储过程和高级映射的优秀持久层框架;
MyBatis封装了几乎所有的JDBC代码和参数的手工设置以及结果集的检索;MyBatis来做配置和定义映射关系,将Java的 POJOS( Plain Old Java Objects)映射成数据库中的记录。
MyBatis与JDBC比较:
减少了62%的代码量,最简单的持久化框架,架构级性能增强,SQL代码从程序代码中彻底分离、可重用,增强了项目中的分工,增强了移植性。
MyBatis体系结构:
1.加载配置:
配置有两种形式,一种是XML配置文件,另一种是Java代码的注解。MyBatis 将SQL的配置信息加载成为一个个的MappedStatement对象(包括了传入参数映射配置、执行的SQL语句、结果映射配置)并将其存储在内存中。
2.SQL解析:
当API接口层接收到调用请求时,会接收到传入SQL的ID和传入对象(可以是 Map、JavaBean或者基本数据类型),MyBatis会根据SQL的ID找到对应的 MappedStatement,根据传入参数对象对MappedStatement进行解析,解析后可以得到最终要执行的SQL语句和参数。
3.SQL执行:
将最终得到的SQL和参数拿到数据库进行执行,得到操作数据库的结果。
4.结果映射:
将操作数据库的结果按照映射的配置进行转换,可以转换成HashMap、 JavaBean或者基本数据类型,并将最终结果返回。
MyBatis配置文件:
MyBatis框架的XML配置文件包含下面两种类型:
1. SqlMapConfig.xml: 主配置文件,用于指定数据库连接参数和框架参数。
2. SqlMap.xml: 映射定义文件,用于定义SQL语句和映射信息。
使用MyBatis框架时,主要涉及的API:
1.SqlSessionFactoryBuilder:
该对象负责根据MyBatis配置文件SqlMapConfig.xml构建SqlSessionFactory实例。
2.SqlSessionFactory:
每一个MyBatis的应用程序都以一个SqlSessionFactory对象为核心,该对象负责创建SqlSession对象实例。
3.SqlSession:
该对象包含了所有执行SQL操作的方法,用于执行已映射的SQL语句。
搭建MyBatis环境:
在使用MyBatis之前,需要将MyBatis添加到工程项目中,主要步骤如下:
1. 为工程添加MyBatis开发包和数据库驱动包;
2. 在src下添加MyBatis配置文件mybatis-config.xml;
3. 配置mybatis-config.xml数据库连接参数;
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="oracle.jdbc.driver.OracleDriver"/>
<property name="url" value="jdbc:oracle:thin:@localhost:1521:orcl"/>
<property name="username" value="ZCY"/>
<property name="password" value="ZCY"/>
</dataSource>
</environment>
</environments>
<mappers>
<!-- <mapper resource="org/mybatis/example/BlogMapper.xml"/> -->
<mapper resource="Mapper/AdminInfoMapper.xml"/>
</mappers>
</configuration>
4. 利用MyBatis API编程,获取SqISession实例。
public class Demo {
public static void main(String[] args) {
InputStream ips=Demo.class.getClassLoader().getResourceAsStream("mybatis-config.xml");
SqlSessionFactoryBuilder builder=new SqlSessionFactoryBuilder();
SqlSessionFactory factory=builder.build(ips);
SqlSession session= factory.openSession();
AdminInfoMapper mapper= session.getMapper(AdminInfoMapper.class);
//分页
List<AdminInfo> admins=mapper.selectByPage(new RowBounds(0,1));
System.out.println(admins);
session.close();
}
}
通过SqlSession实现CRUD操作:
当获取SqISession对象后,就可以通过它对数据表执行增删改查操作,使用步骤如下:
1. 根据数据表编写实体类(JavaBean)
public class AdminInfo {
private Long adminId;
private String adminName;
private String adminPwd;
private Long adminStatus;
private Date adminCtime;
private Long roleId;
}
2. 编写AdminInfoMapper.xml映射文件,定义SQL操作和映射信息
public interface AdminInfoMapper {
//查询一共有多少个用户数据
Integer count();
//查询所有的用户
List<AdminInfo> selectAll();
//将密码修改成654321
Integer updatePwd();
//将对应的用id的密码进行修改
Integer updatePwd2(@Param("aaa") Long adminId,@Param("bbb") String pwd);
//按条件查询
List<AdminInfo> selectByParam(@Param("aaa") String name,@Param("bbb") Integer state);
//查询所有并且分页
List<AdminInfo> selectByPage(RowBounds row);
}
映射文件:
<?xml version="1.0" encoding="UTF-8"?>
<!-- 约束,模糊匹配,补全标签 -->
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!-- mapper是根标签,namespace:命名控件,对应接口类的权限定名 -->
<mapper namespace="Mapper.AdminInfoMapper">
<!-- 常用标签:select,delete,update,update -->
<!-- select默认属性:id,就是对应接口类的方法名称,resultType:返回值类型 -->
<select id="count" resultType="int">
<!-- 不要使用分号 -->
select count(0) from admin_info
</select>
<!-- -->
<resultMap type="bean.AdminInfo" id="AdminInfoMap">
<id column="ADMIN_ID" property="adminId"/>
<id column="ADMIN_NAME" property="adminName"/>
<id column="ADMIN_PWD" property="adminPwd"/>
<id column="ADMIN_STATUS" property="adminStatus"/>
<id column="ADMIN_CTIME" property="adminCtime"/>
<id column="ROLE_ID" property="roleId"/>
</resultMap>
<!-- 注意这里的返回值类型应该是resultMap,对应的值是resultMap标签的Id -->
<select id="selectAll" resultMap="AdminInfoMap">
<!-- 不要使用分号 -->
select * from admin_info
</select>
<!-- 增删改不需要写返回值 -->
<update id="updatePwd">
</update>
<!-- 按条件查询 -->
<select id="selectByPage" resultMap="AdminInfoMap">
select * from admin_info
</select>
</mapper>
3. 获取SqlSession对象,调用其API执行增删查改操作
4. 增删改要记得提交事务
5. 释放SqlSession对象资源
SqlSession的API:
1. 插入一条实体对象 :insert("SQL-ID" ,Bean);
2. 通过条件删除一条数据 :delete("SQL-ID" ,删除条件);
3. 通过条件查询返回一条数据 :selectOne("SQL-ID" ,查询条件);
4. 更新数据 :update("SQL-ID" ,Bean);
5. 查询多条数据返回集合对象:selectList("SQL-ID");
MyBatis实现分页查询:
1. MyBatis提供一个RowBounds类型,在查询时指定RowBounds参数对象可以控制抓取记录的起点和条数。
2. RowBounds rb = new RowBounds(offset,limit)。
3. 配合selectByPage重写方法进行分页查询。
//查询所有并且分页
List<AdminInfo> selectByPage(RowBounds row);
//分页
List<AdminInfo> admins=mapper.selectByPage(new RowBounds(0,1));
System.out.println(admins);
session.close();