入门案例
- 创建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 mapper
PUBLIC "-//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 configuration
PUBLIC "-//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层开发混乱