MyBatis 是一款优秀的持久层框架(Dao层),它支持自定义 SQL、存储过程以及高级映射。内部封装了JDBC,也有人把MyBatis称之为半自动化的ORM映射框架
半自动化:MyBatis天生支持对象结果集映射,MyBatis认为用户自己写的SQL效率最高,所以没有支持.
对象关系映射(Object Relational Mapping,简称ORM,或O/RM,或O/R mapping),是一种程序技术,在面向对象中方便进行对象转化.
用于实现面向对象编程语言里不同类型系统的数据之间的转换 。从效果上说,它其实是创建了一个可在编程语言里使用的--"虚拟对象数据库"。
对象转化:
操作数据库时,我们通过sql语句来获取查询到的结果集,但是用户在使用时需要将结果集自己封装为对象,这个过程可以使用ORM进行自动化的映射.
ORM思想:
----结果集可以自动封装为对象
----根据对象可以自动生成sql
全自动ORM
hibernate 纯面向对象,用户不用写sql,但是多表操作时,代码不够灵活,sql冗余,执行效率比MyBatis低.
没有蓝鸟红鸟图标就添加一个插件 MyBatisX
运行期无效
mysql
mysql-connector-java
8.0.16
org.mybatis
mybatis
3.5.6
junit
junit
4.12
test
ch.qos.logback
logback-classic
1.2.3
org.projectlombok
lombok
1.18.24
provided
应该与数据库中的表字段一一对应
@Data
@NoArgsConstructor
@AllArgsConstructor
public class User implements Serializable {
private Integer id;
private String name;
private Integer age;
private String sex;
}
在配置文件里编写UserMapper.xml映射文件,与接口绑定
public interface UserMapper {
List getAllUser();
}
实现Mapper具体操作的 mapper namespace
resultType
id要和接口绑定
管理数据源
管理事务,
加载映射文件
POOLED 池化
MyBatis操作数据库
1.加载核心配置文件mybatis-config.xml
2. 获取MyBatis核心对象 SqlSessionFuctory
3.基于工厂模式,获取SqlSession
4.获取Mapper接口
5.基于接口调用业务方法
SqlSessionFactroyBuilder 工厂的创建
SqlSessionFuctory 工厂 获取MyBatis核心对象
SqlSession = conn + 自动映射 获取对象
SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(is);
我要创建个工厂 而且我要拿到你的核心配置文件里面的resource对应的接口,然后我才能干活
//获取Mapper接口
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
这个接口的实现类对象是谁?
是一个代理对象 而且是JDK的代理
/**
* mybatis操作数据库:
* 1.加载mybatis的核心配置文件mybatis-config.xml
* 2.获取Mybatis核心对象
* SqlSession = conn + 自动映射
* @throws IOException
*/
@Test
public void testGetAllUser() throws IOException {
//读取mybatis-config.xml核心配置文件
InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
//创建mybatis中操作数据库的会话对象SqlSession
SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(is);
//获取sqlSession对象
SqlSession sqlSession = sqlSessionFactory.openSession();
//面向接口编程 controller-service-dao 接口调用
//获取Mapper接口
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
//调用接口方法
List userList = userMapper.getAllUser();
//如果方法体中只有一行代码 并且是输出语句则简化
userList.forEach(System.out::println);
}
报错说明1:
org.apache.ibatis.binding.BindingException: Type interface com.jt.mapper.UserMapper is not known to the MapperRegistry.
解决方案1:
检查namespace命名是否与接口一致
报错说明2:
org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): com.jt.mapper.UserMapper.findAll
解决方案2:
检查xml映射文件中的ID是否与接口方法一致.
报错说明3:
The error may exist in mybatis/mappers/UserMapper2.xml
解决方案3:
检查mybatis核心文件加载mapper映射文件的路径是否正确.
简化
@Before 在执行@Test测试方法前 执行
private SqlSessionFactory sqlSessionFactory;
@Before
public void init() throws IOException {
InputStream resource = Resources.getResourceAsStream("mybatis-config.xml");
sqlSessionFactory = new SqlSessionFactoryBuilder().build(resource);
}
@Test
public void TestSelectById(){
//得到sqlSession 开始干活
SqlSession sqlSession = sqlSessionFactory.openSession();
//获取接口
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
User user = mapper.getUserById();
System.out.println(user);
}