MyBatis
MyBatis简介
MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。
MyBatis开发步骤
- 添加MyBatis的坐标(mysql-connector-java, mybatis)
- 创建user数据表
- 编写User实体类
- 编写映射文件UserMapping.xml
- 编写核心文件SqlMapConfig.xml
- 编写测试类
User实体类:
public class User {
private int id;
private String username;
private String password;
public int getId() {
return id;
}
}
UserMapping.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">
<mapper namespace="userMapper">
<select id="findAll" resultType="mybatis.domain.User">
select * from user
</select>
</mapper>
SqlMapConfig.xml 的配置:
<?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="developement">
<environment id="developement">
<transactionManager type="JDBC"></transactionManager>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="username" value="root"/>
<property name="url" value="jdbc:mysql:/test?serverTimezone=GMT%2B8"/>
<property name="password" value="root"/>
</dataSource>
</environment>
</environments>
<!-- 加载映射文件-->
<mappers>
<mapper resource="mapper/UserMapping.xml"/>
</mappers>
</configuration>
Test的测试类
import mybatis.domain.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 test1() throws IOException {
//获得核心配置文件
InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml");
//获得session工厂对象
SqlSessionFactory build = new SqlSessionFactoryBuilder().build(resourceAsStream);
//获得session会话对象
SqlSession sqlSession = build.openSession();
//执行操作 参数:namespace
List<User> objects = sqlSession.selectList("userMapper.findAll");
System.out.println(objects);
//释放资源
sqlSession.close();
}
}
MyBatis的增删改查操作
- 插入操作注意的问题:
- 插入语句使用insert标签
- 在映射文件中使用parameterType属性指定要插入的数据类型
- Sql语句中使用#{实体属性名}方式引用实体中的属性值
- 插入操作使用的Api是sqlSession.insert(" 命名空间.id ",实体对象);
- 插入操作涉及数据库数据变化,所以要使用sqlSession对象显示的提交事务,即 sqlSession.commit()
UserMapping.xml中的配置:
<mapper namespace="userMapper">
<insert id="save" parameterType="mybatis.domain.User">
insert into user values(#{id},#{username},#{password})
</insert>
Test 中的调用:
@Test
public void test2() throws IOException {
//模拟User对象
User user = new User();
user.setUsername("Tom");
user.setPassword("123");
//获得核心配置文件
InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml");
//获得session工厂对象
SqlSessionFactory build = new SqlSessionFactoryBuilder().build(resourceAsStream);
//获得session会话对象
SqlSession sqlSession = build.openSession();
//执行操作 参数:namespace
sqlSession.insert("userMapper.save",user);
//mybatis执行更新操作,需要提交事务
sqlSession.commit();
//释放资源
sqlSession.close();
}
- 修改操作
- 修改语句使用update标签
- 修改操作使用的API是sqlSession.update(" 命名空间.id ", 实体对象);
UserMapping.xml中的配置:
<update id="update" parameterType="mybatis.domain.User">
update user set username=#{username},password=#{password} where id=#{id}
</update>
Test 中的调用:
@Test
//更新操作
public void test3() throws IOException {
//模拟User对象
User user = new User();
user.setId(5);
user.setUsername("om");
user.setPassword("23");
//获得核心配置文件
InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml");
//获得session工厂对象
SqlSessionFactory build = new SqlSessionFactoryBuilder().build(resourceAsStream);
//获得session会话对象
SqlSession sqlSession = build.openSession();
//执行操作 参数:namespace
sqlSession.update("userMapper.update",user);
//mybatis执行更新操作,需要提交事务
sqlSession.commit();
//释放资源
sqlSession.close();
}
- 删除操作
- 删除语句使用delete标签
- Sql语句中使用#{任意字符串}方式引用传递的单个参数
- 删除操作使用的API是sqlSession.delete(" 命名空间.id ", Object);
UserMapping.xml中的配置:
<delete id="delete" parameterType="java.lang.Integer">
delete from user where id=#{id}
</delete>
Test 中的调用:
@Test
public void test4() throws IOException {
//获得核心配置文件
InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml");
//获得session工厂对象
SqlSessionFactory build = new SqlSessionFactoryBuilder().build(resourceAsStream);
//获得session会话对象
SqlSession sqlSession = build.openSession();
//执行操作 参数:namespace
sqlSession.delete("userMapper.delete",5);
//mybatis执行更新操作,需要提交事务
sqlSession.commit();
//释放资源
sqlSession.close();
}
MyBatis核心配置文件
- configuration 配置
- properties 属性
- settings 设置
- typeAliases(类型别名)
- typeHandlers(类型处理器)
- objectFactory(对象工厂)
- plugins(插件)
- environments(环境配置)
- environment(环境变量)
- transactionManager(事务管理器)
- dataSource(数据源)
- environment(环境变量)
- databaseIdProvider(数据库厂商标识)
- mappers(映射器)
https://mybatis.org/mybatis-3/zh/configuration.html#environments[上面各种属性的详细介绍]
MyBatis的相应API
- 常用的API : SqlSessionFactory build(InputStream inputStream);
- 通过加载mybatis的核心文件的输入流的形式构建一个SqlSessionFactory对象
- 其中Resources工具类,这个类在org.apache.ibatis.io包中。Resources类帮助你从类路径下,文件系统或一个web URL中加载资源文件。
- SqlSession openSession() : 会默认开启一个事务,但事务不会自动提交
- SqlSession openSession(boolean autoCommit) : 参数为是否自动提交
- SqlSession 在 MyBatis 中是非常强大的一个类。它包含了所有执行语句、提交或回滚事务以及获取映射器实例的方法。
- < T > T selectOne(String statement, Object parameter) : 查询一个对象
- < E > List< E > selectList(String statement, Object parameter)
- int insert(String statement, Object parameter)
- int update(String statement, Object parameter)
- int delete(String statement, Object parameter)
- void commit()
- void rollback()