Mybaits的开发步骤
- 添加MyBatis的坐标
- 创建user数据表
- 编写User实体类
- 编写映射文件UserMapper.xml
- 编写核心文件SqlMapConfig.xml
- 编写测试类
流程:
- 搭建环境–>导入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 包
-
不使用骨架直接创建maven工程
-
删除src目录,将此maven作为父工程使用
-
在父工程中的pom.xml文件中导入Mybatis相关jar包
3.创建maven子工程,编写Mybatis核心配置文件
- 在父工程的基础上创建一个 Module(模块)作为子maven工程,(不使用骨架)
- 在子工程是main\resources文件下,创建mybatis-config.xml核心配置文件
- 在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&
characterEncoding=utf-8&serverTimezone=UTC&useSSL=false&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工具类
- 在子工程main/java/文件下新建包为com.clearlast.utils
- 编写MyBatis工具类
代码分析:
- try中的三行代码是mybatis官方提供的用于制造执行sql语句的sqlSession对象的官方代码。
- 通过输入流将mybatis-config.xml配置文件以build构建的方式创建一个sqlSessionFactory(sqlSessionFactory工厂(工厂模式))
- 通过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.创建实体类
- 通过IDEA右侧的数据库连接工具,连接数据库
- 连接测试数据库,并确定保存
- 根据连接数据库中的表来创建实体类
在main\java\com\clearlast\包下创建一个新的包叫做pojo,在pojo包下创建一个实体类User(该类是用于连接访问数据库数据的类)
6.编写Mapper接口
在clearlast包下创建一个dao包,在dao包下创建一个UserMapper接口
7.编写Mapper.xml配置文件,(实现接口)
该配置文件就是实现UserMapper接口的文件(相当于JDBC中接口的实现类)
配置文件说明:
- namespace的值为UserMapper接口的全限定接口名路径(作用:实现哪个类)
全限定路径就是带包路径的路径。 - select标签中的 id属性的值为UserMapper接口中的方法名(作用:重写方法)
- select标签中的 内容是SQL语句。
- 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配置文件
- 假如不注册该文件,是无法实现UserMapper接口的
- 在mybatis-config.xml的核心配置文件中的mappers标签中修改resource的值为Mapper.xml配置文件的全限定路径。
9.编写测试类
-
Junit 包测试(为什么在pom.xml中导入junit包,就是为了测试代码)
-
在src\test\java包下,创建和main\java包下一样的包路径
-
在test\java\com\clearlast包下创建dao包
-
在dao包下创建UserMapper接口的测试类,在测试类中输入以下代码
代码解释:
- 通过工具类Mybatis中的getSession方法获取执行sql语句的session对象
- 通过session对象调取getMapper方法传入UserMapper接口的Class类
- 通过调取的UserMapper接口中的Class类中实现的selectUser()方法,来得到一个List带有User对象返回值的集合。
- 通过遍历集合,来打印数据库中的数据。
- 关闭session对象的流,防止占用内存资源。
- 运行测试类后会报错,请看第十章节,消除报错异常。
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静态资源过滤问题
解决:
- 在父工程和子工程的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>
- 假如添加完执行测试类还是不行,记得在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