Mybatis基础-01
1.Mybatis第一个程序
- 引入依赖
<dependencies>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.25</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.7</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.1</version>
<scope>test</scope>
</dependency>
</dependencies>
- 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>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/springboot"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</dataSource>
</environment>
</environments>
<!-- mapper的位置 -->
<mappers>
<mapper resource="mapper/UserMapper.xml"/>
</mappers>
</configuration>
- 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和dao接口对应 -->
<mapper namespace="com.my.mybatis.dao.UserDao">
<select id="selectAll" resultType="com.my.mybatis.pojo.User">
select * from tb_user
</select>
</mapper>
- SQL
DROP TABLE IF EXISTS `tb_user`;
CREATE TABLE `tb_user` (
`id` int NOT NULL AUTO_INCREMENT,
`name` varchar(255) NOT NULL,
`age` int NOT NULL,
`class_id` int DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8mb3;
-- ----------------------------
-- Records of tb_user
-- ----------------------------
INSERT INTO `tb_user` VALUES (‘1‘, ‘tom‘, ‘20‘, ‘2‘);
INSERT INTO `tb_user` VALUES (‘2‘, ‘bob‘, ‘30‘, ‘2‘);
INSERT INTO `tb_user` VALUES (‘3‘, ‘alice‘, ‘40‘, ‘4‘);
INSERT INTO `tb_user` VALUES (‘4‘, ‘sir‘, ‘50‘, ‘4‘);
INSERT INTO `tb_user` VALUES (‘5‘, ‘one‘, ‘19‘, ‘5‘);
INSERT INTO `tb_user` VALUES (‘6‘, ‘two‘, ‘20‘, ‘6‘);
INSERT INTO `tb_user` VALUES (‘7‘, ‘three‘, ‘30‘, ‘7‘);
INSERT INTO `tb_user` VALUES (‘8‘, ‘z‘, ‘10‘, ‘8‘);
- 启动程序。
public class User {
private Integer id;
private String name;
private Integer age;
}
public interface UserDao {
List<User> selectAll();
}
public class MybatisTest {
@Test
public void test01() {
// 加载mybatis配置文件
String resource = "mybatis-config.xml";
InputStream inputStream = null;
try {
inputStream = Resources.getResourceAsStream(resource);
} catch (IOException e) {
e.printStackTrace();
}
//创建SqlSessionFactory对象
SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(inputStream);
SqlSession sqlSession = null;
try {
sqlSession = sqlSessionFactory.openSession();
UserDao userDao = sqlSession.getMapper(UserDao.class);
List<User> users = userDao.selectAll();
users.forEach(System.out::println);
}catch (SqlSessionException e) {
e.printStackTrace();
}finally {
if (sqlSession != null) {
sqlSession.close();
}
}
}
}
2.Mybatis多环境配置
<!-- 多个环境时,使用default定义要使用的 environment 的id -->
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/springboot"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</dataSource>
</environment>
<environment id="test">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/springboot"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</dataSource>
</environment>
</environments>
3.Mybatis两种事务管理器
- JDBC。这个配置直接使用了 JDBC 的提交和回滚设施,它依赖从数据源获得的连接来管理事务作用域。
- MANAGED。这个配置几乎没做什么。它从不提交或回滚一个连接,而是让容器来管理事务的整个生命周期(比如 JEE 应用服务器的上下文)。 默认情况下它会关闭连接。然而一些容器并不希望连接被关闭,因此需要将 closeConnection 属性设置为 false 来阻止默认的关闭行为。
4.Mybatis数据源
- mybatis有三种内建的数据源类型
type="[UNPOOLED|POOLED|JNDI]"
。POOLED
的实现类似数据库的连接池。
5.properties属性
driver=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/springboot
username=root
password=123456
<configuration>
<!-- 引入properties文件 -->
<properties resource="db.properties" />
<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}"/>
<property name="password" value="${password}"/>
</dataSource>
</environment>
</environments>
</configuration>
6.允许Mybatis使用类的别名
<configuration>
<!-- 别名定义 -->
<typeAliases>
<!-- 对一个类起别名 -->
<typeAlias type="com.my.mybatis.pojo.User" alias="user" />
<!-- 对该包下所有的类起别名,别名为类名的首字母小写。如,User为User或user,建议使用user。
@Alias("user")可以修改类别名,@Alias("user")只在使用package配置别名时有效。-->
<package name="com.my.mybatis.pojo" />
</typeAliases>
</configuration>
7.mapper映射
<configuration>
<!-- 告诉mybatis mapper 文件的位置 -->
<mappers>
<mapper resource="mapper/UserDao.xml"/>
<!-- 该用法mapper时mapper文件必须和对应到dao接口在相同的路径,并且和dao接口名相同,
同时只能配置一个mapper和dao的对应关系。-->
<mapper class="com.my.mybatis.dao.UserDao"/>
<!-- 使用package时mapper文件必须和对应到dao接口在相同的路径,切和dao接口名相同 -->
<package name="com.my.mybatis.dao"/>
</mappers>
</configuration>
8.Mybatis三大对象的生命周期和作用域
-
SqlSessionFactoryBuilder
一旦创建了SqlSessionFactory
,就不再需要它了。 因此SqlSessionFactoryBuilder
实例的最佳作用域是方法作用域(也就是局部方法变量)。 -
SqlSessionFactory
一旦被创建就应该在应用的运行期间一直存在。 使用SqlSessionFactory
的最佳实践是在应用运行期间不要重复创建多次。因此SqlSessionFactory
的最佳作用域是应用作用域。
有很多方法可以做到,最简单的就是使用单例模式或者静态单例模式。 -
SqlSession
。如果将SqlSessionFactory
比作数据库连接池,那么SqlSession
相当于数据库连接池中的线程。每个线程都应该有它自己的SqlSession
实例。SqlSession
的实例不是线程安全的,因此是不能被共享的,所以它的最佳的作用域是请求或方法作用域。
9.ResultMap
<mapper namespace="com.my.mybatis.dao.UserDao">
<!-- 使用resultMap进行结果接映射。可以只映射类属性和表列名不同的字段 -->
<resultMap id="User" type="com.my.mybatis.pojo.User">
<result property="id" column="id" />
<result property="name" column="name" />
<result property="age" column="age" />
</resultMap>
<select id="selectAll" resultMap="User">
select * from tb_user
</select>
</mapper>
10.Mybatis日志框架
- 标准日志框架
STDOUT_LOGGING
<configuration>
<settings>
<!-- 标准日志框架,org.apache.ibatis.logging.stdout.StdOutImpl‘,
引入后可以直接使用。-->
<setting name="logImpl" value="STDOUT_LOGGING"/>
</settings>>
</configuration>
-
log4j
的使用- 引入依赖
<dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.17</version> </dependency>
- 导入
log4j.properties
配置
### 配置根 ### log4j.rootLogger = debug,console,file ### 配置输出到控制台 ### log4j.appender.console = org.apache.log4j.ConsoleAppender log4j.appender.console.Target = System.out log4j.appender.console.Threshold = debug log4j.appender.console.layout = org.apache.log4j.PatternLayout log4j.appender.console.layout.ConversionPattern = [%c]-%m%n # 文件输出相关设置 log4j.appender.file = org.apache.log4j.RollingFileAppender # 将日志输出到当前工程中 log4j.appender.file.File = ./log/mybatis.log log4j.appender.file.MaxFileSize = 10MB log4j.appender.file.Threshold = debug log4j.appender.file.layout = org.apache.log4j.PatternLayout log4j.appender.file.layout.ConversionPattern = [%p][%d{yy-MM-dd}][%c]%m%n #日志级别 log4j.logger.org.mybatis = debug log4j.logger.java.sql = debug log4j.logger.java.sql.Statement = debug log4j.logger.java.sql.ResultSet = debug log4j.logger.java.sql.PreparedStatement = debug
-
mybatis-config.xml
中开启日志处理
<configuration> <settings> <!-- log4j --> <setting name="logImpl" value="LOG4J"/> </settings> </configuration>
11.分页
-
limit 0,2 从第一个数据开始,取两行数据,即第
1和2行
的数据。 -
一般传入前段传入
pageNum(第几页)和pageSize(每页大小)
。 -
转换为limit的算法。
limit (pageNum-1)*pageSize, pageSize
。这是简单的计算过程,实际情况需要考虑数据的边界问题。