1. 什么是mybatis
MyBatis 是一款优秀的==持久层框架==,它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射实体类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。
框架: 别人写好的一个半成品工程。我们只需要安装指定的配置来使用这个半成品。
持久层框架: 就是与数据库交互的框架。---简化我们操作数据库表记录的一个框架。
ORM框架: Object Relative Mapping .
表----实体类
字段---属性
一条记录----对象
多条记录----对象集合
2. 为什么使用mybatis
原来的jdbc操作数据库代码中可以看出,我们操作数据库非常麻烦。需要手动设置占位符的值,而且需要手动封装处理结果集。 我们可以使用mybatis完成上面繁琐的操作。
Mybatis就是为了简化java操作数据库的代码。
3. 如何使用mybatis
3.1.创建maven的java工程并引入依赖
导入依赖
<dependencies> <!--mysql依赖--> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.33</version> </dependency> <!--单元测试--> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.13.2</version> <!--范围:表示该jar的使用范围只能在test包下用--> <scope>test</scope> </dependency> <!--lombok--> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.34</version> </dependency> <!--mybatis框架的依赖--> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.5.9</version> </dependency> </dependencies>
没次导入pom依赖时都要记得刷新重新读取
新建后的结构如下
2.创建实体类
@Data
@AllArgsConstructor
@NoArgsConstructor
@ToString
public class Role {
private Integer id;
private String rolename;
private String rolecode;
private String description;
}
在这里使用到了lombok依赖
注解顺序的解释依次为
@Data,设置get,set方法
@AllArgsConstructor,@NoArgsConstructor,有参无参的构造方法
@ToString,重写ToString方法
大大简化了操作
3.2.1lombok简介
Project Lombok 是一个 Java 库,可自动插入您的编辑器和构建工具,为您的 Java 增添趣味。再也不用编写另一个 getter 或 equals 方法,只需一个注解,您的类就拥有了一个功能齐全的构建器、自动化您的日志记录变量等等。
3.2.2使用
一般搭配lombok插件使用
依赖
<!--lombok依赖[1]idea安装lombok插件 [2]引入依赖-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.24</version>
</dependency>
插件
3.mybatis配置文件---不需要背,自己存下默认结构,再根据项目添加
文件名mybatis.xml,放在resouse下
<?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">
<!--name是固定的 value根据需要配置为自己的内容-->
<property name="driver" value="com.mysql.cj.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost:3306/day1211" />
<property name="username" value="root" />
<property name="password" value="root" />
</dataSource>
</environment>
</environments>
<!--引入对应的映射文件注意:改为自己的映射文件-->
<mappers>
<!-- <mapper class="com.zwt.dao.RoleDao"/>-->Dao所在的路径
<!-- <mapper resource="mapper/RoleMapper.xml"/>-->Dao对应的Xml所在的路径
</mappers>
</configuration>
RoleMapper.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:命名空间。现在可以随便写。后期需要和接口所在的包对应-->
<mapper namespace="qy179">
<!--select表示查询sql标签
id:表示sql语句的唯一标识,通常使用mapper接口的全类名.方法名组成
resultType:表示结果类型。 mysql执行完该sql后返回的数据类型,增删改默认返回类型为int
#{id}:表示占位符。mybatis会自动给该占位符赋值
-->
<select id="getById" resultType="com.ykq.entity.Teacher">
<!-- 填写sql语句-->
</select>
</mapper>
测试findbyid
// 这行代码的主要目的是从类路径下读取名为 mybatis.xml 的配置文件,并将其内容以 Reader 流的形式获取到,以便后续交给 MyBatis 框架进行相关配置的解析操作。
Reader reader = Resources.getResourceAsReader("mybatis.xml");
// 此代码的核心作用是利用前面读取到的 mybatis.xml 文件内容(通过 reader 传递),构建出一个 SqlSessionFactory 对象,它是 MyBatis 框架中用于创建 SqlSession 的工厂类,后续可以基于它来开启数据库会话等操作。
SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(reader);
// 基于前面创建好的 SqlSessionFactory 对象,开启一个数据库会话(SqlSession),这个会话对象相当于在应用程序和数据库之间建立的一个连接通道,通过它可以执行各种数据库操作,比如查询、插入、更新、删除等操作。
SqlSession sqlSession = sqlSessionFactory.openSession();
// 这行代码的作用是从当前的 SqlSession 中获取一个实现了 RoleDao 接口的代理对象,这个代理对象是由 MyBatis 动态生成的,它能够将对 RoleDao 接口中定义的方法调用转换为实际对数据库的操作,也就是实现了数据库访问层的逻辑封装
RoleDao roleDao = sqlSession.getMapper(RoleDao.class);
Role role= roleDao.findById(7);
System.out.println(role);
注意在修改数据库时需要使用sqlSession.commit();进行提交否则数据库无变化
执行成功
4.接下来就是使用mybaties完成crud操作
我的mapper中的增删改查
<mapper namespace="com.zwt.dao.RoleDao">
<insert id="insert" >
insert into day1206.t_role (rolename, rolecode, description) VALUES (#{rolename},#{rolecode},#{description})
</insert>
<update id="update">
update day1206.t_role set rolecode=#{rolecode},rolecode=#{rolecode},description=#{description} where id=#{id}
</update>
<delete id="delete">
delete from day1206.t_role where id=#{id}
</delete>
<select id="findById" resultType="Role">
select * from day1206.t_role where id=#{id}
</select>
<select id="selectAll" resultType="com.zwt.entity.Role">
select * from day1206.t_role
</select>
</mapper>
接口dao
public interface RoleDao {
public Role findById(int id);
public int update(Role role);
public int delete(int id);
public int insert(Role role);
public List<Role> selectAll();
}
我的测试代
@Test
public void findById() throws IOException {
// 这行代码的主要目的是从类路径下读取名为 mybatis.xml 的配置文件,并将其内容以 Reader 流的形式获取到,以便后续交给 MyBatis 框架进行相关配置的解析操作。
Reader reader = Resources.getResourceAsReader("mybatis.xml");
// 此代码的核心作用是利用前面读取到的 mybatis.xml 文件内容(通过 reader 传递),构建出一个 SqlSessionFactory 对象,它是 MyBatis 框架中用于创建 SqlSession 的工厂类,后续可以基于它来开启数据库会话等操作。
SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(reader);
// 基于前面创建好的 SqlSessionFactory 对象,开启一个数据库会话(SqlSession),这个会话对象相当于在应用程序和数据库之间建立的一个连接通道,通过它可以执行各种数据库操作,比如查询、插入、更新、删除等操作。
SqlSession sqlSession = sqlSessionFactory.openSession();
// 这行代码的作用是从当前的 SqlSession 中获取一个实现了 RoleDao 接口的代理对象,这个代理对象是由 MyBatis 动态生成的,它能够将对 RoleDao 接口中定义的方法调用转换为实际对数据库的操作,也就是实现了数据库访问层的逻辑封装
RoleDao roleDao = sqlSession.getMapper(RoleDao.class);
Role role= roleDao.findById(7);
System.out.println(role);
}
@Test
public void update() throws IOException {
Reader reader = Resources.getResourceAsReader("mybatis.xml");
SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(reader);
SqlSession sqlSession = sqlSessionFactory.openSession();
RoleDao roleDao = sqlSession.getMapper(RoleDao.class);
Role role=new Role(7,"老师","teacher","老师");
int update = roleDao.update(role);
System.out.println(update);
sqlSession.commit();
}
@Test
public void delete() throws IOException {
Reader reader = Resources.getResourceAsReader("mybatis.xml");
SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(reader);
SqlSession sqlSession = sqlSessionFactory.openSession();
RoleDao roleDao = sqlSession.getMapper(RoleDao.class);
int delete= roleDao.delete(5);
System.out.println(delete);
sqlSession.commit();
}
@Test
public void insert() throws IOException {
Reader reader = Resources.getResourceAsReader("mybatis.xml");
SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(reader);
SqlSession sqlSession = sqlSessionFactory.openSession();
RoleDao roleDao = sqlSession.getMapper(RoleDao.class);
int insert = roleDao.insert(new Role("学生", "student", "学生"));
System.out.println(insert);
sqlSession.commit();
}
@Test
public void selectAll() throws IOException {
Reader reader = Resources.getResourceAsReader("mybatis.xml");
SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(reader);
SqlSession sqlSession = sqlSessionFactory.openSession();
RoleDao roleDao = sqlSession.getMapper(RoleDao.class);
List<Role> roles = roleDao.selectAll();
for (Role role : roles) {
System.out.println(role.getRolename());
};
sqlSession.commit();
}
常见错误
mybatis.xml路径找不到