入门案例
- 创建maven工程
项目目录结构:
- 首先在maven的pom.xml导入Mybatis和MySQL的依赖坐标:
<dependencies><!--Junit测试依赖--><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.11</version><scope>test</scope></dependency><!--Mybatis依赖, 我使用3.4.5版本--><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.4.5</version></dependency><!--MySQL连接数据库的依赖, 使用版本5.1.6, 注: 版本必须与数据库对应, 否则因为数据库或者jar版本不匹配报数据库连接异常--><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.6</version></dependency><!--日志依赖, 用于观察Mybatis发送的SQL语句--><dependency><groupId>log4j</groupId><artifactId>log4j</artifactId><version>1.2.17</version></dependency></dependencies>
- 编写User实体类(位于com.regotto.domain包下面)
public class User implements Serializable {//存在如下属性private int id;private String username;private Date birthday;private String sex;private String address;//get, set, toString方法就省略了}
- 编写持久层接口(位于com.regotto.dao包下面)
package com.regotto.dao;import com.regotto.domain.User;import org.apache.ibatis.annotations.Select;import java.util.List;/*** Dao接口* @author regotto*/public interface UserDao {/**查询所有用户* @return list*///@Select("select * from user"), 注解开发List<User> findAll();}
- 编写持久层映射文件(UserDao.xml, 必须位于resource路径下的com.regotto.dao中, 否则后面会因为路径问题, 报映射文件找不到的异常)
注: 基于注解开发的时候, 不需要配置持久层映射文件, 必须记住一定Mybatis不允许对一个Dao层接口既使用xml开发, 又使用注解开发, 当使用注解开发的时候要把Dao层映射文件删除, 否则报载入映射文件异常!!!
<?xml version="1.0" encoding="UTF-8"?><!--设置dtd约束, 这样后面才会有Mybatis的提示--><!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"><mapper namespace="com.regotto.dao.UserDao"><!--select: 执行select语句的标签id: 对Dao层UserDao接口的哪一个方法执行select操作(如下id表示findAll, 表示对findAll方法执行SQL语句)resultType: 返回值类型, 查询用户, 返回值类型User(此处需要写包的全路径)--><select id="findAll" resultType="com.regotto.domain.User">select * from user</select></mapper>
对同一个Dao接口, 注解与配置文件同时存在, 将出现如下错误
- 编写Mybatis配置文件(SqlMapConfig.xml, 该文件位于resource文件夹下)
无论是xml开发, 还是注解开发, 必须要写Mybatis的配置文件
<?xml version="1.0" encoding="UTF-8"?>
<!--导入配置文件dtd-->
<!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd"><configuration><!--配置数据库环境为mysql--><environments default="mysql"><!--配置mysql环境, id需要与前面default一样, 否则报环境配置错误--><environment id="mysql"><!--配置事务类型, 默认使用Mysql自己的JDBC事务--><transactionManager type="JDBC"></transactionManager><!--配置连接池(数据源DataSource), 使用的是Mybatis自己的连接池--><dataSource type="POOLED"><property name="driver" value="com.mysql.jdbc.Driver"/><property name="url" value="jdbc:mysql://localhost:3306/test"/><property name="username" value="root"/><property name="password" value="qad12345"/></dataSource></environment></environments><!--指定映射文件的位置, 每一个Dao都有一个独立的映射文件--><mappers><!--在resource目录下包中持久层映射文件, 在使用注解的时候不能使用XXXDao.xml配置文件, mybatis的约束不能对同一个Dao既使用注解, 又使用配置文件, 此时要做的就是将XXXDao配置文件移出com.regotto.dao中mapper: 配置Dao开发方式resource: Dao层映射文件位置class: Dao接口在包中位置--><!--使用Dao层映射文件(UserDao.xml)开发--><mapper resource="com/regotto/dao/UserDao.xml"/><!-- 使用注解的方式--><!--<mapper class="com.regotto.dao.UserDao"/>--></mappers></configuration>
- Log4j配置文件(位于resource文件夹下)
# Set root category priority to INFO and its only appender to CONSOLE.
#log4j.rootCategory=INFO, CONSOLE debug info warn error fatal
log4j.rootCategory=debug, CONSOLE, LOGFILE# Set the enterprise logger category to FATAL and its only appender to CONSOLE.
log4j.logger.org.apache.axis.enterprise=FATAL, CONSOLE# CONSOLE is set to be a ConsoleAppender using a PatternLayout.
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern=%d{ISO8601} %-6r [%15.15t] %-5p %30.30c %x - %m\n# LOGFILE is set to be a File appender using a PatternLayout.
log4j.appender.LOGFILE=org.apache.log4j.FileAppender
log4j.appender.LOGFILE.File=d:\axis.log
log4j.appender.LOGFILE.Append=true
log4j.appender.LOGFILE.layout=org.apache.log4j.PatternLayout
log4j.appender.LOGFILE.layout.ConversionPattern=%d{ISO8601} %-6r [%15.15t] %-5p %30.30c %x - %m\n
- 编写测试类
package com.regotto;import static org.junit.Assert.assertTrue;import com.regotto.dao.UserDao;
import com.regotto.domain.User;
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 org.junit.Test;import java.io.IOException;
import java.io.InputStream;
import java.util.List;/*** Unit test for MybatisTest App.*/
public class MybatisTest {public static void main(String[] args) throws Exception {//1.读取配置文件InputStream inputStream = Resources.getResourceAsStream("SqlMapConfig.xml");//2.创建SQLSessionFactory工厂SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);//3.创建session对象SqlSession sqlSession = sqlSessionFactory.openSession();//4.使用SqlSession对象创建Dao接口的代理对象UserDao userDao = sqlSession.getMapper(UserDao.class);//代理对象直接调用对应的方法List<User> users = userDao.findAll();for (User u : users) {System.out.println(u);}//释放资源sqlSession.close();inputStream.close();}
}
运行结果如下:
7. 总结:
前面使用两种方式解释入门案例:1. 使用Dao层映射配置文件2. 使用注解开发, 出现注解的地方都进行了注释总流程如下:1. 创建maven工程, 导入对应jar包依赖2. 创建实例类, Dao层接口3. 创建Dao层接口的映射配置文件4. 创建Mybatis的配置文件(配置数据库环境, 连接池, 加载Dao层接口映射配置文件)5. 创建测试类:1. 使用Resources加载Mybatis的配置文件2. 使用SqlSessionFactoryBuilder.build创建session工厂3. 使用session工厂创建session对象4. 使用session对象创建Dao接口的代理对象5. 使用代理对象直接调用接口方法(执行SQL)6. 释放资源, 关闭session会话, 关闭Resources的输入流遇到的问题:1. 配置文件路径一定要放对, 当出现配置文件未找到要么是配置文件名称错误, 要么就是配置文件位置错误2. 在resource目录下包中持久层映射文件, 在使用注解的时候不能使用XXXDao.xml配置文件, mybatis的约束不能对同一个Dao既使用注解, 又使用配置文件, 此时要做的就是将XXXDao配置文件移出com.regotto.dao中我就因为这个问题弄了好久, 最后才发现这个问题, 根据其他网友解释, 这样做的原因是为了统一化开发, 防止Dao层开发混乱