由Eclipse转用IDEA真是一把把的辛酸泪,两种编译器看似都是在java开发中中流砥柱的开发工具,但编程这东西失之毫厘差之千里啦,在开发过程中代码出bug不重要,但总是爆些不所云的bug而且与代码关系不大的bug就很气啦!
下面给大家讲一下我学习mybatis框架时出现一奇葩的异常
跟很多人一样,在刚接触IDEA时由于各种快捷键都不会,英文都看不懂,所以用的贼几把累,贼几把烦。但熟悉一些快捷键后觉得iDEA还不错,代码提示功能贼溜贼溜,编起程就是一路回车加换行。用回eclipse都有点不习惯啦。
越说越偏啦,书归正传,我们说回mybaits:
第一步:新建一个maven工程。如果是普通想学习学习mybatis的框架功能,建议一个空的maven工程项目就行啦,如果是web项目就
按下面的选择:在pom.xml中导入相应的jar包依赖
<dependencies>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.1.1</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.17</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
</dependencies><
- 配置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="mysql">
<environment id="mysql">
<transactionManager type="JDBC"></transactionManager>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mybatis"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="mapping/UserMapper.xml"/>
</mappers>
</configuration>
上面的environments中配置的是数据源,就是你jdbc连接数据的那些必要的配置。下面的mappers是mybatis映射的路径,接触过mybatis应该都知道,mybatis是通过映射xml文件中sql语句来执行相应数据库的操作,这就是mybatis与你项目连接点。
每一个pojo类对应数据库中的一个数据表,就有一个相应的映射文件。大致意思就是这样,如果想了解更多原理,可以在网上搜一些大神写的博客,我这就不多加赘述啦.
- 在项目里新建一个基本User
package pojo;
public class User {
private int id;
private String username;
private String password;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", username='" + username + '\'' +
", password='" + password + '\'' +
'}';
}
}
并为其
创建相应的配置文件
<?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="User">
<select id="getUser" resultType="pojo.User">
SELECT * FROM users;
</select>
</mapper>
- 创建一个测试类来进行测试
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;
public class UserTest {
@Test
public void find(){
try {
//加载mybatis的配置文件
InputStream inputStream = Resources.getResourceAsStream("mybatis.xml");
//通过sqlSession工厂创建者build出一个数据库会话工程
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//打开一个数据库会话
SqlSession session = sqlSessionFactory.openSession();
//将pojo映射文件中的id写入,即可找到相应的sql语句,执行语句并获取fanhuizhi
List<User> list = session.selectList("User.getUser");
//打印返回值信息
for (User user : list) {
System.out.println(user.toString());
}
//提交会话
session.commit();
//关闭会话
session.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
注意导的jar包最好不要导错,否则就得纠结啦!
万事大吉!回车OK?
当你沉溺于即将胜利的喜悦中时,那个天杀的bug就来啦!!!
惊不惊喜,意不意外?
我们来确认下项目结构,以免是我老眼昏花
事实证明600度的眼睛也不是盖的!
那是什么原因导致的异常呢?
说出来你可能不信,这其实就是我之前说得IDEA的锅:IDEA的Maven是不会编译src的java目录的xml文件,所以在Mybatis的配置文件中找不到xml文件!
其实也可以说是IDEA MAVEN的锅,因为如果
建立的是普通的java项目src下的xml文件也是可以读到的(本人亲测)
- BB 这么多能拿出解决办法来才是硬道理
解决办法就是在pom文件中新加一个build提示编译器那个蠢货,你的java
下面也是有配置文件的。
关键是怎么加?
两步走:
- 把原pom文件拿出来;
2.把下面这段代码复制到前面去
<build>
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.xml</include>
</includes>
</resource>
</resources>
</build>