Mybatis全解-01-第一个Mybatis程序
什么是Mybatis
一款优秀的持久层框架,避免了JDBC底层繁杂的手动设置参数和获取结果集的过程。能够使用xml文件或注解形式来映射实体类和数据库内容。
Mybatis官方文档:
Github上地址:https://github.com/mybatis/mybatis-3
学习mybatis之前需要理解持久化的概念
什么是持久化
持久化就是将程序在持久状态和瞬时状态间转换的机制。就是把数据(内存中的对象)保存到可永久保存的存储设备之中(如磁盘)。
JDBC是一种持久化机制,文件IO也是持久化机制。
为什么需要持久化
首先就是价格,内存价格昂贵,其次就是内存中的数据断电即失,为了保证数据不丢失,需要对数据进行持久化。
持久化到持久层
用来完成持久化工作的代码块(也就是程序中的DAO层)。大多数情况下,数据持久化是通过各种关系数据库来实现。
之所以要独立出一个持久层的概念,而不是持久模块或者持久单元。真正意义上讲就是,在我们的程序架构中,应该用一个相对独立的逻辑层面,专注于数据持久层逻辑的实现,说白了就是用来操作数据库存在的。
为什么要用到Mybatis
Mybatis是一个半自动化的ORM框架(Object Relationship Mapping)即对象关系映射。Mybatis就是用来帮助我们操作数据库的,从数据库中取出数据,将数据存入数据库中。相比于传统的JDBC来操作数据库,Mybatis不用写那些过于繁杂与重复的代码,开发者只需要关注sql语句的实现。
优点:
1.简单小巧,没有任何第三方依赖,使用时只需要引入两个jar包。
2.使用灵活,不会对应用程序或者数据库的现有设计强加任何影响。Sql写在xml文件中有利于统一的管理与优化。
3.解除sql与程序代码之间的耦合,通过dao层将业务逻辑和数据访问逻辑的分离,使系统的设计更清晰,更易维护。
4.提供xml标签,支持编写动态sql。
第一个Mybatis程序
流程:搭建环境-导入Mybaits-编写代码-测试
1.搭建环境
CREATE DATABASE `mybatis`; USE `mybatis`; DROP TABLE IF EXISTS `user`; CREATE TABLE `user`( `id` INT(20) NOT NULL, `name` VARCHAR(30) DEFAULT NULL, `pwd` VARCHAR(30) DEFAULT NULL, PRIMARY KEY(`id`) )ENGINE=INNODB DEFAULT CHARSET=utf8; INSERT INTO `user`(`id`,`name`,`pwd`) VALUES (1,'李慧','123456'),(2,'小明','234567'),(3,'李华','456789');
2.导入Mybatis的jar包
<dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.5.2</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.47</version> </dependency>
3.编写Mybatis核心配置文件: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.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/mybatis?useSSL=true&useUnicode=true&characterEncoding=utf8"/> <property name="username" value="root"/> <property name="password" value="123456"/> </dataSource> </environment> </environments> <mappers> <mapper resource="com/li/dao/userMapper.xml"/> </mappers> </configuration>
4.编写Mybatis工具类
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 { // SqlSessionFactory工厂,生产连接数据库的SqlSession private static SqlSessionFactory sqlSessionFactory; static { try { // 通过流的方式读取数据库的连接信息 String resource = "mybatis-config.xml"; InputStream inputStream = Resources.getResourceAsStream(resource); // 通过SqlSessionFactoryBuilder建造者建造SqlSessionFactory工厂 sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); } catch (IOException e) { e.printStackTrace(); } } //获取SqlSession连接 public static SqlSession getSession(){ // SqlSessionFactory工厂生产SqlSession return sqlSessionFactory.openSession(); } }
5.创建实体类
public class User { private int id; //id private String name; //姓名 private String pwd; //密码 //构造,有参,无参 //set/get //toString() }
6.编写Mapper接口
import com.li.pojo.User; import java.util.List; public interface UserMapper { List<User> selectUser(); }
7.编写对应的Mapper.xml文件
注意:这里的namespace绑定的是接口
<?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.li.dao.UserMapper"> <select id="selectUser" resultType="com.li.pojo.User"> select * from user </select> </mapper>
8.编写测试类
public class MyTest { @Test public void selectUser() { // 调用之前写好的MybatisUtils工具类里的方法,获得session,用来连接数据库 SqlSession session = MybatisUtils.getSession(); // 利用反射,得到mapper,然后执行里面的sql UserMapper mapper = session.getMapper(UserMapper.class); List<User> users = mapper.selectUser(); for (User user: users){ System.out.println(user); } // 最后记得关闭资源 session.close(); } }
9.运行程序,查看测试结果。
10.如果报错,可能是出现了静态资源导出问题,读取不到你的文件。
解决方法,在pom文件中加入静态资源过滤代码。
<build> <resources> <resource> <directory>src/main/java</directory> <includes> <include>**/*.properties</include> <include>**/*.xml</include> </includes> <filtering>false</filtering> </resource> <resource> <directory>src/main/resources</directory> <includes> <include>**/*.properties</include> <include>**/*.xml</include> </includes> <filtering>false</filtering> </resource> </resources> </build>