Mybatis的原理及详细配置
一、MyBatis的概述:
MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis 。iBATIS一词来源于“internet”和“abatis”的组合,是一个基于Java的持久层框架。iBATIS提供的持久层框架包括SQL Maps和Data Access Objects。
简而言之,MyBatis是一个能将传统JDBC变得很方便和易于维护的框架。我们只需要提供SQL语句,而建立连接,创建Statement,处理JDBC异常等工作都可以交给MyBatis去做。
mybatis官方中文网站:https://mybatis.org/mybatis-3/zh/index.html
二、MyBatis环境搭建:
(1)导入jar包:
<!-- 单元测试工具包-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
<!--导入MySql数据库的驱动包-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.39</version>
</dependency>
<!--导入mybatis依赖包-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.1</version>
</dependency>
(2)创建mybatis配置文件(mybatis-config.xml):
每个基于 MyBatis 的应用都是以一个 SqlSessionFactory 的实例为核心的。SqlSessionFactory 的实例可以通过 SqlSessionFactoryBuilder 获得。而 SqlSessionFactoryBuilder 则可以从 XML 配置文件或一个预先配置的 Configuration 实例来构建出 SqlSessionFactory 实例。
有了 SqlSessionFactory,顾名思义,我们可以从中获得 SqlSession 的实例。SqlSession 提供了在数据库执行 SQL 命令所需的所有方法
在resources目录下新建配置文件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>
<!--指定数据库的配置文件-->
<properties resource="db.properties" />
<environments default="development">
<!--环境配置,即连接的数据库-->
<environment id="development">
<!--指定事务管理类型,type="jdbc"指直接简单使用了jdbc的提交和回滚设置-->
<transactionManager type="JDBC"/>
<!--datasource 指数据源的配置,POOLED是JDBC连接对象的数据源连接池的实现-->
<dataSource type="POOLED">
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
</dataSource>
</environment>
</environments>
<!--每个mapper.xml都需要在mybatis配置文件中进行配置-->
<mappers>
</mappers>
</configuration>
注意:标签中可以使用xml或者注解形式配置
(3)获的sqlSession实例:
因为SqlSession经常需要重复使用,所有我们可以去编写一个工具类来实现以后需要多次实现的内容:
新建一个utils包,并在utils包下创建MybatisUtils类
public class MybatisUtils {
private static SqlSessionFactory sqlSessionFactory;
static {
//获取SqlSessionFactory工厂类
String resource = "mybatis-config.xml";
InputStream inputStream = null;
try {
inputStream = Resources.getResourceAsStream(resource);
} catch (IOException e) {
e.printStackTrace();
}
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
}
//通过SqlSessionFactory获取SqlSession实例
public static SqlSession getSqlSession(){
return sqlSessionFactory.openSession();
}
}
通过上面的工具类即可获取SqlSession实例,剩下就是对sqlSession一系列操作。
三、MyBatis代码实现
SqlSession对数据库的操作既可以使用XML方式也可以使用注解的方式,MyBatis 最初配置信息是基于 XML ,映射语句(SQL)也是定义在 XML 中的。而到了 MyBatis 3提供了新的基于注解的配置。在此只实现注解方式(简便):
例如先编写一个实体类:
public class User {
int stuid;
String username;
int classid;
Classinfo c;
//省略构造方法、get、set、toString方法
}
注意:我们可以不用手写实体类的构造方法、get、set、toString方法。可以导入lombok的jar包,使用注解形式注入(代替手写):
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.10</version>
</dependency>
最终的实体类:
@Data //实现setter()、getter()、ToString()、equals()和hashcode()
@NoArgsConstructor //实现无参构造器
@AllArgsConstructor //实现全参构造器
public class User {
int stuid;
String username;
int classid;
Classinfo c;
}
接口类:
@Repository
public interface IUserDAO {
@Select("select * from student where stuid=#{id}")
public Student findOne(@Param("id")int id);
@Update("update student set username=#{username} where stuid=#{stuid}")
public void updateStu(Student student);
@Select("select * from student where classid=#{cid}")
public List<Student> findStusByCid(@Param("cid")int cid);
@Select("select * from student")
@Results({
@Result(column = "classid",property = "classid"),
@Result(property = "c",column = "classid",one = @One(select = "com.dao.ClassinfoDao.findClass",fetchType = FetchType.LAZY))
})
public List<Student> findAllStu();
}
实现类:
@Repository
public class UserImpl implements IUserDAO {
public Student findOne(int id) {
return null;
}
public void updateStu(Student student) {
}
public List<Student> findStusByCid(int cid) {
return null;
}
public List<Student> findAllStu() {
return null;
}
}