MyBatis Study Notes Day01
什么是MyBatis?
一款用于简化JDBC开发的持久层框架,作为数据对象的持久化引擎
标准的MVC开发模式就是SSM框架,而SSM就是由Spring、Spring MVC、MyBatis的整合
MyBatis官网:https://mybatis.org/mybatis-3/zh/index.html
百度百科: MyBatis本是apache的一个开源项目iBatis,2010年这个项目由apache software foundation迁移到了google code,并且改名为MyBatis。2013年11月迁移到Github。
MyBatis可以使用简单的XML或注解来配置和映射原生类型、接口和POJO为数据库中记录
MyBatis几乎避免了所有的JDBC代码和手动设置参数以及获取结果集
创建MyBatis程序
-
创建maven项目
-
导入Mybatis、MySQL驱动、junit依赖
<dependencies> <!-- MyBatis 依赖 --> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.5.5</version> </dependency> <!-- MySQL驱动 依赖 --> <dependency> <groupId>com.mysql</groupId> <artifactId>mysql-connector-j</artifactId> <version>8.0.31</version> </dependency> <!-- junit 单元测试 --> <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"
"https://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!-- 引入外部配置文件 -->
<properties resource="dbcp.properties"/>
<settings>
<!-- 配置日志实现 -->
<setting name="logImpl" value="STDOUT_LOGGING"/>
<!-- 开启驼峰命名映射 -->
<setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${driver}"/>
<property name="url" value="${dbcp.url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
</dataSource>
</environment>
<environment id="test">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mybatis?useSSL=true&useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</dataSource>
</environment>
</environments>
</configuration>
-
编写mybatis工具类(固定写法)
package com.yuqu.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 { // 使用mybatis第一步:获取sqlSessionFactory对象 String resource = "mybatis-config.xml"; InputStream inputStream = Resources.getResourceAsStream(resource); sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); } catch (IOException e) { throw new RuntimeException(e); } } // 获取sqlSession对象 public static SqlSession getSqlSession(){ return sqlSessionFactory.openSession(); } }
sqlSessionFactory顾名思义就是产生sqlSession的工厂,拥有sqlSessionFactory就可以获取sqlSession实例,sqlSession实例提供了在数据库执行SQL指令所需的所有方法
-
编写测试类–> 实体类、dao接口 实现类
// 根据sql编写User实体类 // sql: CREATE TABLE tb_user( id INT PRIMARY KEY , username VARCHAR(20), password VARCHAR(20), gender CHAR(1), addr VARCHAR(30) )ENGINE=INNODB; INSERT INTO tb_user VALUES(1,'张三','123','男','郑州'); INSERT INTO tb_user VALUES(2,'李四','234','女','苏州'); INSERT INTO tb_user VALUES(3,'王五','345','女','杭州'); // UserDao public interface UserDao { List<User> getUserList(); }
-
映射SQL语句(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"> <!-- nameSpace命名空间=绑定一个对应Dao/Mapper接口 --> <mapper namespace="com.yuqu.dao.UserDao"> <select id="getUserList" resultType="com.yuqu.pojo.User"> select * from testmybatis.tb_user; </select> </mapper>
与原来的JDBC相比,此处将UserDaoImpl转换为UserMapper.xml配置文件
-
测试
利用junit单元测试
异常:
org.apache.ibatis.binding.BindingException: Type interface com.yuqu.dao.UserDao is not known to the MapperRegistry
接口类型UserDao未在Mapper中心注册,所以我们每一个实体接口都需要在MyBatis-config.xml文件中注册,如下<!--每一个mapper都需要在MyBatis核心配置文件中注册!--> <mappers> <mapper resource="UserMapper.xml"/> </mappers>
注意所有的配置文件尽量按照标准放在resources目录下,如果放在其他包下则可能会出现资源导出失败问题,也就是程序编译之后会无法找到该资源,但也可以通过maven配置build来防止资源导出失败
<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>
测试代码:
public class UserTest {
@Test
public void test(){
// 获取sqlSession
SqlSession sqlSession = MyBatisUtils.getSqlSession();
// 方式一:执行sql
UserDao mapper = sqlSession.getMapper(UserDao.class);
List<User> list = mapper.getUserList();
for (User user : list) {
System.out.println(user);
}
// 关闭sqlSession
sqlSession.close();
}
}