Mybatis-入门演示
MyBatis:持久层框架
前言
之前有看过和学习一些mybatis的文章和内容,但是没有去写过文章记录下,现在借鉴b站的狂神视频和官方文档看来重新撸一遍入门。有错误请多指教。
内容
数据访问层-相当于之前web项目中dao层,数据库的交互,包括增删改查;
持久化就是将数据在持久状态和瞬时状态转化的过程。内存是断电即失。所以需要数据的持久化。
JDBC技术:Connection、PrepareStatement、ResultSet.
为什么要使用框架代替jdbc呢?
? 因为之前的jdbc的操作总是是重复单一的,在开发的时候要执行sql语句直接操作数据库,要经过加载驱动等操作,为了高效的开发,避免繁琐的操作,框架就诞生了。框架对jdbc进行封装,mybatis只需关注sql语句直接操作数据库,封装了操作的很多细节,这样可以将更多时间精力放在sql语句的编写上。
特点:灵活容易上手,用的多,封装jdbc;MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。
演示使用
现在演示mybatis的一个helloworld程序,看看是怎么样去使用。
pom.xml
整个项目的maven管理文件。
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.yhy.learn</groupId> <artifactId>mybatisDemo</artifactId> <packaging>pom</packaging> <version>1.0-SNAPSHOT</version> <modules> <module>mybatis-01</module> </modules> <dependencies> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.5.4</version> </dependency> <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.15</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> </dependency> </dependencies> <build> <resources> <resource> <directory>src/main/resources</directory> <includes> <include>**/*.xml</include> <include>**/*.properties</include> </includes> </resource> <resource> <directory>src/main/java</directory> <includes> <include>**/*.xml</include> <include>**/*.properties</include> </includes> </resource> </resources> </build> </project>
工具类
package com.yhy.utils; import org.apache.ibatis.io.Resources; import org.apache.ibatis.session.Configuration; 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; /** * @Author: yhy * @Date: 2020/5/12 * @Time: 11:45 * 工具类 * 获取sqlsession工厂 */ 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) { e.printStackTrace(); } } // 有了工厂就可以获得实例来使用,sqlsession就可以面向数据库操作jdbc public static SqlSession getSqlSession(){ return sqlSessionFactory.openSession(); } }
pojo的user类
映射数据库的user表
package com.yhy.pojo; /** * @Author: yhy * @Date: 2020/5/12 * @Time: 10:58 * 用户表的pojo层 */ public class User { private int id; private String name; private String pwd; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPwd() { return pwd; } public void setPwd(String pwd) { this.pwd = pwd; } }
dao层的UserDao接口
package com.yhy.dao; import com.yhy.pojo.User; import java.util.List; public interface UserDao { List<User> getUserList(); }
dao的接口实现xml
用这个文件代替了之前dao层中的接口实现类,之前的话需要编写jdbc的全部,查询编写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"> <!--namespace=绑定一个对应的Dao/Mapper接口 原本是写接口,但是现在不用怎么做--> <mapper namespace="com.yhy.dao.UserDao"> <!--select查询语句--> <select id="getUserList" resultType="com.yhy.pojo.User"> select * from mybatis.user </select> </mapper>
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> <typeAliases> <package name="com.yhy.pojo"/> </typeAliases> <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?characterEncoding=UTF-8"/> <property name="username" value="root"/> <property name="password" value="root"/> </dataSource> </environment> </environments> //作用域,删掉就是全局 //这里的配置可以是直接放在resource文件下,就直接写上xml名称就行,放在dao层的话就需要写全路径 <mappers> <mapper resource="com/yhy/dao/UserMapper.xml"/> </mappers> </configuration>
测试
package com.yhy.dao; import com.yhy.pojo.User; import com.yhy.utils.MybatisUtils; import org.apache.ibatis.session.SqlSession; import org.junit.Test; import java.util.List; /** * @Author: yhy * @Date: 2020/5/12 * @Time: 12:15 */ public class UserDaoTest { //借调工具类来使用测试 @Test public void test(){ SqlSession sqlSession = MybatisUtils.getSqlSession(); UserDao mapper = sqlSession.getMapper(UserDao.class); List<User> userList = mapper.getUserList(); for (User u: userList){ System.out.println(u); } sqlSession.close(); } }
先将结果贴在下面
演示两种mappers
作用效果
- 1.将
UserMapper.xml
放在dao层下,跟着userdao
配置就和我上面写的一样。最后效果如下,但是前提是你得在你项目的pom.xml
设置好有效的作用域,要不然就疯狂报错,说找不到这个UserMapper.xml
文件。pom.xml
需要配置如下,这里是配置能够得读取到src下的有效配置文件。
<build> <resources> <resource> <directory>src/main/resources</directory> <includes> <include>**/*.xml</include> <include>**/*.properties</include> </includes> </resource> <resource> <directory>src/main/java</directory> <includes> <include>**/*.xml</include> <include>**/*.properties</include> </includes> </resource> </resources> </build>
- 2.是直接将
UserMapper.xml
放在src下的resource文件下,和总的mybatis-config.xml
配置文件放置在一起。这样在mybatis-config.xml
里面就直接如下这样写文件名就行了。
<mapper resource="UserMapper.xml"/>
最后效果和第一种方法是一样的,都能够读取到数据。
- 个人觉得这两种方法来说,第一种可以对项目的整体设计管理更加方便一点,就像接口和实现类都是靠近的,方便进一步的审查和优化,第二种在做小的demo的时候是很方便的,但是一旦多个配置文件时候就可以有点难找。
记录错误
- maven创建项目一开始经常会有的错误,就是设定的jdk版本问题,一开始我都是手动去修改project的setting,比较麻烦。默认的版本一般是jdk1.4或者是jdk1.5,但大家往往不是这个版本,所以会报错不支持发行版本5什么的。
解决:现在记录下,永久得起配置好。到自己maven下载文件夹下找到配置文件,并在里面修改settings.xml
修改:如下,我的是jdk11。所以可以根据自己的版本来修改。
初步学习
测试代码
中的几个关键类,三者的关系都是从上到下生成。
SqlSessionFactoryBuilder
这个类可以被实例化、使用和丢弃,一旦创建了SqlSessionFactory
,就不再需要它了。
SqlSessionFactory
一旦被创建就应该在应用的运行期间一直存在,没有任何理由丢弃它或重新创建另一个实例,这样也是开发的规范。每个线程都应该有它自己的
SqlSession
实例。SqlSession
的实例不是线程安全的,因此是不能被共享的,所以它的最佳的作用域是请求或方法作用域,同时好的开发习惯,要在使用之后,将其关闭。