MyBatis
MyBatis框架介绍
mybatis是Apache软件基金会下的一个开源项目,前身是iBatis框架。
mybatis的优点
- 简单易学:mybatis本身就很小且简单。没有任何第三方依赖,最简单安装只要两个jar文件+配置几个SQL映射文件即可。
- 使用灵活:Mybatis不会对应用程序或者数据库的现有设计强加任何影响。SQL语句写在XML里,便于统一管理和优化。
- 解除SQL与程序代码的耦合:通过提供DAO层,将业务逻辑和数据访问逻辑分离,使系统的设计更清晰,更易维护,更易进行单元测试。SQL语句和代码的分离,提高了可维护性。
mybatis的缺点
- 编写SQL语句时工作量很大,尤其是字段多、关联表多时,更是如此。
- SQL语句依赖于数据库,导致数据库移植性差,不能更换数据库。
- 框架还是比较简陋,功能尚有缺失,二级缓存机制不佳
mybatis的作用
对JDBC的代码进行了封装,在使用JDBC对数据库进行操作时更加简单方便,在mybatis中一张表就是一个实体类,表的一行记录就是创建的一个对象,表中的字段就是这个实体类中的成员变量。
MyBatis的入门代码(案例)
首先要知道使用mybatis框架时需要导入2个jar包,一个是你对应的数据库的驱动包,另一个是mybatis的jar包,还有mybatis的核心配置文件和实体类的映射文件。
核心配置文件
<?xml version="1.0" encoding="UTF-8" ?>
<!--MyBatis的DTD约束-->
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
<!--configuration 核心根标签-->
<configuration>
<properties resource="jdbc.properties"/>
<settings>
<setting name="logImpl" value="log4j"/>
</settings>
<typeAliases>
<typeAlias type="entity.Student" alias="student"/>
</typeAliases>
<!--environments配置数据库环境,环境可以有多个。default属性指定使用的是哪个-->
<environments default="mysql">
<!--environment配置数据库环境 id属性唯一标识-->
<environment id="mysql">
<!-- transactionManager事务管理。 type属性,采用JDBC默认的事务-->
<transactionManager type="JDBC"></transactionManager>
<!-- dataSource数据源信息 type属性 连接池-->
<dataSource type="POOLED">
<!-- property获取数据库连接的配置信息 -->
<property name="driver" value="${driver}" />
<property name="url" value="${url}" />
<property name="username" value="${username}" />
<property name="password" value="${password}" />
</dataSource>
</environment>
</environments>
<!-- mappers引入映射配置文件 -->
<mappers>
<!-- mapper 引入指定的映射配置文件 resource属性指定映射配置文件的名称 -->
<mapper resource="StudentMapper.xml"/>
</mappers>
</configuration>
实体类映射文件
<?xml version="1.0" encoding="UTF-8" ?>
<!--MyBatis的DTD约束-->
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--
mapper:核心根标签
namespace属性:名称空间
-->
<mapper namespace="mapper.StudentMapper">
<!--
select:查询功能的标签
id属性:唯一标识
resultType属性:指定结果映射对象类型
parameterType属性:指定参数映射对象类型
-->
<select id="selectAll" resultType="student">
SELECT * FROM student
</select>
<select id="selectById" resultType="student" parameterType="int">
SELECT * FROM student WHERE id = #{id}
</select>
<insert id="insert" parameterType="student">
insert into student values (#{id},#{name},#{age})
</insert>
<update id="update" parameterType="student">
update student set name = #{name},age = #{age} where id = #{id}
</update>
<delete id="delete" parameterType="int">
DELETE FROM student WHERE id = #{id}
</delete>
</mapper>
package controller;
import entity.Student;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import java.io.InputStream;
import java.util.List;
public class demo01 {
public static void main(String[] args) throws Exception{
//1.导包在lib下
//2.使用MyBatis中提供的一个类Resources中getResourceAsStream方法读取src下的核心配置文件
InputStream is = Resources.getResourceAsStream("MybatisConfig.xml");
//3.创建一个工厂类,需要使用MyBatis中SqlSessionFactoryBuilder的build方法获取一个工厂类
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
//4.使用工厂类中的openSession方法获取sqlSession对象
SqlSession sqlSession = sqlSessionFactory.openSession();
//5.利用sqlSession中selectList方法来查询到一个学生集合,这里的参数是映射文件当中的名称空间.方法id
List<Student> list = sqlSession.selectList("mapper.StudentMapper.selectAll");
//6.遍历这个集合打印每一个学生对象
for (Student student : list) {
System.out.println(student);
}
//7.关闭sqlSession对象和输入流
sqlSession.close();
is.close();
}
}
入门代码的过程
- 导包
- 定义全局的配置文件(mybatis核心配置文件和实体类映射文件)
- 使用mybatis提供的Resources类获取核心配置文件的信息
- 创建SqlSessionFactoryBuilder对象,用bulid方法,参数传输入流,就能获取到工厂对象(sqlSessionFactory)
- 使用工厂对象中的opensession获取得到sqlsession对象
- 再用sqlsession的selectList方法返回一个实体类List对象
- 遍历这个list集合,打印出每一个实体类对象
- 释放资源
类的介绍
ResourcesAPI
这个类主要就是加载配置文件,将配置文件放在一个字节输入流里。
SqlSessionFactoryBuilder
首先要创建出这个类(new)使用build方法,参数就是上面的字节输入,可以创建出工厂类
SqlSessionFactory
openSession()创建SQLsession,并且默认不会自动提交事务,参数为一个布尔类型的值,设置为true,那么在进行增删改的操作时就不会导致数据库没有更新数据(如果让他使用默认的FALSE,则为手动提交),如果代码写完不提交事务,那么数据库中没有数据的更新,所以下面就要使用sqlsession的commit方法来提交事务
SQLSession
这个对象是最后创建出的对象,也是最重要的对象,可以进行增删改查的操作查询则是有两个方法,查询一个实体类对象selectOne,查询一个实体类对象集合selectList。这个类也管理了事务的手动提交和自动提交,同样这个类也是需要关闭资源的一个类
实体类映射文件(StudentMapper.xml)
Mapper 标签
namespace属性:可以理解为包名
select标签
id属性:就相当于方法的名字
resultType:方法的返回值类型
parameterType:传递的参数类型
标签中的内容就是接口中方法的方法体内容