(二)Mybatis第一个程序

Mybaits的开发步骤

  1. 添加MyBatis的坐标
  2. 创建user数据表
  3. 编写User实体类
  4. 编写映射文件UserMapper.xml
  5. 编写核心文件SqlMapConfig.xml
  6. 编写测试类

流程:

  1. 搭建环境–>导入Mybatis—>编写代码—>测试

1.搭建实验数据库

CREATE DATABASE `mybatis`;

USE `mybatis`;

DROP TABLE IF EXISTS `user`;

CREATE TABLE `user` (
`id` int(20) NOT NULL,
`name` varchar(30) DEFAULT NULL,
`pwd` varchar(30) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

insert  into `user`(`id`,`name`,`pwd`) values (1,'张三','123456'),(2,'李四','abcdef'),(3,'王五','987654');

2.创建maven工程,导入MyBatis相关 jar 包

  1. 不使用骨架直接创建maven工程
    在这里插入图片描述

  2. 删除src目录,将此maven作为父工程使用在这里插入图片描述

  3. 在父工程中的pom.xml文件中导入Mybatis相关jar包
    在这里插入图片描述

3.创建maven子工程,编写Mybatis核心配置文件

  1. 在父工程的基础上创建一个 Module(模块)作为子maven工程,(不使用骨架)
  2. 在子工程是main\resources文件下,创建mybatis-config.xml核心配置文件
  3. 在mybatis-config.xml核心配置文件中配置以下标签。

注意:如果有父工程,父工程如果导入了jar包,子工程就不需要导入相同的jar包了
username是连接数据库的用户名
password是连接数据库的密码
mappers标签的作用:是注册实现接口类的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>
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://127.0.0.1:3306/mybatis?useUnicode=true&amp;
                characterEncoding=utf-8&amp;serverTimezone=UTC&amp;useSSL=false&amp;serverTimezone=Asia/Shanghai"/>
                <property name="username" value="root"/>
                <property name="password" value="123456"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <mapper resource="com/clearlast/dao/userMapper.xml"/>
    </mappers>
</configuration>

4.编写MyBatis工具类

  1. 在子工程main/java/文件下新建包为com.clearlast.utils
  2. 编写MyBatis工具类

代码分析:

  1. try中的三行代码是mybatis官方提供的用于制造执行sql语句的sqlSession对象的官方代码。
  2. 通过输入流将mybatis-config.xml配置文件以build构建的方式创建一个sqlSessionFactory(sqlSessionFactory工厂(工厂模式))
  3. 通过getSession方法体中的 sqlSessionFactory.openSession()来创建执行sql命令的SqlSession对象
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 MybatisUtils {

   private static SqlSessionFactory sqlSessionFactory;

   static {
       try {
           String resource = "mybatis-config.xml";
           InputStream inputStream = Resources.getResourceAsStream(resource);
           sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
      } catch (IOException e) {
           e.printStackTrace();
      }
  }

   //获取SqlSession连接
   public static SqlSession getSession(){
       return sqlSessionFactory.openSession();
  }

}

5.创建实体类

  1. 通过IDEA右侧的数据库连接工具,连接数据库

在这里插入图片描述

  1. 连接测试数据库,并确定保存

在这里插入图片描述

  1. 根据连接数据库中的表来创建实体类
    在main\java\com\clearlast\包下创建一个新的包叫做pojo,在pojo包下创建一个实体类User(该类是用于连接访问数据库数据的类)
    在这里插入图片描述

6.编写Mapper接口

在clearlast包下创建一个dao包,在dao包下创建一个UserMapper接口
在这里插入图片描述

7.编写Mapper.xml配置文件,(实现接口)

该配置文件就是实现UserMapper接口的文件(相当于JDBC中接口的实现类)

配置文件说明:

  1. namespace的值为UserMapper接口的全限定接口名路径(作用:实现哪个类)
    全限定路径就是带包路径的路径。
  2. select标签中的 id属性的值为UserMapper接口中的方法名(作用:重写方法)
  3. select标签中的 内容是SQL语句。
  4. select标签中的 resultType的值为全限定类名的实体类User路径。(返回类型)
<?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.clear_last.dao.UserMapper">
    <select id="selectUser" resultType="com.clear_last.pojo.User">
    select * from user
    </select>
</mapper>

8.注册实现接口类的Mapper.xml配置文件

  1. 假如不注册该文件,是无法实现UserMapper接口的
  2. 在mybatis-config.xml的核心配置文件中的mappers标签中修改resource的值为Mapper.xml配置文件的全限定路径。
    在这里插入图片描述

9.编写测试类

  1. Junit 包测试(为什么在pom.xml中导入junit包,就是为了测试代码)

  2. 在src\test\java包下,创建和main\java包下一样的包路径

  3. 在test\java\com\clearlast包下创建dao包
    在这里插入图片描述

  4. 在dao包下创建UserMapper接口的测试类,在测试类中输入以下代码

代码解释:

  1. 通过工具类Mybatis中的getSession方法获取执行sql语句的session对象
  2. 通过session对象调取getMapper方法传入UserMapper接口的Class类
  3. 通过调取的UserMapper接口中的Class类中实现的selectUser()方法,来得到一个List带有User对象返回值的集合。
  4. 通过遍历集合,来打印数据库中的数据。
  5. 关闭session对象的流,防止占用内存资源。
  6. 运行测试类后会报错,请看第十章节,消除报错异常。
public class UserMapperTest {
    @Test
    public void selectUser() {
        SqlSession session = MybatisUtils.getSession();
        //方法一:
        //List<User> users = session.selectList("com.kuang.mapper.UserMapper.selectUser");
        //方法二:
        UserMapper mapper = session.getMapper(UserMapper.class);
        List<User> users = mapper.selectUser();

        for (User user: users){
            System.out.println(user);
        }
        session.close();
    }
}

10.解决运行测试类的ExceptionInInitializerError异常

可能出现问题说明:Maven静态资源过滤问题
解决:

  1. 在父工程和子工程的pom.xml文件中添加如下标签
    <build>
        <resources>
            <resource>
                <directory>src/main/java</directory>
                <includes>
                    <include>**/*.properties</include>
                    <include>**/*.xml</include>
                </includes>
                <filtering>true</filtering>
            </resource>
            <resource>
                <directory>src/main/resources</directory>
                <includes>
                    <include>**/*.properties</include>
                    <include>**/*.xml</include>
                </includes>
                <filtering>true</filtering>
            </resource>
        </resources>
    </build>
  1. 假如添加完执行测试类还是不行,记得在pom.xml文件中修改完配置后,记得刷新maven。
    在这里插入图片描述

异常信息如下:

java.lang.ExceptionInInitializerError
	at com.clear_last.dao.UserMapperTest.selectUser(UserMapperTest.java:17)
	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.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:33)
	at com.intellij.rt.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:230)
	at com.intellij.rt.junit.JUnitStarter.main(JUnitStarter.java:58)
