Mybatis 学习笔记
- 环境:
JDK1.8
Mysql 5.7
Maven 3.6.1
IDEA
- 回顾:
JDBC(增删改查)
Mysql
Java基础
Maven
Junit
- 框架:
1、Mybati简介
1.1、什么是Mybatis
MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。
1.2、持久化
数据持久化
- 持久化即是将程序的数据在持久状态和瞬时状态的转化过程。
- 数据库(JDBC) io文件持久化。
1.3、持久层
Dao层,Service层,Controller层…
- 完成持久化工作的代码块
- 层界限十分明显
目的:传统的JDBC代码太复杂,可以用Mybatis简化。
优点:
- 简单易学:本身小且简单,没有第三方依赖。
- 灵活:不会对现有程序或数据库的设计强加影响。
- 解除SQL与程序代码的耦合,提高了可维护性。
- 提供映射标签,支持对象与数据库的orm字段关系映射。
- 提供对象关系映射标签,支持对象关系组建维护。
- 提供XML标签,支持编写动态SQL。
关键:使用人数多,受众大,如Spring、SpringMVC、SpringBoot。
2、第一个Mybatis程序
思路:搭建环境–>导入Mybatis–>编写代码–>测试。
2.1、搭建环境
搭建数据库:
-
常用语句
- net start mysql80; /*打开Mysql服务。*/ - mysql -h localhost -u root -p 1234; /*登录Mysql。*/ - show databases; - create database mybatis; - use mybatis; /*建表*/ create table user ( id INT(20) NOT NULL PRIMARY KEY, name VARCHAR(30) DEFAULT NULL, pwd CARCHAR(30) DEFAULT NULL )ENGINE=INNODB DEAFULT CHARSET=utf8; /*插值*/ INSERT INTO user(id,name,pwd) values (1,'Jack',123456), (2,'Mike',321456), (3,'Lucy',321654);
新建Maven项目
-
新建Maven项目,选择create from archetype,一般常用webapp。
-
删除src文件夹,构成父工程。
-
导入依赖,至少三个mysql-connector-Java(Mysql驱动),Mybatis和Junit(利用Maven导入依赖十分方便)。
<!-- 导入依赖 --> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.11</version> <scope>test</scope> </dependency> <!-- MySQL驱动 --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.22</version> </dependency> <!-- Mybatis --> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.5.2</version> </dependency> <!-- 保证我们的Maven项目导出没有问题 --> <build> <resources> <resource> <directory>src/main/resources</directory> <includes> <include>**/*.properties</include> <include>**/*.xml</include> </includes> <filtering>false</filtering> </resource> <resource> <directory>src/main/java</directory> <includes> <include>**/*.properties</include> <include>**/*.xml</include> </includes> <filtering>false</filtering> </resource> </resources> </build> </dependencies>
2.2、创建新模块
-
编写mybatis核心配置文件
注意事项:
- 完整的url不仅包括链接,应还包括链接协议、统一字符以及数据库的时区设置等。
- 注意xml中&的转义表示
<!-- 核心配置文件 --> <configuration> <environments default="development"> <environment id="development"> <transactionManager type="JDBC"/> <dataSource type="POOLED"> <property name="driver" value="com.mysql.cj.jdbc.Driver"/> <!-- MySQL8.0版本后有cj,之前版本为com.mysql.jdbc.Driver --> <!-- 在xml中url设置&用&转义,?后接链接设置,诸如使用安全链接协议、统一字符等。(另外链接数据库通常考虑设置时区) --> <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="1234"/> </dataSource> </environment> </environments> </configuration>
-
编写mybatis工具类
//专门用于获取SqlSessionFactory,用于构建SqlSession
public class MybatisUtils {
private static SqlSessionFactory sqlSessionFactory;
static{
try{
/* 使用Mybatis第一步,获取SqlSessionFactory对象 */
String resource = "mybatis-confi.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
} catch (IOException e){
e.printStackTrace();
}
}
/*既然有了 SqlSessionFactory,顾名思义,我们可以从中获得 SqlSession 的实例。SqlSession 提供了在数据库执行 SQL 命令所需的所有方法。*/
public static SqlSession getSqlSession(){
return sqlSessionFactory.openSession();
}
}
2.3、编写代码
-
实体类
- 无参与有参构架可以直接alt+insert导入添加方法
//实体类 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接口
- Dao等价于mapper
/* DAO接口 */ public interface UserDao { List<User> getUserList(); }
-
接口实现类
由原来的UserDaoImpl转变为Mapper文件,体现Mybatis便捷的特点,不必实现具体的Dao接口。
xml技巧,<显示所有标签语句,空格显示标签内语句
此类有几点注意事项:
- namespace绑定一个对应的Dao/Mapper接口
- select标签对应SQL查找,id指向对应的Dao方法,resultType对应返回类型(即最先声明的类)
<?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.jia.dao.UserDao"> <!-- 查询语句select针对SQL,id对应获取dao方法,resultType对应返回类型 --> <select id="selectBlog" resultType="com.jia.pogo.User"> select * from mybatis.user where id = #{id} </select> </mapper>
2.4、测试
测试规范:
-
所有测试都应写在src下对应的test文件夹中
-
每一个测试都应建立与所测试项对应的包
常见测试报错:
-
误删Mybatis核心配置文件(mybatis.config.xml)中的标签
1.1、报错示例
1.2、Debug
每一个mapper.消灭了都需要在mybatis核心配置文件中注册,解决方法即在mybatis配置文件中利用标签注册mapper。
<!-- 每一个mapper.xml都需要在mybatis核心配置文件中注册 --> //resource指向被注册mapper.xml <mappers> <mapper resource="com.jia.dao.UserMapper.xml"/> </mappers>
-
无法读取resource中的xml文件
1.1、报错示例
1.2、Debug
由于Maven约定大于配置,导致无法导出或生效配置文件。解决方法,在父项目和子项目中添加build标签以配置resources,避免资源导出失败等问题。
<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注解,实现不调用Main函数的基础上直接运行被测试方法(注意:被测试方法必须被public修饰)。
3、增删改查实现CRUD
基本思路:在Dao.java中声明方法,在Mapper.xml中配置mapper。然后在测试类中书写测试方法。注意:删除、修改、添加都需要调用commit方法提交事务。
基本框架:
@Test //Junit测试注解
public void addUser(){
/*经典三板斧*/
//获取SQLSession对象
SqlSession sqlSession=MybatisUtils.getSqlSession();
//执行SQL
UserDao userDao=sqlSession.getMapper(UserDao.class);//先获取userDao类,然后就可以调用其中的方法
//提交事务
sqlSession.commit();
//关闭SqlSession
sqlSession.close();
}
1、命名空间namespace
namespace中的包名一定要和Dao/Mapper接口包名一致,否则会报绑定异常错误“is not known to the MapperRigisty”。
2、select查询语句
选择,查询语句;
-
id:就是对应的namespace中所声明的方法名;
-
resultType:Sql语句执行的返回值;
-
parameterType:id对应方法的参数类型。
基本流程:
-
编写接口
//根据ID查询用户 User getUserById(int id);
-
编写mapper
<!-- 按序号查找 --> <select id="getUserById" parameterType="int" resultType="com.jia.pogo.User"> select * from mybatis.user where id = #{id}; </select>
-
测试
@Test public void getUserById(){ //获取SqlSession对象 SqlSession sqlSession = MybatisUtils.getSqlSession(); /*执行SQL*/ UserDao userDao = sqlSession.getMapper(UserDao.class); User user = userDao.getUserById(3); System.out.println(user); //关闭SqlSession sqlSession.close(); }
3、Insert插入语句
mapper关键语句:
<!-- 添加用户 -->
<insert id="addUser" parameterType="com.jia.pogo.User">
insert into mybatis.user (id,name ,pwd) values (#{id},#{name},#{pwd});
</insert>
4、Update修改语句
mapper语句:
<!-- 修改用户 -->
<update id="updateUser" parameterType="com.jia.pogo.User">
update mybatis.user set name=#{name},pwd=#{pwd} where id = #{id} ;
</update>
5、Delete删除语句
mapper语句:
<!-- 删除用户 -->
<delete id="dropUser" parameterType="int">
delete from mybatis.user where id = #{id};
</delete>