MyBatis入门
一、概述
MyBaits是支持定制化SQL、存储过程以及高级映射的优秀的持久层框架;
jdbc缺陷:存在大量的硬编码灵活性低,大量的无关业务的处理编码,如连接和关闭数据库的操作,扩展优化不便;
优点:
1、避免传统JDBC硬编码,执行高效,是JDBC的延伸 2、使用XML将SQL与程序解耦,便于维护
3、POJO对象和数据库记录直接映射 4、完善的文档支持
应用场景:1.更加关注SQL优化的项目;2.需求频繁改动的项目
二、框架概念
框架是一种规则,保证开发者遵循相同的方式开发程序,框架提倡”不要重复造轮子”,对基础功能进行封装,极大提高了开发效率,统一的编码规则,利于团队管理和维护。
SSM开发框架:
- Spring:对象容器框架,对各个对象有效管理,底层框架;
- Spring MVC:替代Servlet,帮助我们更好的在web层面进行开发;
- MyBaties:简化数据库的交互,底层把JDBC进行了封装;
三、MyBatis开发流程
新建数据库连接时,注意加上时区测试
useUnicode=true&characterEncoding=UTF-8&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC
比如连接icake数据库的URL
jdbc:mysql://localhost:3306/icake?useUnicode=true&characterEncoding=UTF-8&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC
-
引入MyBatis依赖,利用maven进行管理
pom.xml中加入阿里云的仓库连接,下载依赖包更稳更快
<repositories>
<repository>
<id>aliyun</id>
<name>aliyun</name>
<url>https://maven.aliyun.com/repository/public</url>
</repository>
</repositories>
-
创建核心配置文件,使用xml文件配置。
比如:配置mybatis-config.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>
<settings>
<!-- goods_id ==> goodsId 驼峰命名转换 -->
<setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>
<environments default="dev">
<environment id="dev">
<transactionManager type="JDBC"></transactionManager>
...
-
创建实体(Entity)类,设置属性,生成get、set方法
public class Goods {
private Integer goodsId;//商品编号
private String title;//标题
...
public Integer getGoodsId() {
return goodsId;
}
...
}
-
创建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用来区分不同的sql语句-->
<!-- resultType结果类型时Goods对象,每一条记录都被包装成Goods对象-->
<mapper namespace="goods">
<select id="selectAll" resultType="com.imooc.mybatis.entity.Goods" >
select * from t_goods order by goods_id desc limit 10
</select>
...
</mapper>
-
初始化SessionFactory,会话工厂。读取配置文件。比如读取mybatis-config.xml
//初始化工具类MyBatisUtils,在工具类中配置,保证SqlSessionFactory在应用中全局唯一
public class MyBatisUtils {
//利用static(静态)属于类不属于对象,且全局唯一
private static SqlSessionFactory sqlSessionFactory = null;
//利用静态块在初始化类时实例化sqlSessionFactory
static {
Reader reader = null;
try {
reader = Resources.getResourceAsReader("mybatis-config.xml");
sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
...
public static SqlSession openSession(){
//默认SqlSession对自动提交事务数据(commit),设置false代表关闭自动提交,改为手动提交事务数据
return sqlSessionFactory.openSession(false);
}
-
利用SqlSession对象操作数据,增,删,改,查。
//新建测试类MyBatisTestor,创建testSelectAll方法,编写java代码对数据库进行操作
public void testSelectAll() throws Exception {
SqlSession session = null;
try{
session = MyBatisUtils.openSession();
//goods.selectAll定位sql语句,返回的是一堆Goods对象,用list集合来存放
//session.selectList返回多条数据,session.selectOne()方法返回一条数据
List<Goods> list = session.selectList("goods.selectAll");
//for循环,getTitle()方法,输出对应表的标题
for(Goods g : list){
System.out.println(g.getTitle());
}
}catch (Exception e){
throw e;
}finally {
MyBatisUtils.closeSession(session);
}
}
四、环境配置
mybatis-config.xml文件
MyBatis采用XML格式配置数据库环境信息,MyBaits环境配置标签,environment包含数据库驱动、URL、用户名与密码,,。idea内置了连接数据库的方法。
例子:<!--配置环境,不同的环境不同的id名字-->
<environment id="dev">
<!--采用JDBC方式对数据库事务进行commit/rollback-->
<transactionManager type="JDBC"></transactionManager>
<!--采用连接池方式管理数据库连接-->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/db"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
五、MyBatis的核心对象
SqlSessionFactory
SqlSessionFactory是MyBatis的核心对象,用于加载配置文件,初始化MyBatis框架,创建SqlSession对象,保证SqlSessionFactory在应用中全局唯一
SqlSession
SqlSession是MyBatis操作数据库的核心对象,SqlSession使用JDBC方式与数据库交互,SqlSession对象提供了数据表CRUD对应方法,CURD是创建(Create)、更新(Update)、读取(Retrieve)和删除(Delete)操作。
初始化工具类MyBatisUtils,在工具类中配置,保证SqlSessionFactory在应用中全局唯一
/**
* MyBatisUtils工具类,创建全局唯一的SqlSessionFactory对象
*/
public class MyBatisUtils {
//利用static(静态)属于类不属于对象,且全局唯一
private static SqlSessionFactory sqlSessionFactory = null;
//利用静态块在初始化类时实例化sqlSessionFactory
static {
Reader reader = null;
try {
reader = Resources.getResourceAsReader("mybatis-config.xml");
sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
} catch (IOException e) {
e.printStackTrace();
throw new ExceptionInInitializerError(e);
//初始化错误时,通过抛出异常ExceptionInInitializerError通知调用者
}
}
/**
* openSession 创建一个新的SqlSession对象
* @return SqlSession对象
*/
public static SqlSession openSession(){
//默认SqlSession对自动提交事务数据(commit)
//设置false代表关闭自动提交,改为手动提交事务数据
return sqlSessionFactory.openSession(false);
}
/**
* 释放一个有效的SqlSession对象
* @param session 准备释放SqlSession对象
*/
public static void closeSession(SqlSession session){
if (session != null) {
session.close();
}
}
}
六、MyBatis数据查询
数据查询步骤
-
创建实体类(Entity),类中的属性是根据数据表的字段创建的
-
创建Mapper XML
作用:说明创建的类中的属性和数据库中表的对应关系,说明了对象和表之间的映射关系。mapper文件中存放了要执行的sql语句
注意:xml文件最上面,加上xml声明和mybatis的dtd声明,dtd是约束文件,在dtd中定义对xml文件的约束,这样可以保证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">
- 要在mybatis-config.xml文件中声明mapper
<mappers>
<mapper resource="mappers/goods.xml"/>
</mappers>
- 编写