MyBatis初级入门及常见问题

入门案例

  1. 创建maven工程
    项目目录结构:
    在这里插入图片描述
    1. 首先在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>
  1. 编写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方法就省略了
	}
  1. 编写持久层接口(位于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();
		}
  1. 编写持久层映射文件(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接口, 注解与配置文件同时存在, 将出现如下错误
在这里插入图片描述

  1. 编写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>
  1. 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
  1. 编写测试类
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层开发混乱
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值