学习笔记 Java Mybatis学习

学习笔记 Java Mybatis学习

前言

最近在学习javaweb,刚开始学习java与mysql之间的数据库操作,一开始学习的是jdbc,学过之后发现jdbc操作有些麻烦,处理简单的语句还可以,一旦如果工程量巨大,那么可能会十分麻烦。同时在把查询结果映射成对象这一操作上,需要执行单独的函数,今天学了Mybatis后,发现这次操作十分简单,甚至Mybatis默认就会帮我们完成这一操作。但是有利也有弊,学过之后感觉Mybatis的配置可能比较多,不过与其说多不如说是有序,有一个总的配置,之后mapper的配置。总体来讲Mybatis还是比较方便的。

Mybatis配置

Mybatis配置文件是XML的格式,内容中包括数据库连接信息,mapper等,实际可配置的项目有很多,但是主要有用的就这几种,如下示例中包含了一个mapper,对应的是一个查表的语句。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?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>
<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/study"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="com/test/mapper/testMapper.xml"/>
</mappers>
</configuration>

Mapper文件

这个文件里面规定了执行的sql语句,以及执行结果要映射的对象类型,Mybatis非常神奇,通过映射,直接把结果变成了对象,例如如下,示例是查Account表,然后把结果映射为Account类的对象。

Mapper.xml

1
2
3
4
5
6
7
8
9
<?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.test.mapper.TestMapper">
<select id="selectAccount" resultType="com.test.entity.Account">
select * from Accounts
</select>
</mapper>

com.test.entity.Account

这里要提到一个Lombok,下面的@Data注解就是利用小辣椒的注解,这样以来构造方法,getter,setter,toString都帮我们写好了,非常方便。

1
2
3
4
5
6
7
8
9
10
11
package com.test.entity;

import lombok.Data;

@Data
public class Account {
int id;
String account;
String password;

}

Mybatis 核心

有了上面两个之后,我们直接运行两行代码即可执行sql,首先一句代码的含义就是读取配置文件,连接Mysql数据库,从代码理解上大概意思为建立一个sql会话(SqlSession),第二句就是具体的执行Sql操作,如下:

1
2
FileInputStream fileInputStream = new FileInputStream("mybatis-config.xml");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(fileInputStream);

这两行代码类似于让Mybatis读取我们设立的配置文件,然后给我们一个sqlSessionFactory,有了这个之后,我们再得到session,即可在session上进行一系列sql的操作

1
2
3
4
try (SqlSession sqlSession = sqlSessionFactory.openSession(true)){
TestMapper mapper = sqlSession.getMapper(TestMapper.class);
mapper.selectAccount().forEach(System.out::println);
}

如上代码就是先规定openSession(true),意为实时执行sql操作,之后会返回一个sqlsession类型的对象,再直接使用sqlSession.getMapper(TestMapper.class)方法即可返回TestMapper接口的实现类,其中TestMapper的内容如下:

TestMapper.java

1
2
3
4
5
6
7
8
9
package com.test.mapper;

import com.test.entity.Account;

import java.util.List;

public interface TestMapper {
List<Account> selectAccount();
}

没错,Mybatis会帮我们动态实现一个接口的实现类,我们只需在接口中定义类型即可,这里注意上面的selectAccount(),这个selectAccount实际是和testMapper.xml中的 id 是对应的,不对应将会报错。同时上面testMapper.xml中namespace也写明了这个接口的地址com.test.mapper.TestMapper,因此是这个namespace让二者产生关联。

拓展

更方便一些,我们可以把Mybatis核心的代码都写到一个MybatisUtil类里面,当作工具类,之后我们可以在其他任何地方执行操作数据库,如下:

MybatisUtil.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
package com.test;

import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import java.io.FileInputStream;
import java.io.FileNotFoundException;

public class MybatisUtil {
private static SqlSessionFactory sqlSessionFactory;
static {
try {
sqlSessionFactory = new SqlSessionFactoryBuilder().build(new FileInputStream("mybatis-config.xml"));
} catch (FileNotFoundException e) {
throw new RuntimeException(e);
}
}
public static SqlSession getSession(boolean autocommit){
return sqlSessionFactory.openSession(autocommit);
}
}

示例在其他地方执行,可以写:

Main.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
package com.test;

import com.test.mapper.TestMapper;
import org.apache.ibatis.session.SqlSession;

public class Main {
public static void main(String[] args) {
try (SqlSession sqlSession = MybatisUtil.getSession(true)){
TestMapper mapper = sqlSession.getMapper(TestMapper.class);
mapper.selectAccount().forEach(System.out::println);

}
}
}

Mybatis是个非常有趣的东西,非常方便,虽然算不上简洁,但是非常清晰明了,把要执行的sql都放到mapper,把sql的配置都放到配置文件,代码则只需要专注执行,虽然之后还没深入学习,但是相信这些种种优点给了Mybatis挑战大型项目的可能性。加油!!!


学习笔记 Java Mybatis学习
https://www.xiaoan233.com/hello/study-java-Mybatis/
作者
Xiao_an
发布于
2025年1月25日
许可协议