MyBatis简介
Mybatis历史
MyBatis最初是Apache的一个开源项目iBatis, 2010年6月这个项目由Apache Software Foundation迁移到了Google Code。随着开发团队
转投Google Code旗下,iBatis3.x正式更名为MyBatis。代码于2013年11月迁移到Github
iBatis一词来源于“internet”和“abatis”的组合,是一个基于Java的持久层框架。iBatis提供的持久层框架包括SQL Maps和Data AccessObjects(DAO)
Mybatis的特点
- MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。
- MyBatis 避免了几乎所有的 JDBC代码和手动设置参数以及获取结果集。
- MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的POJOs(Plain Ordinary Java Object,普通的 Java对象)映射成数据库中的记录。
每个MyBatis应用程序主要都是使用SqlSessionFactory实例的,一个SqlSessionFactory实例可以通过SqlSessionFactoryBuilder获得。SqlSessionFactoryBuilder可以从一个xml配置文件或者一个预定义的配置类的实例获得。
创建Maven项目并且编写代码
在IDEA中选择File–>new–>project,然后选择Maven项目,next–>Finish即可。
在pom.xml文件中引入依赖
最为核心的几个依赖包,mybatis包,junit测试单元,log4j日志,mysql数据库驱动包。
<dependencies>
<!--mybatis核心-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.7</version>
</dependency>
<!--junit 测试-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<!--MySql驱动-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.3</version>
</dependency>
<!--log4j 日志-->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
</dependencies>
创建mybatis核心配置为文件
在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>
<!--MyBatis核心配置文件的标签必须按照指定的顺序去配置
properties?,settings?,typeAliases?,typeHandlers?,objectFactory?,
objectWrapperFactory?,reflectorFactory?,plugins?,environments?,databaseIdProvider?,mappers?
-->
<properties resource="jdbc.properties"></properties>
<settings>
<!--将下划线映射为驼峰-->
<setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>
<typeAliases>
<package name=""/>
</typeAliases>
<!--配置链接数据库的环境-->
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</dataSource>
</environment>
</environments>
<!--引入映射文件-->
<mappers>
<package name=""/>
</mappers>
</configuration>
上面的配置文件中,目前需要注意几个点。
<typeAliases>标签
,根据它的标签名的意思为别名。就是我们在使用mybatis时,确定一个类,需要加它的全限定名称,比如下面的country实体类,它的全限定名应为com.gothic.sunset.pojo.Country
,这样看着都麻烦,而且实体类多了的话,也容易出错。typeAliase标签就是用来给包起一个别名,让我们可以在确定实体类时,只需要将typeAliase中写入别名,就可以只用实体类类名了。
<typeAliases>
<package name="com.gothic.sunset.pojo"/>
</typeAliases>
这样就可以直接使用country来确定实体类,一下子清爽了许多!
2. <environments>标签
,它主要是用来配置数据库连接的环境,和jdbc几乎一模一样,就不过多赘述,它也可以通过properties文件来将jdbc连接的用户名,密码,url,驱动名称映射过去。
3. ```标签``,mappers标签中配置了一个包含完整类路径的xxxxMapper.xml文件(这是一个mybatis的sql语句和映射配置文件),很核心的部分。
一开始你只需要了解,这个文件中对应着你的sql语句和mapper接口即可。
jdbc.porperties文件
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/mybatis?characterEncoding=UTF-8
jdbc.username=root
jdbc.password=root
创建数据表country
country表,三个字段,其中id为自增主键。
向country表中,填充几条记录。
建立对应的实体类country
在src/main/java的包下新建一个包com/gothic/sunset/pojo,然后写country实体类(getter和setter方法,toString方法,已经有参无参构造器)。
package com.gothic.sunset.pojo;
public class Country {
private int id;
private String countryname;
private String countrycode;
public Country(int id, String countryname, String countrycode) {
this.id = id;
this.countryname = countryname;
this.countrycode = countrycode;
}
public Country() {
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getCountryname() {
return countryname;
}
public void setCountryname(String countryname) {
this.countryname = countryname;
}
public String getCountrycode() {
return countrycode;
}
public void setCountrycode(String countrycode) {
this.countrycode = countrycode;
}
@Override
public String toString() {
return "Country{" +
"id=" + id +
", countryname='" + countryname + '\'' +
", countrycode='" + countrycode + '\'' +
'}';
}
}
写要实现功能的Mapper接口及配置Mapper.xml文件
在mybatis中,一般用Mapper作为接口类名和XMl的后缀。
首先,在包com/gothic/sunset/mapper中,编写mapper接口,CountryMapper.java.
一开始,我们就写一个功能,后面写动态sql,再将所有的CRUD全部实现。
package com.gothic.sunset.mapper;
import com.gothic.sunset.pojo.Country;
import java.util.List;
public interface CountryMapper {
/**
* 查询所有的国家信息
* @return
*/
List<Country> selectAll();
}
在resources目录下新建一个包,与上面的包一致 com/gothic/sunset/mapper,新建时,需要注意,切记路径不能以.号分隔,虽然它看起来完全一致,但是在target目录中,你就会观察到,并不是一致的。
新建时,应该这样做:
点击resources右键new一个directory,然后就如下图所示:
最后的目录结构如这样:
创建好目录后,新建CountryMapper.xml,这里的话为了方便与mapper接口相呼应,方便观察和编写代码(其实也都是大家都遵循的习惯啦)。
<?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="com.gothic.sunset.mapper.CountryMapper">
<!-- List<Country> selectAll();-->
<select id="selectAll" resultType="Country">
select id,countryname,countrycode from country
</select>
</mapper>
刚刚也已经所过,Mapper.xml文件中写的就是对应的sql语句。
这里暂时需要注意的是,其中增删改查,在xml中都是对应的英文标签insert ,delete,update,select。
重点是,如何将接口中的抽象方法与之对应,说到这里的话,看一下select标签中的id的值,其实就是对应的抽象方法名。
而resultType,不就是返回值类型吗,因为我们这个方法是要查找所有的country,那它每一条记录一定是一个country实体类的对象,所以这里写Country。
再看看标签体中的内容,就是最简单的sql语句(当然当前只是静态的,后面会有复杂的动态sql啊)。
说到这里,其实mybatis中最难的也就是配置文件难记,简单的很,多写写就熟练啦!
接下来完善之前的核心配置文件 mybatis-config.xml
添加包的别名,以及引入刚刚编写的Mapper.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>
<!--MyBatis核心配置文件的标签必须按照指定的顺序去配置
properties?,settings?,typeAliases?,typeHandlers?,objectFactory?,
objectWrapperFactory?,reflectorFactory?,plugins?,environments?,databaseIdProvider?,mappers?
-->
<properties resource="jdbc.properties"></properties>
<settings>
<!--将下划线映射为驼峰-->
<setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>
<typeAliases>
<package name="com.gothic.sunset.pojo"/>
</typeAliases>
<!--配置链接数据库的环境-->
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</dataSource>
</environment>
</environments>
<!--引入映射文件-->
<mappers>
<package name="com.gothic.sunset.mapper"/>
</mappers>
</configuration>
编写SqlSessionUtil工具类,用来获取SqlSession对象
每个MyBatis应用程序主要都是使用SqlSessionFactory实例的,一个SqlSessionFactory实例可以通过SqlSessionFactoryBuilder获得。SqlSessionFactoryBuilder可以从一个xml配置文件或者一个预定义的配置类的实例获得。
在com/gothic/sunset/util下新建一个SqlSessionUtil工具类:
package com.gothic.sunset.utils;
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.IOException;
import java.io.InputStream;
public class SqlSessionUtil {
public static SqlSession getSqlSession(){
SqlSession sqlSession = null;
try {
//获取核心配置文件输入流
InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
//获取sqlSessionFactoryBuilder对象
SqlSessionFactoryBuilder sqlSessionFactoryBuilder =new SqlSessionFactoryBuilder();
//获取sqlSessionFactory对象
SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(is);
//获取sqlSession对象
sqlSession = sqlSessionFactory.openSession(true);
} catch (IOException e) {
e.printStackTrace();
}
return sqlSession;
}
}
编写log4j.xml文件
在resources目录下:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
<appender name="STDOUT" class="org.apache.log4j.ConsoleAppender">
<param name="Encoding" value="UTF-8" />
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%-5p %d{MM-dd HH:mm:ss,SSS} %m (%F:%L) \n" />
</layout>
</appender>
<logger name="java.sql">
<level value="debug" />
</logger>
<logger name="org.apache.ibatis">
<level value="info" />
</logger>
<root>
<level value="debug" />
<appender-ref ref="STDOUT" />
</root>
</log4j:configuration>
当前的完整目录结构
编写测试用例Test
在test包下编写,利用junit来测试。
import com.gothic.sunset.mapper.CountryMapper;
import com.gothic.sunset.pojo.Country;
import com.gothic.sunset.utils.SqlSessionUtil;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;
import java.util.List;
public class test {
@Test
public void testSelectAllCt(){
SqlSession sqlSession = SqlSessionUtil.getSqlSession();
CountryMapper mapper = sqlSession.getMapper(CountryMapper.class);
List<Country> countryList = mapper.selectAll();
countryList.forEach(System.out::println);
}
}
测试输出:
与我们填充的数据一致,成功,第一天复习就到此结束啦。
关键的知识点,在于如何配置mybatis-config.xml以及Mapper.xml文件,和其中一些标签的用法含义,还有就是SqlSession的获取。