day01 mybatis
Mybatis介绍
它是基于Java编写的持久层框架,使开发者不必关心传统jdbc的api,只关心sql语句本身。
采用 ORM 思想解决了实体和数据库映射的问题,对 jdbc 进行了封装,屏蔽了 jdbc api 底层访问细节,使我们不用与 jdbc api 打交道,就可以完成对数据库的持久化操作。
传统JDBC的缺点
1 每次都需要获取链接,然后关闭链接,导致影响性能
2 直接写死了SQL语句,导致硬编码
3 执行完成SQL语句之后,还需要自己封装javabean对象
mybatis的优点
1 直接使用数据库连接池
2 mybatis是直接把SQL语句写到配置文件,会更加灵活
3 mybatis框架执行CRUD的时候,会自动封装javabean
入门案例
首先配置maven仓库,配置两个setting,两个setting里面的maven必须配置一模一样


创建项目名称 day43MyBatis
添加pom的文件,下载相关包
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.atguigu</groupId>
<artifactId>day43Mybatis</artifactId>
<version>1.0-SNAPSHOT</version>
<!-- 导入坐标-->
<dependencies>
<!-- 导入mybatis-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.6</version>
</dependency>
<!-- 导入MySQL-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.16</version>
</dependency>
<!-- 导入测试框架-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
<!-- 导入日志框架-->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
</dependencies>
</project>
创建数据库mybatis
create database mybatis;
创建表user
CREATE TABLE `user` (
`id` int(11) NOT NULL auto_increment,
`username` varchar(32) NOT NULL COMMENT '名称',
`password` varchar(32) NOT NULL COMMENT '密码',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
创建实体类User
package com.atguigu.pojo;
public class User {
private Integer id;
private String username;
private String password;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", username='" + username + '\'' +
", password='" + password + '\'' +
'}';
}
}
在资源文件文件夹下面,新建一个核心配置文件, 文件的名字随意

<?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">
<!--
核心配置文件
表示dtd的约束文件
约束文件的意思:所有的配置都需要放到configuration里面 这个里面需要设置各种属性
大概有十个属性,每个属性是由先后顺序 不能随意放置
所以它的名字叫约束文件
-->
<configuration>
<!--
数据源 事务管理器
环境配置变量
environments:表示设置环境变量,但是环境变量可以设置多个
environment:表示环境变量
id:表示唯一标识符,随便取名字,叫什么都可以
default:表示默认选中哪个环境变量,注意:必须跟下面的id保持一致
transactionManager:表示事务管理器
type="JDBC":表示使用JDBC的事务管理器mybatis实际上是对JDBC的封装
dataSource:表示数据源
type="POOLED":表示数据库的连接池
数据源里面需要设置四个参数
驱动 url地址 用户名 密码
-->
<environments default="mysql">
<environment id="mysql">
<transactionManager type="JDBC"></transactionManager>
<dataSource type="POOLED">
<property name="username" value="root"/>
<property name="password" value="123456"/>
<!-- 当前的版本 8.0以上 需要设置cj 如果是8.0以下 去掉cj-->
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<!--
设置url地址
///:这个是主机和端口的缩写
localhost:3306
需要设置时区
北京:东八区,每15度一个区,一个区间隔一个小时
北回归线:广东 广西 云南
时区必须得写,其他的参数可写可不写
useUnicode=true:使用编码格式
characterEncoding=UTF-8: 编码格式是UTF-8
&:连接符 转义字符 &
serverTimezone=Asia/Shanghai; 使用亚洲上海时区
不要使用UTC
allowPublicKeyRetrieval=true: 使用密钥 使用公钥 只有mysql8.0以上才有
-->
<property name="url" value="jdbc:mysql:///mybatis?userSSL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true"/>
</dataSource>
</environment>
</environments>
<!-- 配置映射器 作用:是用来写SQL语句
resource: 表示映射文件存放在什么位置
-->
<mappers>
<!-- 表示使用配置文件的方式加载CRUD-->
<mapper resource="com/atguigu/dao/UserDao.xml"></mapper>
<!-- 使用全注解的方式实现CRUD-->
</mappers>
</configuration>
创建dao
package com.atguigu.dao;
import com.atguigu.pojo.User;
import java.util.List;
public interface UserDao {
/**
* 查询所有
*/
List<User> findAll();
}
配置sql的映射文件
<?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">
<!--
mapper:表示配置映射文件
namespace:表示命名空间
com.atguigu.dao.UserDao 设置全限定名 实际上就是dao的完整路径
-->
<mapper namespace="com.atguigu.dao.UserDao">
<!-- id:表示唯一标识符 这个标识符需要跟类里面的方法名保持一致-->
<!-- resultType:叫做返回值的类型 返回值的类型 如果是集合 写的是集合封装的对象-->
<select id="findAll" resultType="com.atguigu.pojo.User">
select * from user
</select>
</mapper>
测试代码
package com.atguigu;
import com.atguigu.dao.UserDao;
import com.atguigu.pojo.User;
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 org.junit.Test;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
public class MybatisTest {
@Test
public void testFindAll() throws IOException {
// 1.读取配置文件
InputStream is = Resources.getResourceAsStream("sqlMapConfig.xml");
// 2.根据配置文件构建会话工厂
SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
// 3.读取配置文件里面的io流
SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(is);
// 4.获取会话对象
SqlSession sqlSession = sqlSessionFactory.openSession();
// 5.通过会话工厂 获取userDao对象
UserDao userDao = sqlSession.getMapper(UserDao.class);
// 6.调用userDao里面的findall方法
List<User> userList = userDao.findAll();
for (User user : userList) {
System.out.println(user);
}
}
}
使用注解的方式
1 需要删除配置文件

