1、MyBatis
MyBatis 是一个 半自动的ORM(Object Relation Mapping)框架。
特性:
1) MyBatis 是支持定制化 SQL、存储过程以及高级映射的优秀的持久层框架
2) MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集
3) MyBatis可以使用简单的XML或注解用于配置和原始映射,将接口和Java的POJO(Plain Old Java Objects,普通的Java对象)映射成数据库中的记录。
2、搭建MyBatis
Step1: 在Idea中新建Maven工程,并在pom文件中引入依赖
<?xml version="1.0" encoding="UTF-8"?>
<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>org.example</groupId>
<artifactId>mybatis01</artifactId>
<version>1.0-SNAPSHOT</version>
<!--不需要打成war包 -->
<packaging>jar</packaging>
<dependencies>
<!-- Mybatis核心 -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.7</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.16</version>
</dependency>
<!-- log4j日志 -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
</dependencies>
</project>
由于一些配置下载比较慢,可以在maven的setting文件中mirrors标签下配置阿里云镜像。
<mirrors>
<mirror>
<id>alimaven</id>
<mirrorOf>central</mirrorOf>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/repositories/central/</url>
</mirror>
</mirrors>
也可以配置一下自己的本地仓库,因为默认的一般在c盘,依赖比较多的时候,比较占空间。
<!-- localRepository
| The path to the local repository maven will use to store artifacts.
|
| Default: ${user.home}/.m2/repository
<localRepository>/path/to/local/repo</localRepository>
-->
<localRepository>D:\maven\resp</localRepository>
step2:创建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>
<!--设置连接数据库的环境-->
<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/ssm?
serverTimezone=UTC"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</dataSource>
</environment>
</environments>
<!--引入映射文件, 可以配置多个mapper文件 resource取值为mapper具体路径-->
<mappers>
<mapper resource="mappers/UserMapper.xml"/>
</mappers>
</configuration>
step3:创建mapper接口
package com.lucky.mybatis.mapper;
import com.lucky.pojo.User;
public interface UserMapper {
int insertUser();
}
step4: 创建映射文件
创建MyBatis的映射文件
ORM(Object Relationship Mapping)对象关系映射。
对象:Java的实体类对象
关系:关系型数据库
映射:二者之间的对应关系
java概念 | 数据库 |
---|---|
类 | 表 |
属性 | 字段、列 |
对象 | 行 |
一些映射文件命名规则:
a、表所对应的实体类的类名+Mapper.xml ,比如User类对应映射文件名称为UserMapper.xml;
b、mapper接口的全类名和映射文件的命名空间(namespace)保持一致;
c、mapper接口中方法的方法名和映射文件中编写SQL的标签的id属性保持一致,不一样的时候需要重新利用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">
<mapper namespace="com.lucky.mybatis.mapper.UserMapper">
<insert id="insertUser">
insert into t_user values(null,'admin','123456',23,'男','12345@qq.com')
</insert>
</mapper>
step4:测试
public void test01() throws IOException {
//读取MyBatis的核心配置文件
InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
//创建SqlSessionFactoryBuilder对象
SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new
SqlSessionFactoryBuilder();
//通过核心配置文件所对应的字节输入流创建工厂类SqlSessionFactory,生产SqlSession对象
SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(is);
//创建SqlSession对象,此时通过SqlSession对象所操作的sql都必须手动提交或回滚事务
//SqlSession sqlSession = sqlSessionFactory.openSession();
//创建SqlSession对象,此时通过SqlSession对象所操作的sql都会自动提交
SqlSession sqlSession = sqlSessionFactory.openSession(true);
//提供sql以及的唯一标识找到sql并执行,唯一标识是namespace.sqlId
// int result = sqlSession.insert("com.lucky.mybatis.mapper.UserMapper.insertUser");
//通过代理模式创建UserMapper接口的代理实现类对象
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
//调用UserMapper接口中的方法,就可以根据UserMapper的全类名匹配元素文件,通过调用的方法名匹配映射文件中的SQL标签,并执行标签中的SQL语句
int result = userMapper.insertUser();
System.out.println("结果:" + result);
}
日志中打印sql语句(打印日志需要配置log4j)
数据入库
其中log4j配置信息为:
pom添加依赖
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
log4j配置信息,log4j的配置文件名为log4j.xml,存放的位置是src/main/resources目录下。
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
<appender name="STDOUT" class="org.apache.log4j.ConsoleAppender">
<param name="Encoding" value="UTF-8" />
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%-5p %d{MM-dd HH:mm:ss,SSS}
%m (%F:%L) \n" />
</layout>
</appender>
<logger name="java.sql">
<level value="debug" />
</logger>
<logger name="org.apache.ibatis">
<level value="info" />
</logger>
<root>
<level value="debug" />
<appender-ref ref="STDOUT" />
</root>
</log4j:configuration>
3、为什么MyBatis中的mapper没有实现类
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
通过动态代理的方式,创建UserMapper接口的代理实现类对象。
源码中getMapper最终实现,是通过apperProxyFactory.newInstance()产生的。
实际上,sqlsession中还有一个insert方法,使用方法如下所示:
int result = sqlSession.insert("com.lucky.mybatis.mapper.UserMapper.insertUser");
其中,insert方法的输入参数为sql语句的唯一标记,也就是映射文件名称+sql标签。