前言
每次打开学习视频看的时候,总想着以后都要整理起来记录一下,但是总是有一些大大小小的原因(好吧,只有懒)导致这个美好的梦想破灭了,哈哈,不知道今天是什么样的心情趋势我打开了它并且写下了这段话,但是希望真的能坚持下去吧。在开始写之前想到过文章内容会不会太简单,平台里的大佬太多了,我时常感觉自己像是还未入门的小喽啰,不过发布这些文章其实只是为了记录自己的成长,想到这里我也觉得无所谓了,知识太浅,希望大家多多指教~
提示:本篇文章介绍了关于MyBatis入门的一些内容,以下是本篇文章正文内容
一、MyBatis的简介
1. 原始JDBC存在的问题:
- 数据库频繁创建连接、释放连接,造成资源浪费,从而影响系统性能。
- Sql语句在代码中硬编码,代码不宜维护,而在实际开发中sql语句变化的可能性较大。
- 查询操作时,需要手动将结果进行封装。插入操作时,需要将实体数据手动设置到占位符位置。
2. 解决方案:
- 使用数据库连接池初始化连接资源
- 将Sql语句提取到xml配置文件中
- 使用反射、内省等底层技术,将实体属性与表字段自动映射
3. 什么是MyBatis?
以上所描述的问题,我们都可以使用MyBatis来解决
MyBatis是基于java的持久层框架,其特点如下:
- 内部封装了JDBC,
- 隐藏了JDBC繁杂的API
- 开发者只需要专注于sql语句即可
- 通过XML或注解的方式配置
- 采用orm自动思想解决实体与数据库映射的问题
我们可以通过官网了解更多内容:
mybatis 官网: http://www.mybatis.org/mybatis-3.
二、开发步骤
一、 添加MyBatis坐标
1、导入mysql数据库驱动
代码如下(示例):
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>版本号</version>
</dependency>
2、导入MyBatis坐标
代码如下(示例):
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>版本号</version>
</dependency>
二、创建数据库表
三、编写实体类
四、映射文件Mapper.xml
1、mapping文件约束头:
<?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">
2、namespace:
命名空间,给当前mapper命名,与下边语句的id一起组成查询的标识,即调用mapper方法时直接使用 " 命名空间名称.方法名 " 调用
<mapper namespace="名称">
3、< mapper >配置
命名空间,给当前mapper命名,与下边语句的id一起组成查询的标识,即调用mapper方法时直接使用 " 命名空间名称.方法名 " 调用
<mapper>
<select id="命名" resultType="查询结果对应的实体类型">
要执行的sql语句
</select>//执行其他操作时需要切换相应的标签,如insert、update、delete
</mapper>
五、核心文件MapConfig.xml
1、MyBatis核心文件约束头:
命名空间,给当前mapper命名,与下边语句的id一起组成查询的标识,即调用mapper方法时直接使用 " 命名空间名称.方法名 " 调用
<?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">
2、Mybatis核心文件配置
命名空间,给当前mapper命名,与下边语句的id一起组成查询的标识,即调用mapper方法时直接使用 " 命名空间名称.方法名 " 调用
<configuration>
//数据源环境
<!--default="development":指定默认的环境名称-->
<environments default="development">
<!--id="development":指定当前环境名称-->
<environment id="development">
<transactionManager type="JDBC"/>//事务管理器
<!--type="POOLED":指定当前数据源类型是连接池-->
<dataSource type="POOLED">//数据源
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/test"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
//加载映射文件
<mappers>
<mapper resource="mapper配置文件位置"></mapper>
</mappers>
</configuration>
六、测试类
//加载核心配置文件
InputStream resourceAsStream = Resources.getResourceAsStream("核心配置文件.xml");
//获得sqlSession工厂对象
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
//获得sqlSession对象
SqlSession sqlSession = sqlSessionFactory.openSession();
//执行sql语句
//param("namespace+id")
List<User> userList = sqlSession.selectList("namespace.id");//查询
sqlSession.id名("namespace.id",实体对象)//增改
sqlSession.delete("namespace.id",Object)//删除
//打印结果
System.out.println(userList);
//释放资源
sqlSession.close();
三、MyBatis的增删改查
1、查询操作
List<User> userList = sqlSession.selectList("userMapper.findAll");
sql语句
<select id="findAll" parameterType="要查询的数据的类型" resultType="BsHolidaySetUpResult">
select * from User
</select>
2、新增操作
sqlSession.insert("userMapper.add", user);
sql语句
<!--在进行新增操作时,values中的值为parameterType类中的属性名-->
<insert id="insert" parameterType="要插入的数据的类型">
insert into user values(#{id},#{username},#{password},#{实体属性名})
</insert>
3、删除操作
sqlSession.delete("userMapper.delete",3);
sql语句
<!--依据某一字段删除数据,parameterType为该字段类型-->
<!--在传递单个参数时,可以使用#{任意字符串}的方式-->
<delete id="delete" parameterType="java.long.Integer">
delete from user where id=#{任意字符串}
</delete>
4、修改操作
sqlSession.update("userMapper.update", user);
sql语句
<update id="update" parameterType="要修改的数据的类型">
update user set username=#{username},password=#{password} where id=#{id}
</update>
<!--mybatis在执行更新操作时,需要手动的进行提交事务,即在执行增删查的操作时,要提交事务来实现对应操作-->
sqlSession.commit();
四、MyBatis的核心配置文件
一、层级关系
- configuration 配置
- properties 属性
- settings 设置
- typeAllases 类型别名
- typeHandlers 类型处理器
- objectFactory 对象工厂
- plugins 插件
- environments 环境
- environment 环境变量
- transactionManager 事务管理器
- dataSource 数据源
- environment 环境变量
- databaseidProvider 数据库厂商标识
- mappers 映射器
二、测试类常用配置解析
1、environments标签
该标签主要用于数据源环境的配置
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</dataSource>
</environment>
</environments>
事务管理器(transactionManager)的类型有两种:
- JDBC直接使用了JDBC的提交和回滚设置,依赖于connection连接来管理事务作用域
- MANAGED使用容器来管理事务的整个生命周期。默认情况下会关闭Connection连接,需要将closeConnection属性设置为false来阻止关闭行为。
数据源(dataSource)类型有三种:
- UNPOOLED:这个数据源的实现只是每次被请求是打开和关闭连接
- POOLED:这种数据源的实现利用”池“的概念将JDBC连接对象组织起来。
- JNDI:这个数据源的实现是为了能在如EJB或应用服务器这类容器中使用,容器可以集中或在外部配置数据源,然后放置一个JNDI上下文的引用。
2、mappers标签
该标签的作用是加载映射的,加载方式有如下几种:
- 使用相对于类路径的资源引用
<mapper resource="org/mybatis/builder/AuthorMapper.xml"/>
- 使用完全限定资源定位符(url)
<mapper url="file:///var/mappers/AuthorMapper.xml"/>
- 使用映射器接口实现类的完全限定类名
<mapper class="org.mybatis.builder.AuthorMapper"/>
- 将包内的映射器接口实现全部注册为映射器
<package name="org.mybatis.builder"/>
3、properties标签
该标签可以加载额外配置的properties文件
<properties resourse="jdbc.properties"></properties>
3、typeAliases标签
该标签用于自定义别名
<typeAliases>
<typeAlias type="原名" alias="别名"/>
</typeAliases>
mybatis框架设置好的常用的类型的别名
数据类型 | 别名 |
---|---|
String | string |
Long | long |
Integer | int |
Double | double |
Boolean | boolean |
四、MyBatis的相应API
一、SqlSessionFactoryBuilder
常用API:SqlSessionFactory.build(InputStream inputStream)
通过加载mybatis的核心文件的输入流的形式构建一个SqlSessionFactory对象
String resource = "org/mybatis/builder/mybatis-config.xml";
InputStream inputStream = ResourceAsStream(resource);
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
SqlSessionFactory factory = builder.build(inputStream);
其中,Resources工具类,这个类在org.apache.ibatis.io包中。Resources类帮助你从类路径下、文件系统或一个web URL中加载资源文件。
SqlSessionFactory有多个方法创建SqlSession实例。常用的有以下两个:
方法 | 解释 |
---|---|
openSession() | 会默认开启一个事务,但事务不会自动提交,也就意味着需要手动提交该事务,更新操作数据才会持久化到数据库中 |
openSession(boolean autoCommit) | 参数为是否自动提交,如果设置为true,则不需要手动提交事务 |
二、SqlSession会话对象
SqlSession实例在MyBatis中是非常强大的一个类。包括所有的执行语句、提交或回滚事务和获取映射器实例的方法。
执行语句的方法主要有:
<T> T selectOne(String statement,Object parameter)
<E> List<E> selectList(String statement,Object parameter)
int insert(String statement,Object parameter)
int update(String statement,Object parameter)
int delete(String statement,Object parameter)
操作事务的方法主要有:
void commit()
void rollback()