MyBatis
环境:
-
JDK 1.8
-
Mysql 5.7
-
maven 3.6.1
-
IDEA
回顾:
-
JDBC
-
Mysql
-
Java基础
-
Maven
-
Junit
框架:配置文件的。最好的方式:看官网文档;
1.简介
1.1 什么是Mybatis
-
MyBatis 是一款优秀的持久层框架
-
它支持自定义 SQL、存储过程以及高级映射。
-
MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。
-
MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。
-
MyBatis本是apache的一个开源项目iBatis,2010年这个项目由apache software foundation迁移到了google code,并且改名为MyBatis。
-
2013年11月迁移到Github。
-
iBATIS一词来源于“internet”和“abatis”的组合,是一个基于Java的持久层框架。iBATIS提供的持久层框架包括SQL Maps和Data Access Objects(DAOs)。
如何获得Mybatis?
-
maven仓库:
<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis --> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.5.14</version> </dependency>
1.2 持久化
数据持久化
-
持久化就是将程序的数据在持久状态和瞬时状态转化的过程
-
内存:断电即失
-
数据库(jdbc),io文件持久化。
-
生活:冷藏,罐头。
为什么需要持久化?
-
有一些对象,不能让他丢掉。
-
内存太贵了
1.3 持久层
Dao层,Service层,Controller层...
-
完成持久化工作的代码块
-
层界限十分明显。
1.4 为什么需要Mybatis?
-
方便
-
帮助程序员将数据存入到数据库中。
-
传统的JDBC代码太复杂了。简化,框架。自动化。
-
不要Mybatis也可以。更容易上手。
-
优点:
-
简单易学:本身就很小且简单。没有任何第三方依赖,最简单安装只要两个jar文件+配置几个sql映射文件。易于学习,易于使用。通过文档和源代码,可以比较完全的掌握它的设计思路和实现。
-
灵活:mybatis不会对应用程序或者数据库的现有设计强加任何影响。 sql写在xml里,便于统一管理和优化。通过sql语句可以满足操作数据库的所有需求。
-
解除sql与程序代码的耦合:通过提供DAO层,将业务逻辑和数据访问逻辑分离,使系统的设计更清晰,更易维护,更易单元测试。sql和代码的分离,提高了可维护性。
-
提供映射标签,支持对象与数据库的ORM字段关系映射。
-
提供对象关系映射标签,支持对象关系组建维护。
-
提供xml标签,支持编写动态sql。
-
最重要的一点:使用的人多!
Spring SpringMVC SpringBoot
2. 第一个Mybatis程序
思路:搭建环境-->导入Mybatis-->编写代码-->测试!
2.1 搭建环境
搭建数据库
CREATE DATABASE `mybatis`; use `mybatis`; CREATE TABLE `user`( `id` int(20) NOT null PRIMARY KEY, `name` VARCHAR(30) DEFAULT null, `pwd` VARCHAR(30) DEFAULT NULL )ENGINE=INNODB DEFAULT CHARSET=utf8; INSERT INTO `user` (`id`,`name`,`pwd`) VALUES (1,'小沈','123456'), (2,'张三','123456'), (3,'李四','123456')
新建项目
-
新建一个普通的maven项目
-
删除src目录
-
导入maven依赖
<!-- 导入依赖--> <dependencies> <!-- mysql驱动--> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.33</version> </dependency> <!-- mybatis--> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.5.13</version> </dependency> <!-- junit--> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.13.2</version> <scope>test</scope> </dependency> </dependencies>
2.2 创建一个模块
-
编写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 核心配置文件--> <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=UTF-8"/><!--& 是and符号的意思--> <property name="username" value="root"/> <property name="password" value="123456"/> </dataSource> </environment> </environments> </configuration>
-
编写mybatis的工具类
package com.xiaoshen.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; //sqlSessionFactory --> sqlSession public class MybatisUtils { private static SqlSessionFactory sqlSessionFactory; static { try { //使用Mybatis第一步:获取sqlSessionFactory对象 String resource = "mybatis-config.xml"; InputStream inputStream = Resources.getResourceAsStream(resource); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); }catch (IOException e){ e.printStackTrace(); } } //既然有了 SqlSessionFactory,顾名思义,我们可以从中获得 SqlSession 的实例。 // SqlSession 提供了在数据库执行 SQL 命令所需的所有方法。 public static SqlSession getSqlSession(){ SqlSession sqlSession = sqlSessionFactory.openSession(); return sqlSession; } }
2.3 编写代码
-
实体类
package com.xiaoshen.pojo; //实体类 public class User { private int id; private String name; private String pwd; public User() { } public User(int id, String name, String pwd) { this.id = id; this.name = name; this.pwd = 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; } @Override public String toString() { return "User{" + "id=" + id + ", name='" + name + '\'' + ", pwd='" + pwd + '\'' + '}'; } }
-
Dao接口
package com.xiaoshen.dao; import com.xiaoshen.pojo.User; import java.util.List; public interface UserDao { List<User> getUserList(); }
-
接口实现类由原来的UserDaoImpl转变为一个Mapper配置文件
<?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.xiaoshen.dao.UserDao"> <!--select查询语句--> <select id="getUserList" resultType="com.xiaoshen.pojo.User"> select * from user </select> </mapper>
2.4 测试
注意点:
Error building SqlSession.The error may exist in com/xiaoshen/dao/UserMapper.xml
Cause: org.apache.ibatis.builder.BuilderException: Error parsing SQL Mapper Configuration.
Cause: java.io.IOException: Could not find resource com/xiaoshen/dao/UserMapper.xml
MapperRegitry是什么?
核心配置文件中注册mappers
<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>
-
junit测试
@Test public void test(){ //第一步:获得SqlSession对象 SqlSession sqlSession = MybatisUtils.getSqlSession(); //方式一:getMapper UserDao userDao = sqlSession.getMapper(UserDao.class); List<User> userList = userDao.getUserList(); for (User user : userList) { System.out.println(user); } //关闭sqlSession sqlSession.close(); }
可能会遇到的问题:
-
配置文件没有注册
-
绑定接口错误
-
方法名不对
-
返回类型不对
-
Maven导出资源问题
建立步骤:
-
maven配置文件(pom.xml)
-
写一个工具类(MybatisUtil.java)
-
Util:工具
-
里面是SqlSessionFactory,用来创建SqlSession会话。
-
-
mybatis的配置文件(mybatis-config.xml)
-
config:配置
-
里面是Mybatis的核心配置文件
-
-
写实体类(User.java)
-
pojo:简单普通的Java类
-
里面是数据库表的字段实体类
-
-
写接口(UserDao.java)(后面会改成UserMapper.java)
-
mapper:映射器-用来实现接口的
-
里面是定义的接口方法
-
-
然后是实现接口的(Usermapper.xml)配置文件
-
里面是实现接口里面方法的sql语句
-
-
最后在写test
@Test public void test2(){ //第一步:获取SqlSession对象 SqlSession sqlSession = MybatisUtils.getSqlSession(); try { //第二步:获取Mapper对象,当前的接口的class对象 UserMapper mapper = sqlSession.getMapper(UserMapper.class); //第三步:设置参数,实现里面的方法 User userById = mapper.getUserById(2); //第四步:打印查询结果 System.out.println(userById); }catch (Exception e){ e.printStackTrace(); }finally { sqlSession.close(); } } }
3.CRUD
1、C:Create(创建),当然数据库的表插入是insert,创建是Create
2、R: Retrieve(查询),就是select
3、U:Update(更新),就是Update
4、D:Delete(删除),就是Delete
1. namespace
namespace中的包名要和Dao/Mapper接口中的包名一致!
<mapper namespace="com.xiaoshen.dao.UserMapper">
2. select
选择,查询语句;
-
id:就是对应的namespace中的方法名
-
resultType:Sql语句执行的返回值!
-
parameterType:参数类型!
-
编写接口
//查询全部用户 List<User> getUserList(); //根据ID查询用户 User getUserById(int id);
-
编写对应的mapper中的sql语句
<!--select查询语句--> <select id="getUserList" resultType="com.xiaoshen.pojo.User"> select * from user </select> <!--根据id查询用户--> <select id="getUserById" parameterType="int" resultType="com.xiaoshen.pojo.User"> select * from user where id = #{id} </select>
-
测试
@Test public void test(){ //第一步:获得SqlSession对象 SqlSession sqlSession = MybatisUtils.getSqlSession(); //方式一:getMapper UserMapper userMapper = sqlSession.getMapper(UserMapper.class); List<User> userList = userMapper.getUserList(); //方式二: // List<User> userList = sqlSession.selectList("com.xiaoshen.dao.UserDao.getUserList"); for (User user : userList) { System.out.println(user); } //关闭sqlSession sqlSession.close(); }
3.insert
添加,查询语句
-
id:就是对应的namespace中的方法名
-
parameterType:参数类型!(参数是User就需要写User的全限定名)
什么叫做java类的全限定名?
所谓全限定名 = 包名 + 类型名
-
编写接口
//insert一个用户 int addUser(User user);
-
编写对应的mapper中的sql语句
<!--添加一个用户,对象中的属性,可以直接取出来--> <insert id="addUser" parameterType="com.xiaoshen.pojo.User"> INSERT INTO user (id, name, pwd) VALUES (#{id},#{name},#{pwd}) </insert>
-
测试
//增删改需要提交事务!!! @Test public void test3(){ //1.获取SqlSession对象 SqlSession sqlSession = MybatisUtils.getSqlSession(); try{ //2.获取Mapper接口名字的class UserMapper mapper = sqlSession.getMapper(UserMapper.class); //3.实现接口的里面的方法,并设置参数 User User = new User(5,"小浩","123456"); int user = mapper.addUser(User); if (user>0){ System.out.println("插入成功!"); }else { System.out.println("插入失败"); } //提交事务!!! sqlSession.commit(); }catch (Exception e){ e.printStackTrace(); }finally { sqlSession.close(); } }
4. update
修改,查询语句
-
id:就是对应的namespace中的方法名
-
parameterType:参数类型!
-
编写接口
//update一个用户 int updateUser(User user);
-
编写对应mapper中的sql语句
<!--修改用户信息--> <update id="updateUser" parameterType="com.xiaoshen.pojo.User"> update user set name=#{name},pwd=#{pwd} where id=#{id} </update>
-
测试
@Test public void updateUser(){ //1.获取SqlSession对象 SqlSession sqlSession = MybatisUtils.getSqlSession(); try{ //2.获取Mapper对象的接口名字的class UserMapper mapper = sqlSession.getMapper(UserMapper.class); User i = new User(4,"小茹","123456"); int user = mapper.updateUser(i); if (user>0){ System.out.println("修改成功!"); }else { System.out.println("修改失败!"); } sqlSession.commit(); }catch (Exception e){ e.printStackTrace(); }finally { sqlSession.close(); } }
5. delete
删除,查询语句
-
id:就是对应的namespace中的方法名
-
parameterType:参数类型!
-
编写接口
//delete一个用户 int deleteUser(int id);
-
编写对应mapper中的sql语句
<!--删除用户--> <delete id="deleteUser" parameterType="int"> delete from user where id = #{id} </delete>
-
测试
@Test public void deleteUser(){ //1.获取SqlSession对象 SqlSession sqlSession = MybatisUtils.getSqlSession(); try{ //2.获取mapper接口的名字的class UserMapper mapper = sqlSession.getMapper(UserMapper.class); //3.实现接口里面的方法 mapper.deleteUser(5); //4.提交事务! sqlSession.commit(); }catch (Exception e){ e.printStackTrace(); }finally { sqlSession.close(); } }
注意点:
-
增删改需要提交事务!!!