深入理解MyBatis的原理(一): 独立的入门demo

前言:不结合spring,只有 mybatis+maven。数据库使用 oracle。不尝试永远不知道会发生什么事,其中遇到两个小问题,也记录下来了。转载请注明出处:https://www.cnblogs.com/yuxiaole/p/9429807.html

一、创建用户表,用于这次的demo

-- Create table
create table t_user
(
  id   number not null,
  name varchar2(1000),
  age  number
)
;
-- Add comments to the table 
comment on table t_user
  is '用户表';
-- Add comments to the columns 
comment on column t_user.id
  is '主键';
comment on column t_user.name
  is '用户名';
comment on column t_user.age
  is '年龄';
-- Create/Recreate primary, unique and foreign key constraints 
alter table t_user
  add constraint t_user_id primary key (ID);

  创建完表结构,就可以新增数据了

insert into T_USER (ID, NAME, AGE)
values (1, 'yule', 18);
insert into T_USER (ID, NAME, AGE)
values (2, 'xiaohua', 24);
insert into T_USER (ID, NAME, AGE)
values (3, '小明', 30);
insert into T_USER (ID, NAME, AGE)
values (4, '小小', 24);

二、pom.xml 中引入 MyBatis

    <!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
    <dependency>
      <groupId>org.mybatis</groupId>
      <artifactId>mybatis</artifactId>
      <version>3.4.5</version>
    </dependency>

三、创建实体

package com.yule.user.entity;

/**
 * 用户实体
 * Created by yule on 2018/8/6 21:51.
 */
public class User {
    private String id;
    private String name;
    private String age;

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getAge() {
        return age;
    }

    public void setAge(String age) {
        this.age = age;
    }
}

四、创建映射器和 sql

  dao 接口

package com.yule.user.dao;

import com.yule.user.entity.User;

import java.util.List;

/**
 * 用户 Dao 层
 * Created by yule on 2018/8/6 22:06.
 */
public interface UserDao {
    List<User> queryUserList();
}

  sql

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//ibatis.apache.org//DTD Mapper 3.0//EN"
        "http://ibatis.apache.org/dtd/ibatis-3-mapper.dtd">
<mapper namespace="com.yule.user.dao.UserDao">

    <select id="queryUserList" resultType="com.yule.user.entity.User" >
        select t.id, t.name, t.age from t.user t
    </select>

</mapper>

五、配置 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>

    <!--配置环境-->
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="oracle.jdbc.OracleDriver"/>
                <property name="url" value="jdbc:oracle:thin:@localhost:1521:ORCL"/>
                <property name="username" value="testdev"/>
                <property name="password" value="test1234"/>
            </dataSource>
        </environment>
    </environments>

    <!-- 引入映射器 -->
    <mappers>
        <!--<mapper class="com.yule.user.dao.UserDao"/>-->
        <mapper resource="com/yule/user/dao/UserDao.xml"/>
    </mappers>

</configuration>

六、写个单测来看看

package com.yule.user.dao;

import com.yule.user.entity.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;

import static org.junit.Assert.*;

public class UserDaoTest {

    private static SqlSessionFactory sqlSessionFactory;

    @Test
    public void test() throws IOException {

        SqlSessionFactory sqlSessionFactory = getSqlSessionFactory();

        SqlSession sqlSession = sqlSessionFactory.openSession();

        UserDao userDao = sqlSession.getMapper(UserDao.class);
        List<User> userList = userDao.queryUserList();

        for (User user : userList) {
            System.out.println(user.getName());
        }

        sqlSession.close();
    }

    private static SqlSessionFactory getSqlSessionFactory() {
        //单例
        if (sqlSessionFactory == null) {
            InputStream inputStream;
            try {
                inputStream = Resources.getResourceAsStream("configuration.xml");
                sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
            } catch (IOException e) {
                e.printStackTrace();
                throw new RuntimeException(e.getCause());
            }
        }
        return sqlSessionFactory;
    }

}

七、运行结果

  

八、错误1:pom 中需要加如下代码

  运行单测报错

