Mybatis-01
一、mybatis准备及介绍
mybatis避免了几乎所有的jdbc代码和手动设置参数以及获取结果集代码。
1、如何获得mybatis
中文文档:https://mybatis.org/mybatis-3/zh/getting-started.html
github:https://github.com/mybatis/mybatis-3
maven仓库:
<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis --> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.5.5</version> </dependency>
2、持久化:数据持久化
持久化就是将程序的数据在持久状态和瞬时状态转化的过程
内存:断电即失
为什么需要持久化:有一些对象不能让他丢掉(比如账户余额...) 另一个原因就是内存太贵了,做持久化也能更好地节省内存。
3、持久层
Dao层 Service层 Controller层...等等都是层,每个层都有自己具体的业务
mybatis是一款优秀的持久层框架
框架 : 按照相应的步骤填写相应的东西,他就能帮你做原来要很多代码才能做的事情。
就好比一张白纸,你要填写简历,你要自己画出来框框再写,才能用。现在面试的公司直接给你一张已经画好表格的纸,你只需要直接填写好个人信息就能当作简历。
二、Mybatis程序
1、思路:搭建环境-->导入jar包(Mybatis jar包)-->编写代码-->测试代码
0.1、搭建环境 数据库
0.2、新建项目 新建一个普通的maven项目 删除src目录 就可以当作父工程
导入Maven依赖
<!--导入依赖--> <dependencies> <!--mysql驱动jar--> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.20</version> </dependency> <!--mybatis jar--> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.5.5</version> </dependency> <!--junit--> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>test</scope> </dependency> </dependencies> <!--在build中配置resources,来防止我们资源导出失败的问题--> <build> <resources> <resource> <directory>src/main/resources</directory> <includes> <include>**/*.properties</include> <include>**/*.xml</include> </includes> </resource> <resource> <directory>src/main/java</directory> <includes> <include>**/*.properties</include> <include>**/*.xml</include> </includes> <filtering>true</filtering> </resource> </resources> </build>
0.3、创建模块
这样做的好处就是子项目再也不用去导包,因为它父项目中已经导过包了
在创建好的模块中的resources创建配置文件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"> <!--核心配置文件--> <!--自己修改property中的value参数--> <configuration> <environments default="development"><!--环境--> <environment id="development"><!--具体环境--> <transactionManager type="JDBC"/><!--事务管理,默认用的是jdbc的--> <dataSource type="POOLED"> <property name="driver" value="com.mysql.cj.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:8080/mybatis?serverTimezone=UTC&userSSL=true&useUnicode=true&characterEncoding=UTF-8"/> <property name="username" value="root"/> <property name="password" value="123456"/> </dataSource> </environment> </environments> <mappers> <mapper resource="space/urbeautiful/dao/UserMapper.xml"/> </mappers> </configuration>
<!--写完得mapper记得在这里注册mapper才能使用 不然Java怎么知道你调用得mapper是谁 路径记得用/-->
<!--不配置就会报一个异常 org.apache.ibatis.binding.BindingException: Type interface space.urbeautiful.dao.UserDao is not known to the MapperRegistry.-->
0.4、编写mybatis工具类
//其实就做了两件事 把资源加载进来,并创建一个能执行sql的对象 //SqlSessionFactory 工厂模式 --->SqlSession public class MybatisUtils { private static SqlSessionFactory sqlSessionFactory;//提升作用域 方便下面方法调用 不然在trycatch中调用不到 static{ InputStream inputStream = null; try { //使用mybatis的第一步,获取SqlSessionFactory对象 //有了获取SqlSessionFactory对象,我们就可以从中获得SqlSession实例了 SqlSession完全包含了面向数据库执行sql命令所需的所有方法 String resource = "mybatis-config.xml"; inputStream = Resources.getResourceAsStream(resource); sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); } catch (IOException e) { e.printStackTrace(); }finally { try { if(inputStream!=null){ inputStream.close(); } } catch (IOException e) { e.printStackTrace(); } } } //static方便调用对象 public static SqlSession getSqlSession(){ return sqlSessionFactory.openSession();//.openSession之后拿到一个SqlSession对象 } }
2、编写代码
0.1、编写实体类 操作数据库那就要写实体类 一个表对应一个类
0.2、接口---->接口实现类 操作实体类的实现类
public interface UserDao { List<User> getUser(); }
<!--接口实现类 现在用.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"> <!--命名空间namespace=绑定一个对应Dao/Mapper接口 绑定之后就相当于是之前实现了这个接口--> <!-- id=“” 代表之前实现类中重写的方法名 resultType="" 代表实现类方法中的返回值类型 可以这样理解:和以前做的操作没有本质上的区别 以前是创建一个UserDao的实现类,现在我们是写一个标签 以前重写接口中的方法,现在id中设置重写的方法 以前是返回一个结果,现在在resultTtpe中设置返回值类型 以前写实现类的时候还要写一些connection prepareStatement resultSet等 现在mybatis都给简化了 现在的这个Mapper配置文件就相当于之前的实现类 --> <mapper namespace="space.urbeautiful.dao.UserDao"> <select id="getUser" resultType="space.urbeautiful.pojo.User"> select * from mybatis.user </select> </mapper>
0.3、测试代码
三、CRUD
查询的时候不需要提交,因为只是在数据库中查询,并不会对表结构造成影响。
但是增删改操作会对数据库中的表造成影响,所以必须提交事务,保持事务的特性。ACID
个人对sqlSession的理解:可以把sqlSession看作是Connection,也可以把sqlSession看成是PrepareStatement;因为提交事务是connection.commit() 执行sql是PrepareStatement对象。
sqlSession是执行sql的对象,sqlSession用于提交事务。所以看不明白时可以先把它看成是Connection + PrepareStatement结合体~