Mybatis使用教程(含源代码)
Mybatis
一、优势介绍
1、可复用程度高
2、操作简单
3、半自动化JDBC
二、mybatis配置(idea)
1、首先打开idea,新建一个maven项目(默认的,不要选择任何框架)
2、打开pom.xml配置相对应的jar包
3、导入相对于的jar包,为了方便我现在把需要的jar包的代码展示出来
<dependencies>
<!-- 测试junit-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.1</version>
<scope>test</scope>
</dependency>
<!-- 连接sql的jar包-->
<dependency>
<groupId>com.microsoft.sqlserver</groupId>
<artifactId>mssql-jdbc</artifactId>
<version>12.2.0.jre8</version>
</dependency>
<!-- 导入Mybatis-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.2</version>
</dependency>
<!-- 导入sql jar包-->
<dependency>
<groupId>com.microsoft.sqlserver</groupId>
<artifactId>sqljdbc4</artifactId>
<version>4.0</version>
</dependency>
<!--下面是jsf框架需要的jar包-->
<dependency>
<groupId>com.sun.faces</groupId>
<artifactId>jsf-api</artifactId>
<version>2.2.20</version>
</dependency>
<dependency>
<groupId>com.sun.faces</groupId>
<artifactId>jsf-impl</artifactId>
<version>2.2.20</version>
</dependency>
<dependency>
<groupId>javax.servlet.jsp.jstl</groupId>
<artifactId>jstl-api</artifactId>
<version>1.2</version>
</dependency>
<dependency>
<groupId>org.glassfish.web</groupId>
<artifactId>jstl-impl</artifactId>
<version>1.2</version>
</dependency>
</dependencies>
上面的代码粘贴在po.xml文件中的
4、下面开始建包,结构如下:
上图中的结构都是必须存在的。如果不存在就手动创建 切记:其中的java文件夹是蓝色的代表源文件夹,也就是代码存放的地方,resources是资源文件夹,test文件夹下的java是绿色的代表测试文件夹,如果和我的不一样,就选中文件夹鼠标右键->将目录标记为->源/资源/测试
5、创建实体类
在src目录下的User包下新建一个名为User.java的类,这个类里面就放我们的学生的各种信息属性,我这里展示的属性很多,大家可以自己改用自己的,代码如下:
package com.lu.User;
public class User {
private int id;
private String uname;
private String sex;
private String number;
private String sclass;
private String question;
private String answer;
private String answerteacher;
private String datetime;
public User(int id ,String sex, String uname, String number, String sclass, String question, String answer,String answerteacher, String datetime) {
this.id = id;
this.uname = uname;
this.sex = sex;
this.number = number;
this.sclass = sclass;
this.question = question;
this.answer = answer;
this.datetime = datetime;
this.answerteacher=answerteacher;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public String getNumber() {
return number;
}
public void setNumber(String number) {
this.number = number;
}
public String getUname() {
return uname;
}
public void setUname(String uname) {
this.uname = uname;
}
public String getSclass() {
return sclass;
}
public void setSclass(String sclass) {
this.sclass = sclass;
}
public String getQuestion() {
return question;
}
public void setQuestion(String question) {
this.question = question;
}
public String getAnswer() {
return answer;
}
public void setAnswer(String answer) {
this.answer = answer;
}
public String getDatetime() {
return datetime;
}
public void setDatetime(String datetime) {
this.datetime = datetime;
}
public String getAnswerteacher() {
return answerteacher;
}
public void setAnswerteacher(String answerteacher) {
this.answerteacher = answerteacher;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", uname='" + uname + '\'' +
", sex='" + sex + '\'' +
", number='" + number + '\'' +
", sclass='" + sclass + '\'' +
", question='" + question + '\'' +
", answer='" + answer + '\'' +
", answerteacher='" + answerteacher + '\'' +
", datetime='" + datetime + '\'' +
"测试"+
'}';
}
}
6、创建mybatis配制文件
在src目录下的resources文件夹下创建一个名为mybatis-config.xml的文件,这个文件里面存放你链接数据库的一些东西,比如驱动、url、登录名、密码之类的。因为mybatis官网上有示例代码,为了少走弯路我现在把写好的代码展示出来,只需要改几个地方我都会在途中标注:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"https://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<typeAliases>
<package name="com.lu.Dao" />
</typeAliases>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.microsoft.sqlserver.jdbc.SQLServerDriver"/>
<property name="url" value="jdbc:sqlserver://localhost\\MSSQLSERVER:1433;database=heart;integratedSecurity=true;encrypt=true;trustServerCertificate=true"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="com/lu/Mapper/UserMapper.xml"/>
</mappers>
</configuration>
上面的代码可以直接粘贴使用,下面我将标记需要更改的地方
其中url可以直接修改里面的一部分,把你要链接的数据库名称还有端口改为自己的都可以(一定不要把后面一大堆你不认识的删掉!!!如果删掉的话你会后悔的,后面我将会写为什么不能删除)
上面我们就完成了mybatis配置的第二步了。
7、配置mybatis的工具类
在工程树中的src目录下有一个叫"utils"的软件包,在这个软件包下面创建一个名为:”MybatisUtils.java“的类,这个类的主要功能就是读取我们的配制文件--'mybatis.xml'然后创建sqlSessionFactory,和执行sql的控制语句。这个类一旦写好之后只要你的’mybatis.xml‘不改名字,这个类就不要去修改它。下面我把代码展示出来:
package com.lu.utils;
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.xml";
// InputStream resource= Resources.getResourceAsStream("mybatis.xml");
InputStream inputStream = Resources.getResourceAsStream(resource);
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
} catch (IOException e) {
e.printStackTrace();
}
}
//执行sql语句
public static SqlSession getSqlSession(){
SqlSession sqlSession = sqlSessionFactory.openSession();
return sqlSession;
}
}
现在详细介绍一下这个类里面的东西。
-
sqlSessionFactory
这个东西咋说呢,你就理解为他是一个工厂,她负责生产的产品为sqlsession,这个产品呢就是你执行sql语句的钥匙,你必须有这个东西你才能执行sql语句
简单来说是这样的,如果想更深入的了解那就直接上官网:mybatis中文网查看
这个类里面的东西就这一个,还有一个方法”public static SqlSession getSqlSession(){}“这个类就是你获取钥匙的途径,在其他地方需要获取钥匙,你就记住先用SqlSession 创建一个对象叫sqlsession 这个对象的值为这个类MybatisUtils中的getSqlSession方法就行。例如:
SqlSession sqlsession = MybatisUtils.getSqlSession();
getSqlSession()这个方法里面有一个sqlSessionFactory.openSession();你就理解为要想拿到钥匙就必须去工厂里配一把,openSession()就是去配钥匙了。对于初学者暂且这样理解。
mybatis的工具类到这里就结束了。
8、写接口
很多人会有疑问,mybatis不是和JDBC不一样吗,为什么还要写接口呢?没错,写接口不假,但是方便是真的。我们现在src目录下的Dao包下新建一个名为 UserDao.java的接口。然后在接口中写一个方法,记住只需要写方法,不需要写方法体。当然这里面可以有多个方法。下面是代码展示:
package com.lu.Dao;
import com.lu.User.User;
import java.util.List;
public interface UserDao {
List<User> getUserList();
List<User> getusernumber(String number);
User getbyid(int id);
}
我在接口中写了三个方法,功能分别是 查询所有学生的信息 、查询学号为’xxxx‘的学生的所有信息(这里我数据库中学号允许重复所以用是集合类型,如果你的数据库中学号不允许重复,那就写这个代码:User getbynumber(String number);)、查询某个id的学生的所有信息。这就是接口中的所有内容,如果以后需要其他的查询方法直接写在接口中就好。
我们都知道接口中有方法,要想使用就必须重写接口中的方法,在以前的JDBC中我们都是写一个实现类来重写接口中的方法,那样不但麻烦而且还很容易出错,在mybatis中我们不需要写那么麻烦,我们只需要像写html一样用标签来写就好。下面将介绍怎么实现接口中的方法。
9、实现接口方法
我们在src目录下的Mapper包下新建一个名为 UserMapper.xml的文件,这个文件新建之后里面的内容使用我下面展示的就好:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.lu.Dao.UserDao">
<select id="getUserList" resultType="com.lu.User.User">
select * from heart
</select>
<select id="getusernumber" resultType="com.lu.User.User" parameterType="String">
select * from heart where number = #{number}
</select>
<select id="getbyid" resultType="com.lu.User.User" parameterType="int">
select * from heart where id =#{id}
</select>
</mapper>
上面的代码就是我们接口中三个方法的实现类。简单吧,现在我来解释一下其中有些你理解起来比较困难的东西
-
namespace
这个叫命名空间,这个就和jsf框架里的命名空间一样,但是又不一样,不一样在呢,不一样在他的值是我们接口存放的路径,他的意思就是把我们这个文件和接口关联起来。
-
id
这个东西的值就是我们在接口中写的方法名,这就是把这个标签和接口中的方法连接起来,意思就是说,这个标签对接口说:”你听好了我要重写你的某个方法了“
-
resultType
这个东西是返回值类型,有的人看到这里就不懂了,类型不应该是String int double List之类的吗?为什么我这里是一个类似于路径的东西呢?还记得吗我们创建的实体类User.java。我让id等于我实体类的路径是不是就是我要你返回的类型是按照我实体类中toString()方法的输出格式给我返回数据呢?答案觉都是!!这里一定要看懂。
-
parameterType
这个东西叫参数类型,嘛是参数类型呢,这里可不能随便写,这里面的类型要和我们在接口中的方法的形参表中的参数类型要一致,一定要仔细,要不然程序出错你都不知道哪里错了。
-
{}
这个东西叫占位符,嘛玩意呢?就是你先给我占个位子我稍后就到,为什么要这么写呢,这是为了防止我们把信息暴漏,这也是为了安全着想。
以上就是你觉得难懂的地方,但是要注意!!这个文件中可不止’select‘一种标签,这个标签只是查询标签,还有很多其他的标签,比如删除、更新之类的。我们的sql语句就可以直接写在标签体里面了。
10、测试
我这里用的测试工具是junit,这可不是让你下载啥软件,这个junit就是我们导入的jar包啊!!!我们测试的目标类就是我们的接口。因为我们要使用接口中的方法,所以要测试接口,在以后使用的时候要使用接口中的方法你就直接拿接口创建对象,然后调用方法就ok了,下面看我怎么测试
我们在那个test文件夹下的(绿色)java文件夹下创建和UserDao一样的包的路径,然后在Dao包下创建一个名为UserDaoTest.java的类:代码如下:
package com.lu.Dao;
import com.lu.User.User;
import com.lu.utils.MybatisUtils;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;
import java.util.List;
public class UserDaoTest {
@Test
public void test(){
SqlSession sqlSession= MybatisUtils.getSqlSession();
UserDao userDao =sqlSession.getMapper(UserDao.class) ;
List<User> userList = userDao.getUserList();
for (User user : userList) {
System.out.println(user);
}
sqlSession.close();
}
@Test
public void getnumber(){
SqlSession sqlSession = MybatisUtils.getSqlSession();
UserDao usernumber = sqlSession.getMapper(UserDao.class);
List<User> getusernumber = usernumber.getusernumber("202117104014");
for (User user: getusernumber) {
System.out.println(user);
}
sqlSession.close();
}
@Test
public void getbyid(){
SqlSession sqlSession = MybatisUtils.getSqlSession();
UserDao userid = sqlSession.getMapper(UserDao.class);
User user = userid.getbyid(2);
System.out.println(user.getQuestion());
sqlSession.close();
}
}
上面这个类里面测试了三个方法,也就是测试了我在接口中写的三个方法,我们拿第一个来说:
创建好这个类之后写一个方法 public void test(){},在这个方法的前面写一个 ’@Test‘ 这个东西就代表测试(这个东西叫注解,详情请了解junit的注解),然后我们在写好的方法中开始写测试代码,首先第一句:
SqlSession sqlSession= MybatisUtils.getSqlSession();
这句的意思就是用SqlSession 创建了一个sqlsession对象,这个对象的值就是我们mybatis工具类(在src目录下utils包下)里面的getSqlSession()方法。
你既然需要一个sqlsession,那我就给你好了(getSqlSession())
下面就要开始调用方法了,我们用接口创建一个对象,对象的值就是sqlSession中的getMapper(这里是你接口的名字+'.class')。
然后用User这个实体类创建一个对象然后让他的值等于上面接口创建的对象的方法,这里的方法就是你要测试的方法,比如
List<User> userList = userDao.getUserList();
写好之后然后我们就开始运行测试,在工程树中鼠标右键我们创建的测试类,然后点击运行所有测试
如果运行成功那么就会在控制台中出现一个绿色的条,并且输出结果
如果测试失败那么就会在控制台中出现一个红色的条,并且输出错误原因
如图:
当然许多看到这里并且成功写下代码并且运行测试的人都会报错!!!哈哈哈哈哈哈,让你们先失败然后再成功,毕竟写代码哪有一帆风顺的,下面我将会说一些出错的原因和解决办法
三、解决方案
1、找不到资源文件
错误代码:
Caused by: org.apache.ibatis.exceptions.PersistenceException:
### Error building SqlSession.
### The error may exist in com/lu/Mapper/UserMapper.xml
### Cause: org.apache.ibatis.builder.BuilderException: Error parsing SQL Mapper Configuration. Cause: java.io.IOException: Could not find resource com/lu/Mapper/UserMapper.xml
这是为什么呢?英语好的都能看出来这是因为没有找到UserMapper.xml文件,也就是我们重写方法的那个xml文件,这是为啥呢?
首先配置UserMapper.xml的地方有两个
-
mybatis-config.xml
这个文件里我们会写一个mapper标签,这个标签用来指明UserMapper.xml的路径
<mappers> <mapper resource="com/lu/Mapper/UserMapper.xml"/> </mappers>
-
pom.xml
在我们的maven项目中pom.xml的重要性不言而喻,是不能缺少的。另外讲个冷知识:为什么要写pom.xml文件? answer:因为在maven中约定大于配置,什么意思呢就是在我们的pom.xml文件中的配置远远大于你使用的工具的配置。
还记得我们的UserMapper.java的文件在哪里存放吗?在错误信息中他说找不到资源,也就是找不到UserMapper.java是不是也就是说UserMapper.java文件就是一个资源文件呢,如果能理解到这里那就简单了,在maven中我们要把所有的资源文件放在标记为资源文件夹中,而我们的路径却在src目录下的Mapper包下,这个包又不能标记为资源包,这怎么办呢?解决方法就在我们的pom.xml文件中,我们需要加一段代码到pom.xml文件的
标签中,这段代码叫资源过滤器,代码如下: <!-- 资源过滤器--> <build> <resources> <resource> <directory>src/main/resources</directory> <includes> <include>**/*.properties</include> <include>**/*.xml</include> </includes> <filtering>false</filtering> </resource> <resource> <directory>src/main/java</directory> <includes> <include>**/*.properties</include> <include>**/*.xml</include> </includes> <filtering>false</filtering> </resource> </resources> </build>
加上代码之后,刷新maven,刷新方法:点击右侧的侧边栏的mavern,然后有个刷新,这就是刷新maven加载依赖。
2、加载驱动失败
如图:
错误代码:
Error querying database. Cause: com.microsoft.sqlserver.jdbc.SQLServerException: 没有为集成身份验证配置驱动程序。 ClientConnectionId:96e2ff0e-f23c-44fc-b853-5a945b489b94
### The error may exist in com/lu/Mapper/UserMapper.xml
### The error may involve com.lu.Dao.UserDao.getUserList
### The error occurred while executing a query
### Cause: com.microsoft.sqlserver.jdbc.SQLServerException: 没有为集成身份验证配置驱动程序。 ClientConnectionId:96e2ff0e-f23c-44fc-b853-5a945b489b94
如果你遇到这个错误,不要慌先去pom.xml文件中检查你的sql的jar包是不是对应你的jdk版本,如果对应,那就刷新maven再测试一次,如果还是测试失败,那麻烦你解决掉这个问题之后回复我一下,教教我,目前我这个错误也还没有解决!
3、sqlSession空指针问题
如图:
遇到这个问题我只能说你小子不老实,我都帮你探过路了你还往坑里跳,首先这是sqlsession空指针问题,这个问题出在我们的工具类中,也即是src问价夹下的utils包下的Mybatis.java文件,在这里面有一句代码是:
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
其实在这里肯定在这句代码前面加了一个SqlSession,把他改为:
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
改为这样就好了,下面我说一下这个文件
总结
mybatis使用起来就是比JDBC安全高效,省下了好多时间可以去写其他业务逻辑,JDBC有很多重复的代码,mybatis的好处就是代码可复用度高,且代码结构简单。
如果文中有错误,请各位大佬批评指正!!大家好我是努力的小陆!!!!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)