D:Javajdk1.8.0_144injava -ea -Didea.test.cyclic.buffer.size=1048576 "-javaagent:D:Program FilesJetBrainsIntelliJ IDEA 2017.1.5libidea_rt.jar=51056:D:Program FilesJetBrainsIntelliJ IDEA 2017.1.5in" -Dfile.encoding=UTF-8 -classpath "D:Program FilesJetBrainsIntelliJ IDEA 2017.1.5libidea_rt.jar;D:Program FilesJetBrainsIntelliJ IDEA 2017.1.5pluginsjunitlibjunit-rt.jar;D:Javajdk1.8.0_144jrelibcharsets.jar;D:Javajdk1.8.0_144jrelibdeploy.jar;D:Javajdk1.8.0_144jrelibextaccess-bridge-64.jar;D:Javajdk1.8.0_144jrelibextcldrdata.jar;D:Javajdk1.8.0_144jrelibextdnsns.jar;D:Javajdk1.8.0_144jrelibextjaccess.jar;D:Javajdk1.8.0_144jrelibextjfxrt.jar;D:Javajdk1.8.0_144jrelibextlocaledata.jar;D:Javajdk1.8.0_144jrelibext
ashorn.jar;D:Javajdk1.8.0_144jrelibextsunec.jar;D:Javajdk1.8.0_144jrelibextsunjce_provider.jar;D:Javajdk1.8.0_144jrelibextsunmscapi.jar;D:Javajdk1.8.0_144jrelibextsunpkcs11.jar;D:Javajdk1.8.0_144jrelibextzipfs.jar;D:Javajdk1.8.0_144jrelibjavaws.jar;D:Javajdk1.8.0_144jrelibjce.jar;D:Javajdk1.8.0_144jrelibjfr.jar;D:Javajdk1.8.0_144jrelibjfxswt.jar;D:Javajdk1.8.0_144jrelibjsse.jar;D:Javajdk1.8.0_144jrelibmanagement-agent.jar;D:Javajdk1.8.0_144jrelibplugin.jar;D:Javajdk1.8.0_144jrelib
esources.jar;D:Javajdk1.8.0_144jrelib
t.jar;F:IDEAworkspacesdemo	arget	est-classes;F:IDEAworkspacesdemo	argetclasses;F:mavenRepositoryjunitjunit4.12junit-4.12.jar;F:mavenRepositoryorghamcresthamcrest-core1.3hamcrest-core-1.3.jar;F:mavenRepositoryorgspringframeworkspring-test4.3.14.RELEASEspring-test-4.3.14.RELEASE.jar;F:mavenRepositoryorgspringframeworkspring-context4.3.14.RELEASEspring-context-4.3.14.RELEASE.jar;F:mavenRepositoryorgspringframeworkspring-aop4.3.14.RELEASEspring-aop-4.3.14.RELEASE.jar;F:mavenRepositoryorgspringframeworkspring-expression4.3.14.RELEASEspring-expression-4.3.14.RELEASE.jar;F:mavenRepositoryorgspringframeworkspring-beans4.3.14.RELEASEspring-beans-4.3.14.RELEASE.jar;F:mavenRepositoryorgspringframeworkspring-core4.3.14.RELEASEspring-core-4.3.14.RELEASE.jar;F:mavenRepositorycommons-loggingcommons-logging1.2commons-logging-1.2.jar;F:mavenRepositoryorgspringframeworkspring-web4.3.14.RELEASEspring-web-4.3.14.RELEASE.jar;F:mavenRepositoryorgspringframeworkspring-webmvc4.3.14.RELEASEspring-webmvc-4.3.14.RELEASE.jar;F:mavenRepositoryorgspringframeworkspring-jdbc4.3.14.RELEASEspring-jdbc-4.3.14.RELEASE.jar;F:mavenRepositoryorgspringframeworkspring-tx4.3.14.RELEASEspring-tx-4.3.14.RELEASE.jar;F:mavenRepositoryjavaxservletjavax.servlet-api3.1.0javax.servlet-api-3.1.0.jar;F:mavenRepositoryjavaxservletjspjsp-api2.2jsp-api-2.2.jar;F:mavenRepositoryjavaxservletjstl1.2jstl-1.2.jar;F:mavenRepositorycommons-fileuploadcommons-fileupload1.2.1commons-fileupload-1.2.1.jar;F:mavenRepositorycommons-iocommons-io2.4commons-io-2.4.jar;F:mavenRepositoryorgslf4jslf4j-api1.7.25slf4j-api-1.7.25.jar;F:mavenRepositoryorgslf4jslf4j-log4j121.7.25slf4j-log4j12-1.7.25.jar;F:mavenRepositorylog4jlog4j1.2.17log4j-1.2.17.jar;F:mavenRepositorychqoslogbacklogback-classic1.2.3logback-classic-1.2.3.jar;F:mavenRepositorychqoslogbacklogback-core1.2.3logback-core-1.2.3.jar;F:mavenRepositoryorgmybatismybatis3.4.5mybatis-3.4.5.jar;F:mavenRepositorycomoracleojdbc611.2.0.1.0ojdbc6-11.2.0.1.0.jar" com.intellij.rt.execution.junit.JUnitStarter -ideVersion5 com.yule.user.dao.UserDaoTest,test
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/F:/mavenRepository/org/slf4j/slf4j-log4j12/1.7.25/slf4j-log4j12-1.7.25.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/F:/mavenRepository/ch/qos/logback/logback-classic/1.2.3/logback-classic-1.2.3.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
SLF4J: Actual binding is of type [org.slf4j.impl.Log4jLoggerFactory]
log4j:WARN No appenders could be found for logger (org.apache.ibatis.logging.LogFactory).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.

