Mybatis
一、什么是Mybatis?
MyBatis的前身是iBatis,本是Apache的一个开源的项目,它是一个数据持久层(ORM)框架,把实体类和SQL语句之间建立了映射关系,是一种半自动化的ORM实现。MyBatis小巧,简单易学。与JDBC相比,减少了50%以上的代码量;它是最简单的持久化框架,小巧并简单易学;SQL代码从程序代码中彻底分离,可重用;提供XML标签,支持编写动态SQL。缺点是:SQL语句编写工作量大,对开发人员有一定要求;数据库移植性差。
二、Mybatis安装配置
(1)导入Mybatis依赖
(MyBatis的jar包下载地址:https://github.com/mybatis/mybatis-3/releases)
<dependencies>
<!-- 用于通过注解生成一些固定代码 -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>x.x.x</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>x.x.x</version>
</dependency>
<!-- 引入单元测试日志依赖 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>x.x.x</version>
</dependency>
<!-- 引入logback日志依赖 -->
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>x.x.x</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>x.x.x</version>
</dependency>
</dependencies>
(2)项目搭建
打开IDER,选择创建maven项目,选择org.app.maven.archetyypes:maven-archetype-quickstart模板进项创建Mybatis项目。然后对项目目录进行完善。
①在src/main/java/com.lanou3g.mybatis包下建立bean文件夹,用于存放与数据库相互映射的实体类;建立dao文件夹,用于存放定义的接口;
②在src/main目录下建立resources资源文件夹,用于存放配置文件。
③在test/java/com.lanou3g.test目录下建立AppTest类,用于进行单元测试。
三、使用MyBatis
(1)在resources文件夹下新建mybatis_conf.xmla配置文件进行对MyBatis配置:
<?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文件,只能引入一个
<properties resource="jdbc.properties" />
//这个配置使全局的映射器启用或禁用缓存
<settings>
<setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>
//定义类型别名(全局),在所有的Mapper.xml中都可以用
<typeAliases>
<typeAlias type="com.lanou3g.mybatis.bean.Teacher" alias="Teacher" />
</typeAliases>
//配置多套环境的数据库连接参数(如:开发环境、生产环境)
<environments default="lanou">
<environment id="lanou">
//事务管理器:
// MANAGED: 这个配置就是告诉mybatis不要干预事务,具体行为依赖于容器本身的事务处理逻辑。
// JDBC: 这个配置就是直接使用了 JDBC 的提交和回滚设置,它依赖于从数据源得到的连接来管理事务作用域。
<transactionManager type="MANAGED"/>
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.user}"/>
<property name="password" value="${jdbc.password}"/>
</dataSource>
</environment>
</environments>
//mapping 文件路径配置
<mappers>
<mapper resource="mapper/TeacherMapper.xml" />
</mappers>
</configuration>
(2)在resources文件夹中新建jdbc.properties配置文件,用于存放数据库连接的相关信息。
jdbc.url=jdbc:mysql://localhost:3306/yanfa5?characterEncoding=utf8
jdbc.driver=com.mysql.jdbc.Driver
jdbc.user=root
jdbc.password=root
(3)创建实体类,字段名要和数据库字段名一致;
package com.lanou3g.mybatis.bean;
import lombok.Getter;
import lombok.Setter;
import java.util.List;
@Getter
@Setter
public class Teacher {
private Integer id;
private String tname;
private Integer age;
private List<Student> students;
public Teacher (){}
public Teacher(String tname) {
this.tname = tname;
}
@Override
public String toString() {
return "{" +
"id:" + id +
", tname:'" + tname + '\'' +
", age:'" + age + '\'' +
", 所教学生:[" + students + '\'' +
"]}\n";
}
}
(4)在dao层创建接口,接口中为抽象类。
package com.lanou3g.mybatis.dao;
import com.lanou3g.mybatis.bean.Teacher;
import org.apache.ibatis.annotations.Param;
import java.util.List;
public interface TeacherDao {
List<Teacher> queryAll();
/**
* 多参数查询
* @param id
* @param age
* @return
*/
List<Teacher> queryByIdAndAge(@Param("tid") int id, @Param("age") int age);
}
(5)sql映射文件的配置;
在resources资源目录下新建mapper文件夹,用于存放sql映射文件。创建一个与你在src资源文件夹dao层下同接口类名的xml文件。
<?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">
//namespace对应空Dao接口的全名
<mapper namespace="com.lanou3g.mybatis.dao.TeacherDao">
<resultMap id="teacher" type="Teacher">
<id column="t_id" property="id" />
<result column="tname" property="tname" />
<result column="age" property="age" />
<collection property="students" ofType="Student">
<id column="s_id" property="id" />
<result property="sname" column="sname" />
<result property="nickName" column="nick_name" />
</collection>
</resultMap>
//此处的id是查询语句的名称,对应接口中的方法名
<select id="queryAll" resultType="Teacher">
select * from teacher;
</select>
//带两个参数,需要在接口中通过@Param注解指定名称(因为编译时参数名不会保留)
<select id="queryByIdAndAge" resultType="Teacher">
select * from teacher where id = #{id} and age <= #{age};
</select>
</mapper>
四、在Test/java文件夹下的AppTest类中进行单元测试
package com.lanou3g.spring;
/**
* Unit test for simple App.
*/
@Slf4j
public class AppTest {
// 1. 读入配置文件
String confPath = "mybatis_conf.xml";
InputStream in = Resources.getResourceAsStream(confPath);
// 2. 构建SqlSessionFactory(用于获取sqlSession)
SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(in);
// 3. 获取sqlSession对象(用于具体的CRUD) !如果需要提交数据的话,需要设置autocommit
SqlSession sqlSession = sessionFactory.openSession(true);
// xml方式测试
TeacherDao TeacherDao
= sqlSession.getMapper(TeacherDao.class);
/**
* 练习查询多个库(用到了多环境配置)
*/
@Test
// 查询教师表
List<Teacher> teacherList = teacherDao.queryAll();
log.info("teacherList: " + teacherList);
}
/**
* 多个参数查询语句
*/
@Test
public void testQueryByIdAndAge() {
List<Teacher> teacherList = teacherDao.queryByIdAndAge(6, 99);
log.info("查询结果:" + teacherList);
}
}