Caused by: org.apache.ibatis.exceptions.PersistenceException: 
### Error building SqlSession.
### The error may exist in com/clear_last/dao/userMapper.xml
### Cause: org.apache.ibatis.builder.BuilderException: Error parsing SQL Mapper Configuration. Cause: java.io.IOException: Could not find resource com/clear_last/dao/userMapper.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.clear_last.utils.MybatisUtils.<clinit>(MybatisUtils.java:22)
	... 23 more
Caused by: org.apache.ibatis.builder.BuilderException: Error parsing SQL Mapper Configuration. Cause: java.io.IOException: Could not find resource com/clear_last/dao/userMapper.xml
	at org.apache.ibatis.builder.xml.XMLConfigBuilder.parseConfiguration(XMLConfigBuilder.java:121)
	at org.apache.ibatis.builder.xml.XMLConfigBuilder.parse(XMLConfigBuilder.java:98)
	at org.apache.ibatis.session.SqlSessionFactoryBuilder.build(SqlSessionFactoryBuilder.java:78)
	... 25 more
Caused by: java.io.IOException: Could not find resource com/clear_last/dao/userMapper.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:372)
	at org.apache.ibatis.builder.xml.XMLConfigBuilder.parseConfiguration(XMLConfigBuilder.java:119)
	... 27 more


Process finished with exit code -1

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值