这边的东西全部来自 https://itbaima.net/document
Mybatis
基础配置
-
目录
-
需要
JavaBean
,MySQL表
,mapper.xml
,接口
,mybatis-config.xml
1.mybatis-config.xml
配置文件
负责连接数据库 同时扫描到mapper.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>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<!-- 还是端口+数据库名+一堆乱七八糟的-->
<property name="url" value="jdbc:mysql://localhost:3306/m1?useSSL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
</environments>
<!-- mapper 是扫描接口对应配置xml的 还有一种是到时候直接写文件夹-->
<!-- <mappers>-->
<!-- <mapper resource="myb/TestMapper.xml"/>-->
<!-- </mappers>-->
</configuration>
2.interface
接口负责定义方法
public interface UserMapper {
User selectUserById(int id);
List<User> selectAllUsers();
@MapKey("id")//mybatis会把这个id作为key 不写也不报错
List<Map> selectAllUsers2();
void insertUser(User user);
}
3.mapper.xml
mapper.xml
负责映射interface
的方法
namespace
接口所在的位置id
接口的目标方法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">
<!--接口所在的位置-->
<mapper namespace="myb.mapper.UserMapper">
<!-- id 接口的目标方法 resultType 查询的返回值-->
<!-- parameterType="integer" 不写也没事-->
<select id="selectUserById" resultType="myb.bean.User" >
select * from users where id=#{id}
</select>
<select id="selectAllUsers" resultType="myb.bean.User">
select * from users
</select>
<select id="selectAllUsers2" resultType="Map">
select * from users
</select>
<insert id="insertUser" >
insert into users values(null,#{username},#{password},#{email})
</insert>
</mapper>
4.JavaBean
JavaBean负责映射表
@Data
@ToString
@Accessors(chain = true)//链式写法 lombok的注解
public class User {
private int id;
private String username;
private String email;
private String password;
// 构造方法、getter 和 setter 略
}
5.mysql表
CREATE TABLE users (
id INT PRIMARY KEY AUTO_INCREMENT,
username VARCHAR(50),
email VARCHAR(100),
password VARCHAR(50)
);
6.测试
- 配置文件完成后,我们需要在Java程序启动时,让Mybatis对配置文件进行读取并得到一个
SqlSessionFactory
对象: - 每个基于 MyBatis 的应用都是以一个
SqlSessionFactory
的实例为核心的,我们可以通过SqlSessionFactory
来创建多个新的会话,SqlSession对象
,每个会话就相当于我不同的地方登陆一个账号去访问数据库,你也可以认为这就是之前JDBC中的Statement对象,会话之间相互隔离
,没有任何关联。
@Test
public void test2() throws IOException {
// 指定 MyBatis 配置文件
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
// 创建 SqlSessionFactory
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
// 获取 SqlSession
// sqlSessionFactory.openSession()默认autoCommit=false
try (SqlSession session = sqlSessionFactory.openSession()) {
// 获取 UserMapper 接口的实例
UserMapper mapper = session.getMapper(UserMapper.class);
// 执行查询操作
User user = mapper.selectUserById(1);
System.out.println(user);
}
}
简单增删改查
增删改都需要 在提交之前 手动提交 sqlSession session.commit();
1.查询
1. 查一个
1.1 接口
User selectUserById(int id);
1.2.mapper.xml
<select id="selectUserById" resultType="myb.bean.User" >
select * from users where id=#{id}
</select>
查一批
- 两种方法 一个是返回
List<User>
一个是返回List<Map>
2.1.接口
List<User> selectAllUsers();
@MapKey("id")//mybatis会把这个id作为key 不写也不报错
List<Map> selectAllUsers2();
2.2.mapper.xml
<select id="selectAllUsers" resultType="myb.bean.User">
select * from users
</select>
<select id="selectAllUsers2" resultType="Map">
select * from users
</select>
2.增加
配置里有个选项parameterType="xxx"
不写也没事 mybatis 自动识别
也不推荐写
2.1 接口
void insertUser(User user);
2.2 mapper.xml
<insert id="insertUser" >
<!-- <insert id="insertUser" parameterType="User" -->
insert into users values(null,#{username},#{password},#{email})
</insert>
2.3 提交
userMapper.insertUser(new User().setUsername("张三").setPassword("123456").setEmail("x"));
session.commit();//这里需要手动提交sqlSession
3.修改
3.1 接口
void updateUser(User user);
3.2 mapper.xml
<update id="updateUser" >
update users set username=#{username},password=#{password},email=#{email} where id=#{id}
</update>
3.3 提交
userMpaaer.updateUser(new User().setId(1).setUsername("张三").setPassword("123456").setEmail("x"));
session.commit();//这里需要手动提交sqlSession
4.删除
4.1 接口
void deleteUserById(int id);
4.2 mapper.xml
<delete id="deleteUserById" >
delete from users where id=#{id}
</delete>
4.3 提交
userMapper.deleteUserById(1);
session.commit();//这里需要手动提交sqlSession
JavaBean多个构造器时构造器的指定
- 目标映射的JavaBean有多个构造器可能会报错, 这样配置
<resultMap id="Test" type="User">
<constructor>
<idArg column="id" javaType="int"/>
<arg column="username" javaType="String"/>
<arg column="password" javaType="String"/>
<arg column="email" javaType="String"/>
</constructor>
</resultMap>
<select id="selectAllUsers" resultMap="Test">
select * from users
</select>
MySQL列名和JavaBean字段名的指定
- 如果我们的列名和字段名不一致,我们可以在
mapper.xml
中指定列名 - 手动定义
resultMap
然后在select中指定resultMap="id"
<resultMap id="Test" type="User">
<!-- mysql的表列名 bean的属性名-->
<result column="sid" property="sid"/>
<result column="sex" property="name"/>
<result column="name" property="sex"/>
</resultMap>
<select id="selectAllUsers" resultMap="Test">
select * from users
</select>
mybatis 的事务
我们可以在获取SqlSession
关闭自动提交来开启事务模式,和JDBC其实都差不多:
public static void main(String[] args) {
try (SqlSession sqlSession = MybatisUtil.getSession(false)){
TestMapper testMapper = sqlSession.getMapper(TestMapper.class);
testMapper.addStudent(new Student().setSex("男").setName("小王"));
testMapper.selectStudent().forEach(System.out::println);
}
}
我们发现,在关闭自动提交后,我们的内容是没有进入到数据库的,现在我们来试一下在最后提交事务:
sqlSession.commit();
在事务提交后,我们的内容才会被写入到数据库中。现在我们来试试看回滚操作:
try (SqlSession sqlSession = MybatisUtil.getSession(false)){
TestMapper testMapper = sqlSession.getMapper(TestMapper.class);
testMapper.addStudent(new Student().setSex("男").setName("小王"));
testMapper.selectStudent().forEach(System.out::println);
sqlSession.rollback();
sqlSession.commit();
}
回滚操作也印证成功。