文章目录
1.mybatis概述
2.mybatis快速入门
1.需求:查询User表中所有数据
2.步骤:
(1)创建user表,添加数据
(2)创建模块,导入坐标
(3)编写mybatis核心配置文件----->替换连接信息,解决编码问题
(4)编写sql映射文件---->统一管理sql语句,解决硬编码问题
(5)编码
①定义POJO类
②加载核心配置文件,获取sqlsessionfactory对象
③获取sqlsession对象,执行sql语句
④释放资源
2.1创建maven工程
2.1.1打包方式:jar
2.1.2引入依赖
<dependencies>
<!--mybatis核心配置文件-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.7</version>
</dependency>
<!--mysql驱动-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.3</version>
</dependency>
<!--测试类-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
</dependencies>
2.2创建mybatis的核心配置文件
习惯命名为mybatis-config.xml,这个命名仅仅是建议,将来整合spring之后,这个配置文件可以省略,所以大家操作时可以直接复制,粘贴。
核心配置文件主要用于配置连接数据库的环境及Mybatis的全局配置。
核心配置文件放在src/main/resource目录下
<configuration>
<!-- 1.设置数据库文件-->
<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://localhost:3306/mybatis"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</dataSource>
</environment>
</environments>
<!-- 2.引入映射文件-->
<mappers>
<mapper resource="mappers/UserMapper.xml" />
</mappers>
</configuration>
2.3创建mapper接口
mybatis中的mapper接口相当于一档的到,但是区别在于mapper仅仅是接口,不需要提供实现类
public interface UserMapper {
//1.添加用户信息
int insertUser();
}
2.4创建mybatis的映射文件
2.4.1相关概念
ORM(Object Relationship Mapping)对象映射。
对象:代表Java的实体类对象
关系:关系型数据库
映射:二者之间的关系
JAVA概念 | 数据库概念 |
---|---|
类 | 表 |
属性 | 字段/列 |
对象 | 记录/行 |
1.映射文件的命名规则
表所对应的实体类名+Mapper.xml
例如:t_user,映射的实体类为User,所对应的映射文件为UserMapper.xml,因此一个映射文件对应一个实体类,对应一张表的操作,Mybatis映射文件用户编写sql,访问以及操作表中的数据。
2.mybatis中可以面向接口操作数据库,要保证两个一致
①mapper接口的全类名和映射文件的命名空间(namespace)保持一致
②mapper接口中方法的方法名和映射文件中便携的Sql的标签id数学保持一致。
<?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>
<insert id="insertUser" >
insert into t_user values (null,'xiaoming','123',23,'woman');
</insert>
</mapper>
2.5测试
3.mybatis核心配置文件
3.1初识核心配置文件
<?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>
<!--导入外部配置文件-->
<properties resource="db.properties"/>
<!--可以给实体类起别名-->
<typeAliases>
<package name="com.gs.pojo"/>
</typeAliases>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
</dataSource>
</environment>
</environments>
<mappers>
<!-- <mapper resource="com/com.com.gs/dao/UserMapper.xml"/>-->
<!--<mapper class="com.com.com.gs.dao.UserMapper"/>-->
<package name="com.gs.dao"/>
</mappers>
</configuration>
1.我们可以从例子中发现configuration的标签中是enviroments,我们不妨推断Mybatis可以配置多套环境。注意点:尽管可以配置多个环境,但每个SqlSessionFactory实例只能选择一种环境。
2.接着观察transactionManager标签,这是配置我们的事务处理器,Mybatis默认使用的是JDBC,而dataSource表示我们使用的数据源,默认类型为 POOLED
3.2细究各个配置
3.2.1属性(properties)
作用:我们可以通过properties属性来实现音容配置文件,这些属性可以在外部进行设置,并可以进行动态替换,也就是说我们进行properties有两种方式,一种是外部引入,另一种是嵌套使用,更推荐使用外部数据源引入
(1)方式一:嵌套使用
<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://localhost:3306/mybatis"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</dataSource>
</environment>
</environments>
(2)方式二:引入外部数据源
①在resource目录下编写一个配置文件db.properties
db.driver = com.mysql.jdbc.Driver
db.url= jdbc:mysql://localhost:3306/mybatis
db.username = root
db.password =123456
②在mybatis-config.xml配置文件中引入数据源
<!-- properties属性来实现引用配置文件-->
<properties resource="db.properties"/>
<!-- 设置数据库文件-->
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${db.driver}"/>
<property name="url" value="${db.url}"/>
<property name="username" value="${db.username}"/>
<property name="password" value="${db.password}"/>
</dataSource>
</environment>
</environments>
3.2.2类型别名(typeAliases)
若我们没有配置该属性,编写xml文件的实体类时要使用全类名
例如: resultType=“com.tz.bean.User”>
<select id="getUserList" resultType="com.tz.bean.User">
select * from t_user;
</select>
为了简化上面的写法,我们可以在核心配置文件中进行别名的是设置,
(1)方式1:直接在mybatis-config.xml中进行相关实体类的全类名胚子
<!--可以给实体类起别名-->
<typeAliases>
<typeAlias type="com.tz.bean.User" alias="User"/>
</typeAliases>
在相应的Mapper.xml文件中引用
<select id="getUserList" resultType="User">
select * from t_user;
</select>
(2)方式2:我们也可以只指定一个包名,MyBatis会在包名下面搜索需要的JavaBen(扫描是实体类的包中,这个类的别名,引用时推荐使用首字母小写,不过没有强制要求)
<!-- 给实体类起别名-->
<typeAliases>
<package name="com.tz.bean"/>
</typeAliases>
在相应的Mapper.xml文件中引用
<!-- resultType="user" -->
<select id="getUserList" resultType="user">
select * from t_user;
</select>
使用场景:
1.在实体类比较少时,建议使用第一种
2.如果实体类比较多,建议使用第二种
3.第一种可以DIY别名,第二种则不行; 如果非要修改,需要在实体类上增加注解
@Alias("user") public class User {}
3.2.3设置(settings)
这是Mybatis中极为重要的调整设置,它们会改变Mybatis的运行时行为,官方中的配置项解释的十分清楚,可以进行相关查阅:https://mybatis.net.cn/configuration.html#environments
这里介绍两种开发中经常使用的设置
(1)驼峰命名(mapUnderscoreToCamelCase),用来解决我们实体类中属性名与数据库中的列名不一致问题
例如:数据库名字为user_id,实体类名字为userId,这时候我们需要配置该项,否则取不到值
(2)配置日志工厂logImpl,这里方便我们查看输出日志排查错误,可以理解成我们平常使用的System.out;
下面使用的值为STDOUT_LOGGING则为我们标准的日志输出,比较常用的还有Log4j;
<setting name="logImpl" value="STDOUT_LOGGING"/>
3.2.4映射器(mappers)
(1)使用类路径的资源引用(在mybatis-config.xml核心配置文件中配置)(推荐)
<mappers>
<mapper resource="com/tz/dao/UserMapper.xml"/>
</mappers>
这种方式对类名和Mapper.xml文件的位置没有任何限制
(2)使用class文件绑定注册(在mybatis-config.xml核心配置文件中配置)
<!-- 使用映射器接口实现类的完全限定类名 -->
<mappers>
<mapper class="com.tz.dao.UserMapper"/>
</mappers>
注意:
①接口和他的Mapper配置文件必须同名
②接口和他的Mapper配置文件必须在同一个包下
(3)使用扫描包进行注入绑定(在mybatis-config.xml核心配置文件中配置)
<mappers>
<package name="com.tz.dao"/>
</mappers>
注意:
①接口和他的Mapper配置文件必须同名
②接口和他的Mapper配置文件必须在同一个包下
这三种方式各有各的优势,使用上也没有所谓的优劣之分,只不过第一种对我们配置文件的命名和它所放的位置没有特殊限定,相对比较灵活。
3.2.5生命周期和作用域
不同作用域和生命周期类别是至关重要,因此错误的使用会导致非常严重的并发问题,下面以一张图简单描述一下我们mybatis开发的流程
记住这里的每一个mapper就对应我们编写的一个具体接口,即我们具体业务
这里我们创建Mybatis相关对象的工具类
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import java.io.IOException;
import java.io.InputStream;
public class MybatisUtil {
private static SqlSessionFactory sqlSessionFactory;
static {
try {
String resource = "mybatis-config";
InputStream resourceAsStream = Resources.getResourceAsStream(resource);
SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
sqlSessionFactory = sqlSessionFactoryBuilder.build(resourceAsStream);
} catch (IOException e) {
e.printStackTrace();
}
}
public static SqlSession getSqlSession(){
return sqlSessionFactory.openSession(true);
}
}
解析:
①SqlSessionFactoryBuilder:
一旦创建了SqlSessionFactory,就不再需要Builder这个对象了,所以我们可以把它设置为局部变量或使用静态代码块(也就是我们只需实例化出一个SqlSessionFactoryBuilder:对象)
如上面所写的
private static SqlSessionFactory sqlSessionFactory;
static {
try {
String resource = "mybatis-config.xml";
InputStream resourceAsStream = Resources.getResourceAsStream(resource);
SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
sqlSessionFactory = sqlSessionFactoryBuilder.build(resourceAsStream);
} catch (IOException e) {
e.printStackTrace();
}
}
②SqlSessionFactory
可以通俗理解为我们的数据库连接池
SqlSessionFactory一旦创建就应该在运行期间一直存在,没有任何理由丢弃它或者重新创建另一个实例
SqlSessionFactory的最佳作用域是应用层上的,这种实现可以通过使用单例或静态单例模式
③SqlSession
相当于连接池的一个请求
SqlSession的实例不是线程安全的,因此不能被共享,所以最佳作用与是请求或方法作用域
用完知乎需要关闭,否则资源会被占用
4.mybatis增删改查
后续更新
5.动态sql
qlSessionFactoryBuilder.build(resourceAsStream);
} catch (IOException e) {
e.printStackTrace();
}
}
②SqlSessionFactory
> 可以通俗理解为我们的数据库连接池
>
> SqlSessionFactory一旦创建就应该在运行期间一直存在,没有任何理由丢弃它或者重新创建另一个实例
>
> SqlSessionFactory的最佳作用域是应用层上的,这种实现可以通过使用单例或静态单例模式
③SqlSession
> 相当于连接池的一个请求
>
> SqlSession的实例不是线程安全的,因此不能被共享,所以最佳作用与是请求或方法作用域
>
> 用完知乎需要关闭,否则资源会被占用
# 4.mybatis增删改查
后续更新
# 5.动态sql
后续更新