第一个Mybatis程序
搭建环境
1、搭建数据库
create database mybatis;
use mybatis;
CREATE TABLE `user`(
id int(20) not null auto_increment,
`name` varchar(30) DEFAULT null,
`password` varchar(30) DEFAULT null,
PRIMARY key(id)
)ENGINE=INNODB DEFAULT CHARSET=utf8;
INSERT into `user` VALUES(1,'张三','123456'),(2,'李四','123123'),(3,'王五','123321'),(4,'崔瀚','654321');
2、新建maven项目
file->new other->maven project->next->勾上Create a simple project->next->填写Group Id和Artifact Id,选择打包方式(web项目用war包)->finish
在Navigator视图下文件夹目录如下:
Eclipse打开navigator视图的方法:window–>show view–>navigator
3、导入maven依赖
在pom.xml文件中增加依赖
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.study</groupId>
<artifactId>MybatisStudy</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>war</packaging>
<!-- 导入依赖 -->
<dependencies>
<!-- Mysql驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.17</version>
</dependency>
<!-- Mybatis -->
<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.5</version>
</dependency>
<!-- junit -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
</dependencies>
</project>
创建模块
1、编写mybatis核心文件
在src/main/resources下新建一个file,名字为mybatis.config.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.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mybatis?useUnicode=true&characterEncoding=utf8&useSSL=true&serverTimezone=UTC"/>
<property name="username" value="root"/>
<property name="password" value="admin"/>
</dataSource>
</environment>
</environments>
<!--每一个mapper.xml文件都要在config文件中注册 -->
<mappers>
<mapper resource="mapper/UserMapper.xml"/>
</mappers>
</configuration>
resource中的路径在后面说到。
2、编写mybatis工具类
在src/main/java文件夹下新建一个package,名字为utils
在utils包下新建一个类,名字为MybatisUtils
package utils;
import java.io.IOException;
import java.io.InputStream;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
/*
* 从config文件中构建SqlSessionFactory ---> 创建SqlSession
* SqlSession就相当于JDBC中的PreparedStatement,用来执行SQL语句的
* */
public class MybatisUtils {
private static SqlSessionFactory sqlSessionFactory;
static {
try {
//使用Mybatis第一步:获取SqlSessionFactory对象
String resource="mybatis-config.xml";//获取config文件
InputStream inputStream = Resources.getResourceAsStream(resource);//加载文件资源
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//使用Mybatis第二步:获取SqlSession对象,执行SQL命令
//既然有了 SqlSessionFactory,顾名思义,我们可以从中获得 SqlSession 的实例。
//SqlSession 提供了在数据库执行 SQL 命令所需的所有方法
public static SqlSession getSqlSession() {
/*
SqlSession sqlSession=sqlSessionFactory.openSession();
return sqlSession;
*/
return sqlSessionFactory.openSession();
}
}
此时发现有错误,因为maven依赖没有导入,我们需要导入一下pom.xml中一开始配置的一些jar包。右击项目名->maven->update maven->选择update project configuration from pom.xml->ok
千万注意此时只能这一个框,不要选择另个两个,但是默认另外两个是勾上的,所以要手动去掉,因为选择这两个框后,很多target下的空文件直接被删除掉了,导致后面无法进行。
编写代码
1、编写实体类
实体类与数据库表相对应
在src/main/java下新建一个包pojo,该包下新建一个类User
package pojo;
public class User {
private int id;
private String name;
private String password;
public User() {}
public User(int id,String name,String password) {
this.setId(id);
this.setName(name);
this.setPassword(password);
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
@Override
public String toString() {
return "User{"+
"id="+id+
",name='"+name+'\''+
",password='"+password+'\''+
'}';
}
}
2、实现mapper层
实现dao层,由于Mybatis中使用的是Mapper命名,所以这次可以迎合Mybatis,新建一个mapper层,即为之前所说的dao层
mapper接口–>接口实现类(Dao接口 --> 接口实现类)
在src/main/java下新建一个mapper包,该包下新建一个接口UserMapper,该接口提供一个抽象方法
//接口
package mapper;
import java.util.List;
import pojo.User;
public interface UserDao {
List<User> getUserList();//接收数据库返回的数据
}
在mapper包下在新建一个file文件,名字为UserMapper.xml 。这个xml文件就想相当于是之前的实现类。并且这个UserMapper.xml必须在mybatis.config.xml文件中注册,否则会报错,所以在config文件中的resource中需要写上UserMapper.xml的路径。
<?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">
<!--namespace =绑定一个对应的Dao/Mapper接口 -->
<mapper namespace="mapper.UserMapper">
<!-- 查询语句 : id=接口中执行的方法, resultType=返回结果的类型-->
<select id="getUserList" resultType="pojo.User">
select * from mybatis.user;
</select>
</mapper>
注意:mapper文件中namespace和resultType要完整的名字,即带上报名,虽然UserMapper接口和UserMapper.xml文件在同一个包下,也必须要带上包名。
测试
junit工具类测试
在src/test/main/java下新建一个mapper包(dao包,随便写名字也可以,这里只是为了和上面对称),该包下新建一个测试类UserMapperTest
package mapper;
import java.util.List;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;
import dao.UserDao;
import pojo.User;
import utils.MybatisUtils;
public class UserDaoTest {
@Test
public void test() {
//第一步:获取SqlSession对象
SqlSession sqlSession=MybatisUtils.getSqlSession();
//执行SQL语句
//方式1:getMapper
UserMapper mapper=sqlSession.getMapper(UserMapper.class); //获取接口对象
List<User> userList=mapper.getUserList(); //执行接口中的抽象方法
//方式二:直接使用接口方法名
//List<User> userList=sqlSession.selectList("mapper.UserMapper.getUserList");
for(User user:userList) {
System.out.println(user);
}
//关闭SqlSession
sqlSession.close();
}
}
右键选择Run AS–>Junit test,如果前面配置均无错误的话,会显示如下结果:
此时在navigator视图下,整个文件目录如下:
在Package Explorer下,目录文件如下:可以看到有一个Maven Dependencies,这就是之前导入的maven依赖包
有时可能会存在以下错误
错误1:java.io.IOException: Could not find resource mybatis-config.xml
1、这是因为maven项目的过滤问题,maven项目默认的根目录是src,按照我上面的流程那么所有的xml文件都在src下,默认一定会寻找到的,但有时如果将xml新建了一个文目录存放,而不是放在src下就会找不动config文件,此时右击文件夹–>Build path–>选择为默认根目录即可。
2、或者是在pom.xml文件下添加如下代码:
<!-- 在pom.xml文件中配置resources,来防止资源导出失败问题 -->
<build>
<resources>
<resource>
<directory>src\main\resources</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>true</filtering>
</resource>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>true</filtering>
</resource>
</resources>
</build>
错误2:pom.xml文件显示红叉(web.xml is missing and is set to true)
从前面的整个项目文件图中也能看到pom.xml文件左下角有个红色的,这并不影响整个程序的运行,但是也可以解决。
出现错误的原因是因为:默认的是war包的项目打包方式,而war包是web项目,需要web.xml文件,但是整个项目文件中没有。解决办法:右击项目,选择Java EE Tools–>Generate development Descriptor Stub即可,系统会自动在src/main/webapp下添加WEB-INF/web.xml文件,此时错误消除
或者该项目中不需要web.xml文件,可以在pom.xml文件中添加以下配置:
<!-- 项目中不需要配置web.xml,则使用下面语句设置成false -->
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>2.6</version>
<configuration>
<failOnMissingWebXml>false</failOnMissingWebXml>
</configuration>
</plugin>
</plugins>
</build>
总结
target文件夹是项目运行的目标文件夹,所有的程序的class文件都应该在target存在,以及用到的xml文件等,都在target目录下时,运行才不会报错。