1.0 开始之前
SSM之Mybatis框架(一) 文章中其实讲得不明不白,看上去mybtis似乎也不像专注于sql语句。
但是当结合其他框架使用的时,mybatis的工作就只剩下sql了。
2.0 简单使用注解。
2.1 创建一个maven项目。
![](https://img.haomeiwen.com/i16102290/b8c7d27750696eaf.png)
2.2 配置pom.xml文件
<?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>com.edp</groupId>
<artifactId>mybatis_eesy</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<dependencies>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.4</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.18</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>
2.3 配置mybatis
SqlMapConfig.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>
<!-- 和spring整合后 environments配置将废除 -->
<!-- development是开发环境 -->
<environments default="development">
<!-- 可以设置多个environment -->
<environment id="development">
<!-- 使用jdbc事务管理 -->
<transactionManager type="JDBC"/>
<!-- 数据库连接池 -->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="url"
value="jdbc:mysql://localhost:3306/eesy?useSSL=false&serverTimezone=UTC"/>
<property name="username" value="root"/>
<property name="password" value="bywwcnll"/>
</dataSource>
</environment>
</environments>
<!-- 加载映射文件 -->
<!-- 如果是注解来配置的话,此处应该使用class属性指定备注解的dao全限定类名。 -->
<mappers>
<!-- resource -->
<!-- <mapper resource="com/edp/dao/IuserDao.xml"/>-->
<mapper class="com.edp.dao.IuserDao"/>
</mappers>
</configuration>
2.4 日志文件
log4j.properties
# Set root category priority to INFO and its only appender to CONSOLE.
#log4j.rootCategory=INFO, CONSOLE debug info warn error fatal
log4j.rootCategory=debug, CONSOLE, LOGFILE
# Set the enterprise logger category to FATAL and its only appender to CONSOLE.
log4j.logger.org.apache.axis.enterprise=FATAL, CONSOLE
# CONSOLE is set to be a ConsoleAppender using a PatternLayout.
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern=%d{ISO8601} %-6r [%15.15t] %-5p %30.30c %x - %m\n
# LOGFILE is set to be a File appender using a PatternLayout.
log4j.appender.LOGFILE=org.apache.log4j.FileAppender
log4j.appender.LOGFILE.File=d:\axis.log
log4j.appender.LOGFILE.Append=true
log4j.appender.LOGFILE.layout=org.apache.log4j.PatternLayout
log4j.appender.LOGFILE.layout.ConversionPattern=%d{ISO8601} %-6r [%15.15t] %-5p %30.30c %x - %m\n
2.5 表现层、业务层、持久层接口
实体类User.java
package com.edp.damain;
import java.io.Serializable;
import java.util.Date;
/**
* @author EdPeng
* @Title: 实体类
* @Package
* @Description:
* @date 2020/3/9下午 7:40
*/
public class User implements Serializable {
private Integer id;
private String username;
private Date birthday;
private String sex;
private String address;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
@Override
public String toString() {
return "User [id=" + id + ", username=" + username + ", birthday=" + birthday
+ ", sex=" + sex + ", address="
+ address + "]";
}
}
持久层接口IuserDao.java,使用Mybatis注解:
package com.edp.dao;
import com.edp.damain.User;
import org.apache.ibatis.annotations.Select;
import java.util.List;
/**
* @author EdPeng
* @Title: 用户持久层接口
* @Package
* @Description:
* @date 2020/3/9下午 8:20
*/
public interface IuserDao {
/**
* @Description: 查询所有操作
* @author EdPeng
* @date 2020/3/9 下午 9:25
*/
@Select("select * from user")
List<User> findAll();
}
2.6 测试类
package com.edp.test;
import com.edp.damain.User;
import com.edp.dao.IuserDao;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.junit.Test;
/**
* @author EdPeng
* @date 2020/3/9下午 10:29
*/
public class MybatisTest {
public static void main(String[] args) throws IOException {
// 创建SqlSessionFactoryBuilder类
SqlSessionFactoryBuilder ssfBuilder = new SqlSessionFactoryBuilder();
// Mybatis的工具类Resources
// 创建核心配置文件的输入流
InputStream resourceAsStream = Resources.getResourceAsStream("SqlMapConfig.xml");
// 通过输入流创建SqlSessionFactory对象
SqlSessionFactory ssFactory = ssfBuilder.build(resourceAsStream);
// SqlSession对象:内含访问数据库的所有API
SqlSession sqlSession = ssFactory.openSession();
// 使用SqlSession创造dao接口代理对象。
IuserDao iuserDao = sqlSession.getMapper(IuserDao.class);
//使用代理对象执行方法。
List<User> userList = iuserDao.findAll();
for (User user :
userList) {
System.out.println(user);
}
// 释放资源
sqlSession.close();
}
}
执行:
![](https://img.haomeiwen.com/i16102290/88d2bb6c9d15454d.png)
- mybatis基于注解的入门案例:
把IUserDao.xml移除,在dao接口的方法上使用@Select注解,并且指定SQL语句- 同时需要在SqlMapConfig.xml中的mapper配置时,使用class属性指定dao接口的全限定类名。
- 明确:
- 我们在实际开发中,都是越简便越好,所以都是采用不写dao实现类的方式。
不管使用XML还是注解配置。
但是Mybatis它是支持写dao实现类的。
3.0 Mybatis中使用的设计模式
比如如果建一个真实的工厂,首先,我们要选址,然后还要准备建工厂的材料等等,最终工厂还不一定能建好。
这时候,我们只需要找一个包工队,只需要告诉他需求,然后给钱,事就办成了。而我们测试代码中的SqlSessionFactoryBuilder
就是一个这样的包工队。负责帮我们创建工厂,建厂所有的繁琐复杂的事情全部由他来完成,我们只需要给钱就好。
![](https://img.haomeiwen.com/i16102290/6b2104051fbe68a3.png)
这么多的方法加入代码有什么好处?——为了重载。比如我们的build()方法和openSession()方法有很多的重载方法,可以进行灵活的封装。
4.0 执行查询的内部逻辑分析
![](https://img.haomeiwen.com/i16102290/f86620fb29fd492b.png)
![](https://img.haomeiwen.com/i16102290/21b5bde83584a604.png)
END
网友评论