MyBatis介绍
MyBatis是什么?
MyBatis是一个框架, 对JDBC的基础功能进行了封装. 是Java技术栈里面ORM框架中使用最广泛的一类框架.
为什么要学习MyBatis?
用JDBC操作数据, 步骤繁琐, 代码量大. 业务逻辑越复杂就越繁琐, 不好管理, 一不注意, 就会出现各种bug和异常. 每个人的代码风格不一样, 不利于团队协作
使用MyBatis有哪些好处?
- 操作简单
- 稳定,安全,不易出错
- 统一的开发风格和标准, 利于团队协作
- 让开发人员更容易关注业务, 而不需要关注JDBC的各种细节
- 极大的提高开发效率
技术地位
你只要是在做Java后端方面的工作, 没有不要求会MyBatis的. 这是基本技能, 地位已不可撼动.
如何学习MyBatis
-
第一个MyBatis程序
这里学会使用这个框架的一些准备工作, 包括环境, 初始化, 基本配置等. -
然后学习怎么样利用MyBatis进行基本的增删改查
-
最后学习一些复杂的操作和MyBatis提供的一些特性
缓存, 防注入, 事务处理, 错误处理, 日志等 -
MyBatis提供了注解的方式来方便快速开发,学习各种注解的使用
第一个MyBatis程序
- Maven依赖
<dependencies>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.1</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.47</version>
</dependency>
</dependencies>
- Mybatis配置文件
<?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>
<!--可指定使用那一个数据库配置-->
<enviroments default="dev">
<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/babytun?useUnicode=true$amp;characterEncoding=UTF-8"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
<environment id="prd">
<!-- 采用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/babytun?useUnicode=true$amp;characterEncoding=UTF-8"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
</enviroments>
</configuration>
- 初始化Mybatis
//利用Reader加载classpath下的mybatis-config.xml核心配置文件
Reader reader=Resources.getResourceAsReader("mybatis-config.xml");
//初始化SqlSessionFactory对象,同时解析mybatis-config.xml文件
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder(reader);
SqlSession sqlSession=null;
try{
//创建SqlSession对象, SqlSession是JDBC的扩展类, 用于与数据库交互
sqlSession = sqlSessionFactory.openSession();
Connection connection =sqlSession.getConnection();
}catch(Exception e){
e.printStackTrace();
}finally{
if(sqlSession!=null){
//如果type="POOLED",代表使用连接池,close则是将连接回收到连接池中
//如果type="UNPOOLED",代表直连,close则会调用Connection.close()方法关闭连接
sqlSession.close();
}
}
- 封装一个MyBatisUtils类
public class MyBatisUtils {
private static SqlSessionFactory sqlSessionFactory = null;
static {
try{
Reader reader = Resources.getResourceAsReader("mybatis-config.xml");
sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
}catch(IOException e){
e.printStackTrace();
throw new ExceptionInitializerError(e);
}
}
public static SqlSession openSession(){
return sqlSessionFactory.openSession();
}
public static void closeSession(SqlSession session){
if(session!=null){
session.close();
}
}
}
- 使用Mybatisutils获取SqlSession
SqlSession sqlSession = null ;
try{
sqlSession = MyBatisutils.openSession();
Connection connection = sqlSession.getConnection();
System.out.println(connection);
}catch(Exception e){
throw e;
}finally{
MyBatisUtils.closeSession(sqlSession);
}
写一个简单的查询
- 新建Mapper文件 在Resources/mappers/下创建goods.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="goods">
<select id="selectAll" resultType="com.mybatis.entity.Goods">
select * from t_goods order by goods_id desc limit 10;
</select>
</mapper>
- 在Resources/mybatis-config.xml中的configuration的节点下导入mapper
<mappers>
<mapper resource="mappers/goods.xml"/>
</mappers>
- 创建实体类(Entity)
public class Goods {
private Integer goodsId;
private String title;
private String subTitle;
private Float originalCost;
private Float currentPrice;
private Float discount;
private Integer isFreeDelivery;
private Integer categoryId;
... setter getter
}
- 驼峰命名
在mybatis-config.xml中configuration下加入
<settings>
<!-- 驼峰命名 用变量goodId接收good_id字段 -->
<setting name="mapUnderscoreToCameCase" value="true"/>
</settings>
- 在代码中使用
SqlSession session=null;
try{
session=MyBatisUtils.openSession();
//selectAll在所有文件内唯一,可省略goods
List<Goods> list=session.selectList("goods.selectAll");
}catch(Exception e){
throw e;
}finally{
MyBatisUtils.closeSession(session);
}