Mybatis框架概述
- 简单易学,很小很简单,没有第三方依赖,最简单的安装只需要一个jar文件和XML配置。
- 灵活,不会对应用程序和数据库强加影响。
- 实现了SQL和代码的分离。【将数据访问层DAO以及JDBC编程实现了封装】。
- 支持动态SQL。
Mybatis简单示例:
1.新建一个Maven项目。
2. 打开pom.xml进行配置
刚开始的代码是这样子的:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.zking.teach</groupId>
<artifactId>Day2019_09_17_Mybatis</artifactId>
<version>0.0.1-SNAPSHOT</version>
</project>
**我们需要添加一些Maven依赖。**这里面有:
- 一些自定义配置信息,比如JDK版本会自动设置为1.8,而不是开始的J2SE-1.5。
- JUnit单元测试
- json库
- mysql的JDBC数据库驱动>>mysql-connector-java
- 日志 Simple logging facade for Java和具体日志桥
- Mybatis框架的主配置信息
- Maven项目的工程编译插件的配置
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.zking.teach</groupId>
<artifactId>Day2019_09_17_Mybatis</artifactId>
<version>0.0.1-SNAPSHOT</version>
<!-- 自定义配置信息(JDK 1.8) -->
<properties>
<charset>UTF-8</charset>
<jdk.version>1.8</jdk.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<argLine>-Dfile.encoding=UTF-8</argLine>
</properties>
<dependencies>
<!-- 单元测试 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<!-- json库 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.11</version>
</dependency>
<!-- mysql的jdbc数据库驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.28</version>
</dependency>
<!-- 日志 Simple logging facade for Java -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.25</version>
</dependency>
<!-- 具体日志桥 -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.25</version>
</dependency>
<!-- MyBatis框架主配置 -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.6</version>
</dependency>
</dependencies>
<build>
<plugins>
<!-- Maven工程编译插件 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.0</version>
<configuration>
<source>${jdk.version}</source>
<target>${jdk.version}</target>
<encoding>${charset}</encoding>
</configuration>
</plugin>
</plugins>
</build>
</project>
然后Ctrl+S对pom.xml文件进行保存。之后要记得对项目进行Maven-update一下。在项目上右击>>找到Maven>>在后面找到Update Maven Project >>点击进去如下图>>OK,此时项目就不会报错了。
3.配置Mybatis主配置文件
Mybatis主配置>>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>
<properties resource="config.properties">
<property name="type" value="JDBC"/>
</properties>
<settings>
<!-- 打开延迟加载的开关 -->
<setting name="lazyLoadingEnabled" value="true"/>
<!-- 将积极加载改为消极加载,即延迟加载 -->
<setting name="aggressiveLazyLoading" value="false"/>
<setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>
<typeAliases>
<typeAlias type="com.teach.entity.RoleInfo" alias="RoleInfo"/>
</typeAliases>
<typeHandlers>
<package name="com.teach.type"/>
</typeHandlers>
<environments default="development">
<environment id="development">
<transactionManager type="${type}"></transactionManager>
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driverClassName}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</dataSource>
</environment>
</environments>
<mappers>
<package name="com.teach.mapper"/>
<!-- <mapper resource="com/teach/mapper/RoleInfoMapper.xml" /> -->
</mappers>
</configuration>
log4j.xml文件配置
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
<appender name="console" class="org.apache.log4j.ConsoleAppender">
<param name="Target" value="System.out" />
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%d{yyyy-MM-dd HH:mm:ss} %-5p: %c > %m%n" />
</layout>
</appender>
<logger name="com.teach">
<level value="debug"/>
</logger>
<root>
<priority value="debug" />
<appender-ref ref="console" />
</root>
</log4j:configuration>
config.properties
jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://127.0.0.1:3306/1128java?useUnicode\=true&characterEncoding\=UTF-8&zeroDateTimeBehavior\=convertToNull
jdbc.username=root
jdbc.password=123456
4.创建好实体类,与数据库表中的字段一致
package com.teach.entity;
public class RoleInfo {
private Integer roleId;//角色id
private String roleName;//角色名
public RoleInfo() {//构造器
super();
}
public RoleInfo(Integer roleId) {
super();
this.roleId = roleId;
}
public RoleInfo(Integer roleId, String roleName) {
super();
this.roleId = roleId;
this.roleName = roleName;
}
public Integer getRoleId() {
return roleId;
}
public void setRoleId(Integer roleId) {
this.roleId = roleId;
}
public String getRoleName() {
return roleName;
}
public void setRoleName(String roleName) {
this.roleName = roleName == null ? null : roleName.trim();
}
@Override
public String toString() {
return "RoleInfoVO [roleId=" + roleId + ", roleName=" + roleName + "]";
}
}
数据库中表的名称和字段:
5.创建好DAO类,接口以及XML配置文件
RoleInfoDAO类的代码实现:
package com.zking.DAO;
import java.util.List;
import com.zking.entity.RoleInfo;
public interface RoleInfoDAO {
//添加角色实现接口
int insert(RoleInfo roleInfo);
//查询所有的角色
List<RoleInfo> selectAll();
}
RoleInfoDAO.xml代码实现:
<?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 namespace="com.zking.DAO.RoleInfoDAO">
<!-- 根标签mapper的属性namespace需要与所写的接口的方法要一致 -->
<insert id="insert"> <!-- id要与接口中定义的方法名要一致 -->
insert into role_info(role_id,role_name)
values(#{roleId},#{roleName})
</insert>
<select id="selectAll"></select>
<update id="update"></update>
</mapper>
6.建立测试类
RoleInfoDAOTest.java代码实现:
package com.zking.dao;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.zking.DAO.RoleInfoDAO;
import com.zking.entity.RoleInfo;
public class RoleInfoDAOTest {
private Logger log = LoggerFactory.getLogger(this.getClass());
@Test
public void insert() {
// 1.加载配置文件
//创建一个会话工厂sessionFactory,相当于事务的连接对象,最后需要关闭。
//new一个创建者,利用里面的build方法来指定XML的资源(/mybatis-config.xml),通过输入流的方式来获取到xml的资源,/是指在根目录里
SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder()
.build(this.getClass().getResourceAsStream("/mybatis-config.xml"));
//2.会话工厂创建一个session会话对象
SqlSession session = sessionFactory.openSession();
try {
//3.通过session来获取RoleInfoDAO的映射
RoleInfoDAO dao = session.getMapper(RoleInfoDAO.class);
RoleInfo roleInfo = new RoleInfo(-3, "test3");
//4.通过dao来调用接口里面的方法
dao.insert(roleInfo);
//5.事务提交
session.commit();// 必须要提交事务,才能添加到数据库中
//6.日志提示执行成功信息
log.info("添加成功!");//日志添加
} catch (Exception ex) {
//7.日志执行失败提示信息
log.warn("执行失败!", ex);
//事务回滚
session.rollback();//事务回滚,如果错误就回退
} finally {
//事务关闭
session.close();
}
}
}
Junit执行结果
2019-09-21 16:26:10 DEBUG: org.apache.ibatis.logging.LogFactory > Logging initialized using 'class org.apache.ibatis.logging.slf4j.Slf4jImpl' adapter.
2019-09-21 16:26:10 DEBUG: org.apache.ibatis.datasource.pooled.PooledDataSource > PooledDataSource forcefully closed/removed all connections.
2019-09-21 16:26:10 DEBUG: org.apache.ibatis.datasource.pooled.PooledDataSource > PooledDataSource forcefully closed/removed all connections.
2019-09-21 16:26:10 DEBUG: org.apache.ibatis.datasource.pooled.PooledDataSource > PooledDataSource forcefully closed/removed all connections.
2019-09-21 16:26:10 DEBUG: org.apache.ibatis.datasource.pooled.PooledDataSource > PooledDataSource forcefully closed/removed all connections.
2019-09-21 16:26:11 DEBUG: org.apache.ibatis.transaction.jdbc.JdbcTransaction > Opening JDBC Connection
2019-09-21 16:26:11 DEBUG: org.apache.ibatis.datasource.pooled.PooledDataSource > Created connection 1920387277.
2019-09-21 16:26:11 DEBUG: org.apache.ibatis.transaction.jdbc.JdbcTransaction > Setting autocommit to false on JDBC Connection [com.mysql.jdbc.JDBC4Connection@7276c8cd]
2019-09-21 16:26:11 DEBUG: com.zking.DAO.RoleInfoDAO.insert > ==> Preparing: insert into role_info(role_id,role_name) values(?,?)
2019-09-21 16:26:11 DEBUG: com.zking.DAO.RoleInfoDAO.insert > ==> Parameters: -3(Integer), test3(String)
2019-09-21 16:26:11 DEBUG: com.zking.DAO.RoleInfoDAO.insert > <== Updates: 1
2019-09-21 16:26:11 DEBUG: org.apache.ibatis.transaction.jdbc.JdbcTransaction > Committing JDBC Connection [com.mysql.jdbc.JDBC4Connection@7276c8cd]
2019-09-21 16:26:11 INFO : com.zking.dao.RoleInfoDAOTest > 添加成功!
2019-09-21 16:26:11 DEBUG: org.apache.ibatis.transaction.jdbc.JdbcTransaction > Resetting autocommit to true on JDBC Connection [com.mysql.jdbc.JDBC4Connection@7276c8cd]
2019-09-21 16:26:11 DEBUG: org.apache.ibatis.transaction.jdbc.JdbcTransaction > Closing JDBC Connection [com.mysql.jdbc.JDBC4Connection@7276c8cd]
2019-09-21 16:26:11 DEBUG: org.apache.ibatis.datasource.pooled.PooledDataSource > Returned connection 1920387277 to pool.
数据库表新添加了一条数据:
Mybatis框架入门阶段学习温馨提示:
- 不要觉得学框架的配置很麻烦就不去学了,到后面写的代码会越来越少。
- 整合后会发现Mybatis很简单,使用会更简单,增删改查用普遍的代码生成器生成。你需要的接口会自动嵌入进来,只需要执行里面的方法就可以了。比如:只需要这两行代码就行>>
RoleInfo roleInfo = new RoleInfo(-3, "test3"); dao.insert(roleInfo);
- 提交回滚会有专门的事务管理器处理,都不需要管。