2 修改mybatis的核心配置文件
<mappers>
<!--表示使用配置文件的方式加载CRUD-->
<!--<mapper resource="com/atguigu/dao/UserDao.xml"></mapper>-->
<!--使用全注解的方式实现CRUD-->
<mapper class="com.atguigu.dao.UserDao"></mapper>
</mappers>
3 在userdao这个类身上添加我们需要的注解
public interface UserDao {
/**
* 查询所有
*/
@Select("select * from user")
List<User> findAll();
}
插入数据
UserDao
/**
* 添加数据
*/
void insert(User user);
<?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">
<!--
mapper:表示配置映射文件
namespace:表示命名空间
com.atguigu.dao.UserDao 设置全限定名 实际上就是dao的完整路径
-->
<mapper namespace="com.atguigu.dao.UserDao">
<!--配置添加操作后 获取插入数据的id
新增用户后,同时还要返回当前新增用户的id值, 因为id是由数据库的自动增长来实现的
所以就相当于我们要在新增后将自动增长 auto_increment的值返回-->
<!-- 实现方式一 在 标签中使用 useGeneratedKeys 和 keyProperty 两个属性来获取自动生成的主键值。-->
<!-- <insert id="insert" parameterType="com.atguigu.pojo.User" useGeneratedKeys="true" keyProperty="id">-->
<!-- insert into user(username,password) values(#{username}, #{password});-->
<!-- </insert>-->
<!-- 第二种实现方式:
selectKey: 表示查询主键
keyProperty="id":表示类的属性id
keyColumn="id": 表示主键id
resultType="int":主键的返回值类型是int
order="AFTER": 表示执行顺序
select last_insert_id(): 固定的语法 插入之后 查询id-->
<insert id="insert" parameterType="com.atguigu.pojo.User">
<selectKey keyProperty="id" keyColumn="id" resultType="int" order="AFTER">
select last_insert_id()
</selectKey>
insert into user(username, password) values(#{username}, #{password})
</insert>
<!-- id:表示唯一标识符 这个标识符需要跟类里面的方法名保持一致-->
<!-- resultType:叫做返回值的类型 返回值的类型 如果是集合 写的是集合封装的对象-->
<select id="findAll" resultType="com.atguigu.pojo.User">
select * from user
</select>
</mapper>
测试代码
package com.atguigu;
import com.atguigu.dao.UserDao;
import com.atguigu.pojo.User;
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 org.junit.After;
import org.junit.Before;
import org.junit.Test;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
public class MybatisTest {
// ctrl + alt + f:抽取成员变量
private SqlSession sqlSession;
private UserDao userDao;
private InputStream is;
// 用于在测试方法执行之前执行
@Before
public void before() throws IOException {
// 1.读取配置文件
is = Resources.getResourceAsStream("sqlMapConfig.xml");
// 2.根据配置文件构建会话工厂
SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
// 3.读取配置文件里面的io流
SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(is);
// 4.获取会话对象
sqlSession = sqlSessionFactory.openSession();
// 5.通过会话工厂 获取userDao对象
userDao = sqlSession.getMapper(UserDao.class);
}
// 测试保存操作
// 对MySQL数据库进行增、删、改操作需要提交事务 才能生效
// 用于在测试方法执行之后执行
@After
public void after() throws IOException {
// 提交事务
sqlSession.commit();
// 释放资源
sqlSession.close();
is.close();
}
@Test
public void testInsert(){
// 添加数据
User user = new User();
user.setUsername("王安石");
user.setPassword("123123");
System.out.println("保存操作之前:" + user); // 保存操作之前:User{id=null, username='王安石', password='123123'}
userDao.insert(user);
System.out.println("保存操作之后:" + user); // 保存操作之后:User{id=53, username='王安石', password='123123'}
}
@Test
public void testFindAll() throws IOException {
// 1.读取配置文件
InputStream is = Resources.getResourceAsStream("sqlMapConfig.xml");
// 2.根据配置文件构建会话工厂
SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
// 3.读取配置文件里面的io流
SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(is);
// 4.获取会话对象
SqlSession sqlSession = sqlSessionFactory.openSession();
// 5.通过会话工厂 获取userDao对象
UserDao userDao = sqlSession.getMapper(UserDao.class);
// 6.调用userDao里面的findall方法
List<User> userList = userDao.findAll();
for (User user : userList) {
System.out.println(user);
}
}
}
更新数据
UserDao
/**
* 更新数据
*/
void update(User user);
UserDao.xml
<update id="update" parameterType="com.atguigu.pojo.User">
update user set username=#{username},password=#{password} where id=#{id}
</update>
测试代码
@Test
public void testUpdate(){
// 修改数据
User user = new User();
user.setId(42);
user.setUsername("李清照");
user.setPassword("111111");
// 调用userDao的方法进行更新数据
userDao.update(user);
}
删除数据
UserDao
/**
* 删除数据
*/
void delete(Integer userId);
UserDao.xml
<delete id="delete" parameterType="com.atguigu.pojo.User">
delete from user where id = #{id}
</delete>
测试代码
@Test
public void testDelete(){
// 调用userDao的方法根据id进行删除
userDao.delete(45);
}
本文详细介绍MyBatis框架的基本概念及使用方法,包括环境搭建、配置文件解析、基本CRUD操作实现等,帮助读者快速掌握MyBatis的核心功能。
148

被折叠的 条评论
为什么被折叠?



