前言 学完 JDBC 后,其实很多时候我们项目开发中不会直接使用 JDBC,而是会用到一些更好的第三方封装库,Mybatis 就是第三方库中使用人数最多,口碑最好的一个存在。为了快速上手,当然是盘它吖。
搭建 MySQL 数据库相关的表环境
1 -- 创建数据库 2 CREATE DATABASE IF NOT EXISTS `mybatis` CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; 3 4 -- 使用数据库 5 USE `mybatis`; 6 7 -- 创建users表 8 CREATE TABLE `users` ( 9 `id` int(20) unsigned NOT NULL AUTO_INCREMENT, 10 `name` varchar(64) NOT NULL, 11 `password` varchar(64) NOT NULL, 12 PRIMARY KEY (`id`) 13 ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; 14 15 -- 插入数据库 16 INSERT INTO `users` (`name`, `password`) VALUES ('鱼不浪', '666666'); 17 INSERT INTO `users` (`name`, `password`) VALUES ('鲁班', '666666'); 18 INSERT INTO `users` (`name`, `password`) VALUES ('西施', '666666'); 19 INSERT INTO `users` (`name`, `password`) VALUES ('麦特凯', '666666');
新建普通的 maven 项目为mybatis-study
,删除 src
目录,使他成为一个父项目
在父项目的 pom.xml
中放入以下依赖
1 <?xml version="1.0" encoding="UTF-8"?> 2 <project xmlns ="http://maven.apache.org/POM/4.0.0" 3 xmlns:xsi ="http://www.w3.org/2001/XMLSchema-instance" 4 xsi:schemaLocation ="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" > 5 <modelVersion > 4.0.0</modelVersion > 6 7 <groupId > org.example</groupId > 8 <artifactId > mybatis-study</artifactId > 9 <version > 1.0-SNAPSHOT</version > 10 11 12 <dependencies > 13 14 <dependency > 15 <groupId > mysql</groupId > 16 <artifactId > mysql-connector-java</artifactId > 17 <version > 5.1.48</version > 18 </dependency > 19 20 21 <dependency > 22 <groupId > org.mybatis</groupId > 23 <artifactId > mybatis</artifactId > 24 <version > 3.5.4</version > 25 </dependency > 26 27 28 <dependency > 29 <groupId > junit</groupId > 30 <artifactId > junit</artifactId > 31 <version > 4.13</version > 32 </dependency > 33 </dependencies > 34 </project >
创建名为 mybatis-01
的子项目,并进入src/main/resources
目录,创建一个mybatis-config.xml
的文件,并输入以下配置
1 <?xml version="1.0" encoding="UTF-8" ?> 2 <!DOCTYPE configuration 3 PUBLIC "-//mybatis.org//DTD Config 3.0//EN" 4 "http://mybatis.org/dtd/mybatis-3-config.dtd"> 5 6 <configuration > 7 8 <environments default ="development" > 9 <environment id ="development" > 10 11 <transactionManager type ="JDBC" /> 12 13 <dataSource type ="POOLED" > 14 <property name ="driver" value ="com.mysql.jdbc.Driver" /> 15 <property name ="url" 16 value ="jdbc:mysql://localhost:3306/mybatis?useSSL=true&useUnicode=true&characterEncoding=utf8&serverTimezone=Hongkong" /> 17 <property name ="username" value ="root" /> 18 <property name ="password" value ="" /> 19 </dataSource > 20 </environment > 21 </environments > 22 </configuration >
1 package com.yubulang.utils;2 3 import org.apache.ibatis.io.Resources;4 import org.apache.ibatis.session.SqlSession;5 import org.apache.ibatis.session.SqlSessionFactory;6 import org.apache.ibatis.session.SqlSessionFactoryBuilder;7 8 import java.io.IOException;9 import java.io.InputStream;10 11 12 public class MybatisUtils {13 14 private static SqlSessionFactory sqlSessionFactory; 15 16 static { 17 18 try { 19 20 String resource = "mybatis-config.xml" ; 21 InputStream in = Resources.getResourceAsStream(resource); 22 23 sqlSessionFactory = new SqlSessionFactoryBuilder().build(in); 24 } catch (IOException e) { 25 e.printStackTrace(); 26 } 27 } 28 29 30 31 32 33 34 public static SqlSession getSqlSession () { 35 return sqlSessionFactory.openSession(); 36 } 37 }
编写代码操作数据库
实体类:我们创建 com.yubulang.pojo.User.java
这个实体类
1 package com.yubulang.pojo;2 3 4 5 6 public class User {7 private int id; 8 private String name; 9 private String password; 10 11 public User () { 12 } 13 14 public User (int id, String name, String password) { 15 this .id = id; 16 this .name = name; 17 this .password = password; 18 } 19 20 public int getId () { 21 return id; 22 } 23 24 public void setId (int id) { 25 this .id = id; 26 } 27 28 public String getName () { 29 return name; 30 } 31 32 public void setName (String name) { 33 this .name = name; 34 } 35 36 public String getPassword () { 37 return password; 38 } 39 40 public void setPassword (String password) { 41 this .password = password; 42 } 43 44 @Override 45 public String toString () { 46 return "User{" + 47 "id=" + id + 48 ", name='" + name + '\'' + 49 ", password='" + password + '\'' + 50 '}' ; 51 } 52 }
Dao/Mapper 接口(其实可以理解成为 Dao 层)
1 package com.yubulang.dao;2 3 import com.yubulang.pojo.User;4 5 import java.util.List;6 7 public interface UserMapper {8 List<User> getUserList () ; 9 }
接口实现类,我们在 Mybatis
这里,由原来的UserDaoImpl.java
直接用xml
文件代替,com.yubulang.dao
包下创建UserMapper.xml
1 <?xml version="1.0" encoding="UTF-8" ?> 2 <!DOCTYPE mapper 3 PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" 4 "http://mybatis.org/dtd/mybatis-3-mapper.dtd" > 5 6 <!-- 绑定一个指定的Dao/Mapper接口 --> 7 <mapper namespace="com.yubulang.dao.UserMapper" > 8 <!-- 查询语句, id对应UserMapper接口中的方法名 --> 9 <!-- resultType 返回类型:要填写全类型名 --> 10 <select id="getUserList" resultType="com.yubulang.pojo.User" > 11 select * from users 12 </select> 13 </mapper>
测试上面的代码 我们使用junit
测试,在 maven 项目中 main
同级的有一个 test
文件夹,我们尽量让我们的测试文件,与我们的 main
包中的结构相同。
我们键入以下测试代码:
1 package com.yubulang.dao;2 3 import com.yubulang.pojo.User;4 import com.yubulang.utils.MybatisUtils;5 import org.apache.ibatis.session.SqlSession;6 import org.junit.Test;7 8 import java.util.List;9 10 public class UserMapperTest {11 @Test 12 public void test () { 13 14 SqlSession sqlSession = MybatisUtils.getSqlSession(); 15 16 17 18 UserMapper mapper = sqlSession.getMapper(UserMapper.class ) ; 19 List<User> userList = mapper.getUserList(); 20 for (User user : userList) { 21 System.out.println(user); 22 } 23 24 System.out.println("============================================" ); 25 26 27 List<User> userList2 = sqlSession.selectList("com.yubulang.dao.UserMapper.getUserList" ); 28 for (User user : userList2) { 29 System.out.println(user); 30 } 31 32 33 sqlSession.close(); 34 } 35 }
注意这里的报错信息:
1 org.apache.ibatis.binding.BindingException: Type interface com.yubulang.dao.UserMapper is not known to the MapperRegistry.
在这里我们会接触到一个新的概念就是MapperRegistry
。这是因为我们在当初配置mybatis-config.xml
的时候没有配置对应的<mappers>,我们将对应的 mapper 配置加入到mybatis-config.xml
中,然后启动测试test()
。
1 <?xml version="1.0" encoding="UTF-8" ?> 2 <!DOCTYPE configuration 3 PUBLIC "-//mybatis.org//DTD Config 3.0//EN" 4 "http://mybatis.org/dtd/mybatis-3-config.dtd"> 5 6 <configuration > 7 8 <environments default ="development" > 9 <environment id ="development" > 10 11 <transactionManager type ="JDBC" /> 12 13 <dataSource type ="POOLED" > 14 <property name ="driver" value ="com.mysql.jdbc.Driver" /> 15 <property name ="url" 16 value ="jdbc:mysql://localhost:3306/mybatis?useSSL=true&useUnicode=true&characterEncoding=utf8&serverTimezone=Hongkong" /> 17 <property name ="username" value ="root" /> 18 <property name ="password" value ="" /> 19 </dataSource > 20 </environment > 21 </environments > 22 23 24 <mappers > 25 <mapper resource ="com/yubulang/dao/UserMapper.xml" /> 26 </mappers > 27 </configuration >
启动运行,我们则发现我擦,报错了。说没有办法找到我们的Could not find resource com/yubulang/dao/UserMapper.xml
这个文件,这是因为 maven 的过滤机制导致的,我们可以修改pom.xml
配置,让他支持我们的 xml 文件可以被编译到我们的 class 中去。
1 <?xml version="1.0" encoding="UTF-8"?> 2 <project xmlns ="http://maven.apache.org/POM/4.0.0" 3 xmlns:xsi ="http://www.w3.org/2001/XMLSchema-instance" 4 xsi:schemaLocation ="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" > 5 <parent > 6 <artifactId > mybatis-study</artifactId > 7 <groupId > org.example</groupId > 8 <version > 1.0-SNAPSHOT</version > 9 </parent > 10 <modelVersion > 4.0.0</modelVersion > 11 12 <artifactId > mybatis-01</artifactId > 13 14 15 <build > 16 <resources > 17 <resource > 18 <directory > src/main/resources</directory > 19 <includes > 20 <include > **/*.properties</include > 21 <include > **/*.xml</include > 22 </includes > 23 <filtering > true</filtering > 24 </resource > 25 26 <resource > 27 <directory > src/main/java</directory > 28 <includes > 29 <include > **/*.properties</include > 30 <include > **/*.xml</include > 31 </includes > 32 <filtering > true</filtering > 33 </resource > 34 </resources > 35 </build > 36 </project >
再次点击运行测试,就能正常跑起来了。
总结 有了 Mybatis 后,我们的数据查询操作基本就在xml
实现,我们单独维护起来也更加方便。可以说提高了我们不少的生产力。当然这里只是入门的操作,我们更多的操作还要去实践应用。一定要多动手,不要怕出错!