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
运行期无效? ? ? <scope>provided</scope>
?
<dependencies>
<!--导入MySQL的驱动包-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.16</version>
</dependency>
<!--导入MyBatis的jar包-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.6</version>
</dependency>
<!--junit-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<!-- 日志 , 会自动传递slf4j门面-->
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.3</version>
</dependency>
<!--导入lombokjar包-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.24</version>
<scope>provided</scope>
</dependency>
</dependencies>
应该与数据库中的表字段一一对应
@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<User> getAllUser();
}
实现Mapper具体操作的 mapper namespace
resultType
id要和接口绑定
<!--配置文件应该与接口绑定-->
<mapper namespace="com.atguigu.mybatis.mapper.UserMapper">
<!--要求sql标签的id 必须与方法的名称一致 -->
<select id="getAllUser" resultType="com.atguigu.mybatis.pojo.User">
select id,name,age,sex from user
</select>
<!-- <insert id=""></insert>
<update id=""></update>
<delete id=""></delete>-->
</mapper>
管理数据源?
?管理事务,?
加载映射文件
POOLED 池化
<configuration>
<!--设置连接数据库的环境
default: 默认链接的数据库
id: 指定数据库连接的编号
-->
<environments default="development">
<environment id="development">
<!--事务管理器 控制事务 JDBC -->
<transactionManager type="JDBC"/>
<!--指定数据源 POOLED 池化-->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/top_news?serverTimezone=UTC&rewriteBatchedStatements=true&characterEncoding=utf-8"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</dataSource>
</environment>
</environments>
<!--引入映射文件-->
<mappers>
<mapper resource="mappers/UserMapper.xml"/>
</mappers>
</configuration>
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<User> 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);
}
<select id="getUserById" resultType="com.atguigu.mybatis.pojo.User">
select id,name,age,sex from user
</select>