org.apache.ibatis.exceptions.PersistenceException: 
### Error building SqlSession.
### The error may exist in com/yule/user/dao/UserDao.xml
### Cause: org.apache.ibatis.builder.BuilderException: Error parsing SQL Mapper Configuration. Cause: java.io.IOException: Could not find resource com/yule/user/dao/UserDao.xml

    at org.apache.ibatis.exceptions.ExceptionFactory.wrapException(ExceptionFactory.java:30)
    at org.apache.ibatis.session.SqlSessionFactoryBuilder.build(SqlSessionFactoryBuilder.java:80)
    at org.apache.ibatis.session.SqlSessionFactoryBuilder.build(SqlSessionFactoryBuilder.java:64)
    at com.yule.user.dao.UserDaoTest.getSqlSessionFactory(UserDaoTest.java:42)
    at com.yule.user.dao.UserDaoTest.test(UserDaoTest.java:23)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
    at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
    at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
    at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
    at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
    at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:68)
    at com.intellij.rt.execution.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:51)
    at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:242)
    at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:70)
Caused by: org.apache.ibatis.builder.BuilderException: Error parsing SQL Mapper Configuration. Cause: java.io.IOException: Could not find resource com/yule/user/dao/UserDao.xml
    at org.apache.ibatis.builder.xml.XMLConfigBuilder.parseConfiguration(XMLConfigBuilder.java:121)
    at org.apache.ibatis.builder.xml.XMLConfigBuilder.parse(XMLConfigBuilder.java:99)
    at org.apache.ibatis.session.SqlSessionFactoryBuilder.build(SqlSessionFactoryBuilder.java:78)
    ... 25 more
Caused by: java.io.IOException: Could not find resource com/yule/user/dao/UserDao.xml
    at org.apache.ibatis.io.Resources.getResourceAsStream(Resources.java:114)
    at org.apache.ibatis.io.Resources.getResourceAsStream(Resources.java:100)
    at org.apache.ibatis.builder.xml.XMLConfigBuilder.mapperElement(XMLConfigBuilder.java:371)
    at org.apache.ibatis.builder.xml.XMLConfigBuilder.parseConfiguration(XMLConfigBuilder.java:119)
    ... 27 more


Process finished with exit code -1

  解决方案:为了编译之后,能读取到 xml 文件,所以在 pom.xml 中 <build></build>加如下代码。

<resources>
      <resource>
        <directory>src/main/java</directory>
        <includes>
          <include>**/*.xml</include>
        </includes>
        <filtering>true</filtering>
      </resource>
    </resources>

九、错误2:添加 pom 的 oracle 依赖

  运行单测报错:报找不到驱动;java.lang.ClassNotFoundException: oracle.jdbc.driver.OracleDriver

  解决方案:https://www.cnblogs.com/yuxiaole/p/9479536.html

转载请注明出处: https://www.cnblogs.com/yuxiaole/p/9429807.html

  

原文地址:https://www.cnblogs.com/yuxiaole/p/9429807.html