mybatis学习笔记01-mybatis入门
聊聊框架
-
什么是框架
软件框架(software framework),通常指的是为了实现某个业界标准或完成特定基本任务的软件组件规范,也指为了实现某个软件组件规范时,提供规范所要求之基础功能的软件产品。 框架的功能类似于基础设施,与具体的软件应用无关,但是提供并实现最为基础的软件架构和体系。软件开发者通常依据特定的框架实现更为复杂的商业运用和业务逻辑。这样的软件应用可以在支持同一种框架的软件系统中运行。 简而言之,框架就是制定一套规范或者规则(思想),大家(程序员)在该规范或者规则(思想)下工作。或者说使用别人搭好的舞台来做编剧和表演。
- 上面的话引用于百度百科, 对于我们来说, 框架就是一个半成品的项目, 它是我们软件开发中的一套解决方案, 不同的框架解决的是不同的问题
-
框架的好处
- 框架封装了很多的细节, 使开发者可以使用极简的方式实现功能, 极大的提高开发效率
-
三层架构(与MVC不同)
- 表现层
- 业务层
- 持久层
-
持久层的技术解决方案
- JDBC技术:
- Connection
- PreparedStatement
- ResultSet
- spring的JdbcTemplate
- spring对JDBC的简单封装
- Apache的DBUtils
- 也是对JDBC的简单封装
- 上面的三个都不是框架
- JDBC是规范
- spring的JdbcTemplate和Apache的DBUtils是工具类
- JDBC技术:
MyBatis
-
mybatis介绍
- mybatis是一个java持久层框架
- 它封装了很多jdbc的细节, 使开发者只需要关注sql本身, 而不用关注注册驱动, 创建连接等过程
- 使用ORM(对象关系映射)来实现结果集的封装
-
mybatis入门
- 环境搭建
-
创建maven工程并导入mybatis坐标
<!-- mysql的驱动依赖 --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.15</version> </dependency> <!-- mybati依赖 --> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.5.3</version> </dependency> <!-- 日志依赖log4j2, 注: log4j2需要有配置文件, 最后展示 --> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-core</artifactId> <version>2.11.1</version> </dependency> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-api</artifactId> <version>2.11.1</version> </dependency>
-
准备数据库, 创建实体类和dao接口
- 以前怎么创建的现在依旧怎么创建
-
创建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> <!-- 引入了外部的配置文件, database.properties中的内容也会在最后展示 --> <properties resource="database.properties"/> <typeAliases> <package name="cn.ann.bean"/> </typeAliases> <!-- 配置环境, default可以是任意值, 但是其包含的子标签 environment 中必须有一个 id 是这个值 --> <environments default="mysql"> <!-- 配置环境 --> <environment id="mysql"> <!-- 配置事务的类型 --> <transactionManager type="JDBC"/> <!-- 配置连接池 --> <dataSource type="POOLED"> <property name="driver" value="${driver-class-name}"/> <property name="url" value="${url}"/> <property name="username" value="${username}"/> <property name="password" value="${password}"/> </dataSource> </environment> </environments> <!-- 配置映射文件的位置, 映射配置文件指的是每个dao接口对应的配置文件 --> <mappers> <mapper resource="cn/ann/mapper/UserMapper.xml"/> </mappers> </configuration>
- environments标签在mybatis与spring整合之后就不用配了
-
创建映射配置文件
<?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接口(UserMapper)时, xml文件要与接口放在同一层目录中 同时, id要和方法名一致 --> <mapper namespace="cn.ann.mapper.UserMapper"> <insert id="addUser" parameterType="User"> insert into t_user(id, `name`, age) values (#{id},#{name},#{age}) </insert> </mapper>
-
编写测试类(单元测试)
public class ApplicationTest { private SqlSessionFactory factory; @Before public void before() throws IOException { InputStream is = Resources.getResourceAsStream("mybatis-config.xml"); factory = new SqlSessionFactoryBuilder().build(is); } @Test public void demo01() throws IOException { SqlSession session = factory.openSession(); User user = new User(null, "赵六", 26); session.insert("addUser", user); session.commit(); session.close(); } @Test public void demo02() { SqlSession session = factory.openSession(); UserMapper mapper = session.getMapper(UserMapper.class); User user = new User(null, "田七", 27); mapper.addUser(user); System.out.println(user); session.close(); } }
-
注解方式
- mapper:
@Select("select id, name, age from t_user where id = #{id}") User getUserById(Integer id);
- 核心配置文件文件:
<?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="database.properties"/> <environments default="development"> <environment id="development"> <transactionManager type="JDBC"/> <dataSource type="POOLED"> <property name="driver" value="${driver-class-name}"/> <property name="url" value="${url}"/> <property name="username" value="${username}"/> <property name="password" value="${password}"/> </dataSource> </environment> </environments> <!-- 配置映射文件的位置, 映射配置文件指的是每个dao接口对应的配置文件 --> <mappers> <mapper class="cn.ann.mapper.UserMapper"/> </mappers> </configuration>
- 测试类
@Test public void demo03() { SqlSession session = factory.openSession(); UserMapper mapper = session.getMapper(UserMapper.class); User user = mapper.getUserById(1); System.out.println(user); session.close(); }
- mapper:
-
- 环境搭建
-
对测试类的分析:
-
项目目录
项目目录 介绍 mapper: 相当于Dao
UserMapper.xml: 映射文件
mybatis-config.xml: mybatis核心配置文件 -
从单元测试中可以看出其需要引用的类有:
- class Resources
- class SqlSessionFactoryBuilder(使用了建造者模式, 用于构建SqlSessionFactory)
- interface SqlSessionFactory(使用了工厂模式, 用于生产SqlSession)
- interface SqlSession
-
其中, sqlSession是非线程安全的, 所以在多线程环境中, 要避免将sqlSession定义为成员变量, 而是在每次用的时候再开一个sqlSession对象
-
log4j2.xml(log4j配置文件, 无脑复制粘贴→_→)
<?xml version="1.0" encoding="UTF-8"?>
<configuration status="WARN" monitorInterval="30">
<appenders>
<console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n"/>
</console>
<File name="log" fileName="log/test.log" append="false">
<PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %class{36} %L %M - %msg%xEx%n"/>
</File>
<RollingFile name="RollingFileInfo" fileName="${sys:user.home}/logs/info.log"
filePattern="${sys:user.home}/logs/$${date:yyyy-MM}/info-%d{yyyy-MM-dd}-%i.log">
<ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/>
<PatternLayout pattern="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n"/>
<Policies>
<TimeBasedTriggeringPolicy/>
<SizeBasedTriggeringPolicy size="100 MB"/>
</Policies>
</RollingFile>
<RollingFile name="RollingFileWarn" fileName="${sys:user.home}/logs/warn.log"
filePattern="${sys:user.home}/logs/$${date:yyyy-MM}/warn-%d{yyyy-MM-dd}-%i.log">
<ThresholdFilter level="warn" onMatch="ACCEPT" onMismatch="DENY"/>
<PatternLayout pattern="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n"/>
<Policies>
<TimeBasedTriggeringPolicy/>
<SizeBasedTriggeringPolicy size="100 MB"/>
</Policies>
<DefaultRolloverStrategy max="20"/>
</RollingFile>
<RollingFile name="RollingFileError" fileName="${sys:user.home}/logs/error.log"
filePattern="${sys:user.home}/logs/$${date:yyyy-MM}/error-%d{yyyy-MM-dd}-%i.log">
<ThresholdFilter level="error" onMatch="ACCEPT" onMismatch="DENY"/>
<PatternLayout pattern="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n"/>
<Policies>
<TimeBasedTriggeringPolicy/>
<SizeBasedTriggeringPolicy size="100 MB"/>
</Policies>
</RollingFile>
</appenders>
<loggers>
<logger name="org.springframework" level="INFO"></logger>
<logger name="org.mybatis" level="INFO"></logger>
<root level="all">
<appender-ref ref="Console"/>
<appender-ref ref="RollingFileInfo"/>
<appender-ref ref="RollingFileWarn"/>
<appender-ref ref="RollingFileError"/>
</root>
</loggers>
</configuration>
database.properties(根据个人环境配置)
# 数据库驱动中 Driver 类的完整类名, 因为是 8.0.15 的驱动, 所以有 cj
driver-class-name=com.mysql.cj.jdbc.Driver
# 连接数据库的url, 8.0.15 的驱动需要加 serverTimezone=Asia/Shanghai参数
# jdbc:mysql://localhost:端口号/数据库名?serverTimezone=Asia/Shanghai
url=
# 数据库的登录名
username=root
# 数据库的密码
password=