MyBatis 教程 —— 乐之者java
By 乐之者java ,相关链接:
https://space.bilibili.com/392539815
http://www.roadjava.com/
MyBatis 官方文档
https://mybatis.org/mybatis-3/zh/index.html
select 快速入门
- 工程目录结构
![image]()
- QuickStartTest.java 的内容
package org.example;
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.example.POJO.User;
import org.example.mapper.UserMapper;
import org.junit.Test;
import java.io.IOException;
import java.io.InputStream;
public class QuickStartTest {
/**
* mybatis 的第二种写法(最终写法):
* 1. 创建 mybatis 的配置文件 mybatis-config.xml ,名字可以随便起
* 2. 创建 SqlSessionFactory
* 3. 通过 SqlSessionFactory 创建 SqlSession
* 4. 创建 mapper 文件
* 5. 使用 SqlSession 对象获取接口代理
* 6. 调用接口的方法即可
* */
@Test
public void test2() throws IOException {
String resource = "mybatis/mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
try (SqlSession session = sqlSessionFactory.openSession()) {
UserMapper userMapper = session.getMapper(UserMapper.class);
User user = userMapper.selectUserById(1L);
System.out.println(user);
}
}
/**
* mybatis 的第一种写法:
* 1. 创建 mybatis 的配置文件 mybatis-config.xml ,名字可以随便起
* 2. 创建 SqlSessionFactory
* 3. 通过 SqlSessionFactory 创建 SqlSession
* 4. 创建 mapper 文件
* 5. 使用 SqlSession 对象执行
* */
@Test
public void test1() throws IOException {
// 1. 从类路径开始找配置文件:
String resource = "mybatis/mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
// 2. 创建 SqlSessionFactory :
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
// 3. 通过 SqlSessionFactory 创建 SqlSession :
try (SqlSession session = sqlSessionFactory.openSession()) {
// 4. 执行指定的 sql 语句 id 标识,命名规则:namespace 的值 + 语句的 id 属性值
String statementId = "abcd.selectUserById";
User user = (User) session.selectOne(statementId, 1);
System.out.println(user);
}
}
}
- mybatis/mybatis-config.xml 的内容
<?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>
<!-- 定义一些键值对,可以在当前文件中(或 mapper 文件中)通过 ${} 的方式来使用;-->
<!-- resource:指定外部配置文件的文件,从类路径开始算:-->
<properties resource="mybatis/config.properties">
<property name="prop1" value="prop1"/>
</properties>
<!-- 数据库环境的配置:-->
<environments default="development">
<!-- db 环境可以有多个,通过 id 属性区分:-->
<environment id="development">
<!-- type 取值:JDBC 或 MANAGED ;-->
<!-- JDBC:使用 java.sql.Connection 管理事务:-->
<transactionManager type="JDBC"/>
<!-- type:POOLED 或 UNPOOLED 或 JNDI-->
<!-- POOLED:org.apache.ibatis.datasource.pooled.PooledDataSource :-->
<dataSource type="POOLED">
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
</dataSource>
</environment>
</environments>
<!-- 告诉 mybatis 去哪里找 mapper 文件:-->
<mappers>
<!-- 从类路径开始找 mapper 文件:-->
<mapper resource="mybatis/mapper/UserMapper.xml"/>
</mappers>
</configuration>
- mybatis/config.properties 的内容
driver=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/mybatis?useUnicode=true&characterEncoding=UTF-8&serverTimezone=GMT%2B8
username=root
password=06669590
- mybatis/mapper/UserMapper.xml 的内容
<?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:
第一种写法:避免语句 id 的重复;
第二种写法:
1. 避免语句 id 的重复;
2. 用于确定和哪个接口对应,要求 namespace 的值是对应接口的全限定名:-->
<!--<mapper namespace="abcd">-->
<mapper namespace="org.example.mapper.UserMapper">
<!--
select 标签用于查询;
#{xxx} :取出方法入参的值,mybatis 会将其替换为 ? 号,相当于:
Connection connection;
PreparedStatement ps = connection.prepareStatement(sql);
ps.setObject(1, "1aaa");
-->
<select id="selectUserById" resultType="org.example.POJO.User">
<!-- select * from user where user_id = #{userId}-->
select
user_id as userId,
user_name as userName,
age,
addr,
gender
from user where user_id = #{userId}
</select>
</mapper>
- User.java 的内容
package org.example.POJO;
import lombok.Data;
@Data
public class User {
// private Long user_id;
// private String user_name;
// private Integer age;
// private String addr;
// private String gender;
private Long userId;
private String userName;
private Integer age;
private String addr;
private String gender;
}
- UserMapper.java 的内容
package org.example.mapper;
import org.example.POJO.User;
// 命名为 mapper 或 dao 都可以:
public interface UserMapper {
User selectUserById(Long userId);
}
insert
- 在 QuickStartTest.java 中添加:
@Test
public void test3() throws IOException {
String resource = "mybatis/mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder()
// 指定要使用哪一个环境:
.build(inputStream, "development");
// 默认获取到的 session 是不自动提交的(connection.setAutoCommit(false)):
// try (SqlSession session = sqlSessionFactory.openSession(true)) { // 获取自动提交的 session
try (SqlSession session = sqlSessionFactory.openSession()) {
UserMapper userMapper = session.getMapper(UserMapper.class);
User user2save = new User();
user2save.setUserName("小红");
user2save.setAge(99);
user2save.setAddr("杭州");
user2save.setGender("女");
userMapper.insert(user2save);
session.commit();
}
}
- 在 UserMapper.xml 中添加:
<insert id="insert">
insert into user(user_name, age, addr, gender)
values (
#{userName}, #{age}, #{addr}, #{gender}
)
</insert>
- 在 UserMapper.java 中添加:
void insert(User user);
delete
- 在 QuickStartTest.java 中添加:
@Test
public void test4() throws IOException {
String resource = "mybatis/mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
try (SqlSession session = sqlSessionFactory.openSession()) {
UserMapper userMapper = session.getMapper(UserMapper.class);
userMapper.deleteById(4L);
session.commit();
}
}
- 在 UserMapper.xml 中添加:
<delete id="deleteById">
delete from user where user_id = #{id}
</delete>
- 在 UserMapper.java 中添加:
void deleteById(Long userId);
update
- 在 QuickStartTest.java 中添加:
@Test
public void test5() throws IOException {
String resource = "mybatis/mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
try (SqlSession session = sqlSessionFactory.openSession()) {
UserMapper userMapper = session.getMapper(UserMapper.class);
User user2update = new User();
user2update.setUserName("小红");
user2update.setAge(18);
user2update.setAddr("杭州西湖区");
user2update.setGender("女");
user2update.setUserId(6L);
userMapper.updateById(user2update);
session.commit();
}
}
- 在 UserMapper.xml 中添加:
<update id="updateById">
update user set
user_name = #{userName},
age = #{age},
addr = #{addr},
gender = #{gender}
where user_id = #{userId}
</update>
- 在 UserMapper.java 中添加:
void updateById(User user);
获取自动生成的主键的两种方式
useGeneratedKeys + keyProperty
- 在 QuickStartTest.java 中添加:
@Test
public void test6() throws IOException {
String resource = "mybatis/mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream, "development");
/**
* 在 JDBC 中通過如下方式獲取:
* Connection connection;
* PreparedStatement ps = connection.prepareStatement("");
* ps.getGeneratedKeys();
* 或通過 select last_insert_id() 获取。
* */
try (SqlSession session = sqlSessionFactory.openSession()) {
UserMapper userMapper = session.getMapper(UserMapper.class);
User user2save = new User();
user2save.setUserName("小红");
user2save.setAge(99);
user2save.setAddr("杭州");
user2save.setGender("女");
userMapper.insert(user2save);
session.commit();
System.out.println(user2save.getUserId());
}
}
- 在 UserMapper.xml 中添加:
<!--useGeneratedKeys 的默认值是 false ,设置为 true 会令 MyBatis 使用 JDBC 的 getGeneratedKeys 方法来取出由数据库内部生成的主键;
keyProperty :设置取到自动生成的主键后要把主键值赋给谁:-->
<insert id="insert" useGeneratedKeys="true" keyProperty="userId">
insert into user(user_name, age, addr, gender)
values (
#{userName}, #{age}, #{addr}, #{gender}
)
</insert>


浙公网安备 33010602011771号