1.需求:查询User表中所有数据
2.步骤:
(1)创建user表,添加数据
(2)创建模块,导入坐标
(3)编写mybatis核心配置文件----->替换连接信息,解决编码问题
(4)编写sql映射文件---->统一管理sql语句,解决硬编码问题
(5)编码
①定义POJO类
②加载核心配置文件,获取sqlsessionfactory对象
③获取sqlsession对象,执行sql语句
④释放资源
<dependencies>
<dependency>
<groupId>org.mybatisgroupId>
<artifactId>mybatisartifactId>
<version>3.5.7version>
dependency>
<dependency>
<groupId>mysqlgroupId>
<artifactId>mysql-connector-javaartifactId>
<version>5.1.3version>
dependency>
<dependency>
<groupId>junitgroupId>
<artifactId>junitartifactId>
<version>4.11version>
<scope>testscope>
dependency>
dependencies>
习惯命名为mybatis-config.xml,这个命名仅仅是建议,将来整合spring之后,这个配置文件可以省略,所以大家操作时可以直接复制,粘贴。
核心配置文件主要用于配置连接数据库的环境及Mybatis的全局配置。
核心配置文件放在src/main/resource目录下
<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://localhost:3306/mybatis"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
dataSource>
environment>
environments>
<mappers>
<mapper resource="mappers/UserMapper.xml" />
mappers>
configuration>
mybatis中的mapper接口相当于一档的到,但是区别在于mapper仅仅是接口,不需要提供实现类
public interface UserMapper {
//1.添加用户信息
int insertUser();
}
ORM(Object Relationship Mapping)对象映射。
对象:代表Java的实体类对象
关系:关系型数据库
映射:二者之间的关系
JAVA概念 | 数据库概念 |
---|---|
类 | 表 |
属性 | 字段/列 |
对象 | 记录/行 |
1.映射文件的命名规则
表所对应的实体类名+Mapper.xml
例如:t_user,映射的实体类为User,所对应的映射文件为UserMapper.xml,因此一个映射文件对应一个实体类,对应一张表的操作,Mybatis映射文件用户编写sql,访问以及操作表中的数据。
2.mybatis中可以面向接口操作数据库,要保证两个一致
①mapper接口的全类名和映射文件的命名空间(namespace)保持一致
②mapper接口中方法的方法名和映射文件中便携的Sql的标签id数学保持一致。
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>
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>
<package name="com.gs.dao"/>
mappers>
configuration>
1.我们可以从例子中发现configuration的标签中是enviroments,我们不妨推断Mybatis可以配置多套环境。注意点:尽管可以配置多个环境,但每个SqlSessionFactory实例只能选择一种环境。
2.接着观察transactionManager标签,这是配置我们的事务处理器,Mybatis默认使用的是JDBC,而dataSource表示我们使用的数据源,默认类型为 POOLED
作用:我们可以通过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 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>
若我们没有配置该属性,编写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文件中引用
<select id="getUserList" resultType="user">
select * from t_user;
select>
使用场景:
1.在实体类比较少时,建议使用第一种
2.如果实体类比较多,建议使用第二种
3.第一种可以DIY别名,第二种则不行; 如果非要修改,需要在实体类上增加注解
@Alias("user") public class User {}
这是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"/>
(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配置文件必须在同一个包下
这三种方式各有各的优势,使用上也没有所谓的优劣之分,只不过第一种对我们配置文件的命名和它所放的位置没有特殊限定,相对比较灵活。
不同作用域和生命周期类别是至关重要,因此错误的使用会导致非常严重的并发问题,下面以一张图简单描述一下我们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的实例不是线程安全的,因此不能被共享,所以最佳作用与是请求或方法作用域
用完知乎需要关闭,否则资源会被占用
后续更新
qlSessionFactoryBuilder.build(resourceAsStream);
} catch (IOException e) {
e.printStackTrace();
}
}
②SqlSessionFactory
> 可以通俗理解为我们的数据库连接池
>
> SqlSessionFactory一旦创建就应该在运行期间一直存在,没有任何理由丢弃它或者重新创建另一个实例
>
> SqlSessionFactory的最佳作用域是应用层上的,这种实现可以通过使用单例或静态单例模式
③SqlSession
> 相当于连接池的一个请求
>
> SqlSession的实例不是线程安全的,因此不能被共享,所以最佳作用与是请求或方法作用域
>
> 用完知乎需要关闭,否则资源会被占用
# 4.mybatis增删改查
后续更新
# 5.动态sql
后续更新