什么是Mybatis
- Apahce的⼀个开源项⽬
- ⼀款优秀的持久层框架,它⽀持⾃定义 SQL、存储过程以及⾼级映射
- 免除了⼏乎所有的 JDBC 代码以及设置参数和获取结果集的⼯作
- 通过简单的 XML 或注解来配置和映射 Java对象 到 数据库中的记录
- 官⽅地址:mybatis.org/mybatis-3/
Mybatis的核心流程
- 每个基于 MyBatis 的应⽤都是以⼀个 SqlSessionFactory 的实例为核⼼
- SqlSessionFactory 的实例可以通过 SqlSessionFactoryBuilder 获得
- SqlSessionFactoryBuilder 可以从 XML 配置⽂件或⼀个预先配置的 Configuration 实例来构建出 SqlSessionFactory 实例
- ⼯⼚设计模式⾥⾯ 需要获取SqlSession ,⾥⾯提供了在数据库执⾏ SQL 命令所需的所有⽅法
环境搭建
导入依赖
<dependencies>
<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.4</version>
</dependency>
<!-- 使⽤JDBC链接mysql的驱动-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.19</version>
</dependency>
</dependencies>
接下来就是重点,需要在resources里面新建一个xml文件,配置mybatis的设置以及mapper映射 配置config
<?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="development">
<environment id="development">
<transactionManager type="JDBC"></transactionManager>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://127.0.0.1:3306/xdclass?serverTimezone=GMT&useUnicode=true&characterEncoding=utf-8&useSSL=false"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="mapper/VideoMapper.xml"></mapper>
</mappers>
</configuration>
测试查询
配置mapper
<?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">
<!--
namespace:名称空间,一般需要保持全局唯一,最好是和dao层的java接口一致
可以映射sql语句到对应的方法名称和参数,返回类型
mybatis使用接口动态代理
-->
<mapper namespace="cn.junko.dao.VideoMapper">
<!--
resultType:sql查询结果集的封装
-->
<select id="selectById" resultType="cn.junko.domain.Video">
select * from video where id=#{id}
</select>
</mapper>
编写实体类与mapper接口
//实体类
public class Video {
private Integer id;
private String title;
private String summary;
private String coverImg;
private Integer price;
private Date createTime;
private Integer cid;
private Double point;
//setter getter toString
//接口
public interface VideoMapper {
//为了规范,一般会用@Param起别名,否则容易报错找不到参数
Video selectById(@Param("id") int id);
}
编写实现类
public class sqlTest {
@Test
public void begin() throws IOException {
InputStream resourceAsStream = Resources.getResourceAsStream("config/mybatis-config.xml");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
SqlSession sqlSession = sqlSessionFactory.openSession();
VideoMapper videoMapper = sqlSession.getMapper(VideoMapper.class);
Video video = videoMapper.selectById(31);
System.out.println(video);
}
这里createTime=null, cid=null
是由于实体类的驼峰命名与数据库的下划线命名不对应,因此没有将数据成功封装上去 例如实体类的是createImg,而数据库的为create_img
在运行的过程中,我这里报了一个错误
因为安装mysql的时候时区设置的不正确 mysql默认的是美国的时区,而我们中国大陆要比他们迟8小时,采用+8:00格式 You must configure either the server or JDBC driver (via the 'serverTimezone' configuration property) to use a more specifc time zone value if you want to utilize time zone support.
这是由于数据库和系统时区差异所造成的,在jdbc连接的url后面加上serverTimezone=GMT即可解决问题,如果需要使用gmt+8时区,需要写成GMT%2B8,否则会被解析为空。再一个解决办法就是使用低版本的MySQL jdbc驱动,5.1.28不会存在时区的问题。
使用注解测试
实现类方法不变,直接调用一样可以获得数据,这样的写法简化了xml的配置操作,在进行简单的查询操作使用注解十分便捷