MyBatis
要多对官方文档进行学习
https://mybatis.org/mybatis-3/zh/index.html
简介
MyBatis
- 持久层框架 Dao Access Objects
- 定制化sql,存储过程,高级映射
- 避免了所有JDBC代码,设置参数,获取结果集,都不用自己手写
- 可以使用XML或注解,来配置和映射原生类型、接口和java的POJO为数据库记录
- POJO(Plain Old Java Objects ,普通老式Java对象)
- 原来叫iBatis
获得MyBatis
GitHub
Maven
持久化
持久化就是将程序的数据在 持久状态 和 瞬时状态 转化的过程
内存:断电即失
数据库(JDBC),IO文件持久化
- 之前的数据存储可能是直接通过IO存储在文本中,但是IO操作十分消耗资源,之后数据库诞生
内存太贵,所以数据要存在能持久存放的硬盘中
持久层
Dao层、service层、Controller层
完成持久化框架的代码块
层的界面十分明显
为什么需要MyBatis
方便
传统的jdbc太复杂,简化、框架、自动化
不用Mybatis也可以、只是更容易上手
优点:
-
简单、小巧、灵活、
-
解除SQL与程序的耦合
- sql和程序分开,直接去改sql就行
-
单元测试
- sql代码分离
-
提供映射标签
-
提供XML标签,支持动态sql
主要是使用的人多
Spring、SpringMVC、SpringBoot
第一个MyBatis程序
思路:
- 环境搭建
- 导入Mybatis
- 编写代码
- 制作工具类utils
- 制作JavaBean
- 制作mapper
- 测试
搭建环境
-
创建数据库
CREATE TABLE `mybatis`.`Untitled` ( `id` int(20) NOT NULL, `name` varchar(30) NULL, `pwd` varchar(30) NULL, PRIMARY KEY (`id`) ) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci;
设置engine引擎为InnoDB,和Character字符编码为utf8
-
创建简单的Maven项目,删除src
-
<dependencies> <!--Mybatis--> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.5.2</version> </dependency> <!--Mysql--> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.11</version> </dependency> <!--Junit--> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>test</scope> </dependency> </dependencies>
-
加入依赖文本
-
主要根据文档进行
-
https://mybatis.org/mybatis-3/zh/index.html
-
-
里面创建的子maven项目就不用频繁导包了
-
-
<parent> <artifactId>Mybatis_Study</artifactId> <groupId>com.haoyun</groupId> <version>1.0-SNAPSHOT</version> </parent>
-
子模块的xml是继承父包的
-
编写Mybatis配置文件
工厂模式为核心的,构造出实例
-
在resource文件下创建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?useSSL-true&useUnicode=true&characterEncoding=UTF-8"/> <property name="username" value="root"/> <property name="password" value="123456"/> </dataSource> </environment> </environments> <!--映射--> <mappers> <mapper resource="UserMapper.xml"/> </mappers> </configuration>
-
配置SSL安全连接,使用useUnicode编码,usecharacter字符编码utf8
创建实例SqlSession
-
官方给了一些代码,
-
String resource = "org/mybatis/example/mybatis-config.xml"; InputStream inputStream = Resources.getResourceAsStream(resource); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
-
把它封装为我们之前的工具类,utils,就是input配置文件,使用他的方法创建实例
-
/*通过工厂方法生产Sqlsession实例*/ public class MybatisUtils { private static final SqlSessionFactory sqlSessionFactory; static { /*获取sqlSessionFactory对象*/ String resource = "src\\main\\resources\\mybatis-config.xml"; InputStream inputStream = null; try { inputStream = Resources.getResourceAsStream(resource); } catch (IOException e) { e.printStackTrace(); } sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); } /*获取sqlSession实例*/ public static SqlSession getSqlSession() { return sqlSessionFactory.openSession(); } }
创建Bean
使用Lombok
这些方法就已经很够用了
NotNull还能自行判断空指针
自动创建十分方便
添加maven依赖文本就行
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.12</version>
<scope>provided</scope>
</dependency>
制作接口
Mapper
只要建立一个接口,不用实现,通过xml配置文件
语句可以通过XML定义也可以通过注解定义,Mybatis提供的所有特性都可以通过XML映射语言来实现
public interface UserDao {
List<User> getUserList();
}
之前编写Dao层,需要写一个实现这个接口的类,每个方法里有不同的对数据进行操作的jdbc语句,现在不用写实现类,通过编写配置文件,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">
<!--命名空间-->
<mapper namespace="com.haoyun.dao.UserDao">
<!--对应mapper的方法作为id,和返回类型,这里最好和接口中定义泛型一致-->
<select id="getUserList" resultType="com.haoyun.POJO.User">
select * from mybatis.user
</select>
</mapper>
整体结构
测试
编写规范,测试的是哪个位置的文件就写到哪,名字加个Test
public class UserDaoTest {
@Test
public void test(){
/*创建sqlSession实例*/
SqlSession sqlSession = MybatisUtils.getSqlSession();
/*第一种方法:执行sql,获取sql的对象,调用它定义的发方法*/
UserDao userDao = sqlSession.getMapper(UserDao.class);
List<User> userList = userDao.getUserList();
/*第二种发方法:*/
//List<User> userList = sqlSession.selectList("com.haoyun.dao.UserDao.getUserList");
for (User user : userList) {
System.out.println(user);
}
/*关闭*/
sqlSession.close();
}
}
介绍了两种方法,第二种方法认识一下就好
总结:
-
Builder只是用来创建SqlSessionFactory,读配置文件的,所以放到了static代码块中,只要加载一次就好
-
SqlSessionFactory,创建一次就一直存在,工厂模式,用来创建sqlsession实例,最简单的单例模式
-
sqlSession不是线程安全的
-
-
使用后要进行关闭,要求放到finally块中
-
所以测试的代码应该这样改
-
public class UserDaoTest { @Test public void test() { /*创建sqlSession实例*/ SqlSession sqlSession = MybatisUtils.getSqlSession(); try { /*第一种方法:执行sql,获取sql的对象,调用它定义的发方法*/ UserDao userDao = sqlSession.getMapper(UserDao.class); List<User> userList = userDao.getUserList(); /*第二种发方法:*/ //List<User> userList = sqlSession.selectList("com.haoyun.dao.UserDao.getUserList"); for (User user : userList) { System.out.println(user); } } catch (Exception e) { e.printStackTrace(); } finally { /*关闭*/ sqlSession.close(); } } }
-
Mybatis常见错误
Mapper
Dao层接口的方法需要通过创建对应Mapper完成SQL语句的操作,
<?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">
<mapper namespace="com.haoyun.dao.UserDao">
<select id="getUserList" resultType="com.haoyun.POJO.User">
select * from mybatis.user
</select>
</mapper>
这是对UserDao接口,制作的Mapper.xml,对getUserList方法执行这条sql语句,返回类型为User
这个mapper制作好后需要到mybatis-config.xml去注册mapper
<?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?useSSL-true&useUnicode=true&characterEncoding=UTF-8"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="com/haoyun/dao/UserMapper.xml"/>
</mappers>
</configuration>
选择resource的位置
解决了这个问题会出现第二个问题
Maven导出的问题,Maven是注重规定的,xml文件就要放在resource文件夹下,要不然无法导出
target文件夹下没有UserMapper.xml
就会报错
可能是这个文件出错
没有找到这个资源文件
查看target后发现的确没有
这时候有两种方法
- 添加Maven依赖文本,让maven支持其他文件夹也能导出xml文件
- 放到resource文件夹下,改好路径
Maven导出问题
-
添加依赖文本,搜索maven导出
-
https://www.cnblogs.com/yuqiliu/p/12059614.html
-
<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>
-
-
运行成功,第一条说这个url太老了,建议换新,这种方法也没什么人用了
-
-
放入resource文件夹下
-
更改mybatis-config.xml中的mapper路径
-
<property name="driver" value="com.mysql.cj.jdbc.Driver"/> <mappers> <mapper resource="UserMapper.xml"/> </mappers>
-
顺便把第一个问题解决
-
-
运行成功,所以最好把配置文件放在resource文件夹下
-