Mybatis入门使用
Mybatis是一个持久化框架,是对java程序调用数据库jdbc的一个封装。
1.Mybatis的引入背景
传统jdbc存在的问题:
-
频繁创建和销毁数据库连接
-
SQL语句存在硬编码(如果更新需求就需要到指定的java代码层去改,系统不易维护。可将SQL语句存在xml中统一配置管理)
-
开发者需要花费精力维护注册驱动/创建连接/创建statement/手动设置参数/结果集检索等繁琐的jdbc操作
-
jdbc实例代码:
public class JDBCTest { public static void main(String[] args) { Connection connection = null; PreparedStatement preparedStatement = null; ResultSet resultSet = null; try { // 加载数据库驱动 Class.forName("com.mysql.jdbc.Driver"); // 通过驱动管理类获取数据库链接connection = DriverManager connection = DriverManager.getConnection( "jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf-8", "root", "yalong" ); // 定义sql语句 ?表示占位符 String sql = "select * from user where username = ?"; // 获取预处理 statement preparedStatement = connection.prepareStatement(sql); // 设置参数,第一个参数为 sql 语句中参数的序号(从 1 开始),第二个参数为设置的 preparedStatement.setString(1, "王五"); // 向数据库发出 sql 执行查询,查询出结果集 resultSet = preparedStatement.executeQuery(); // 遍历查询结果集 while (resultSet.next()) { System.out.println( resultSet.getString("id") + " " + resultSet.getString("username") ); } } catch (Exception e) { e.printStackTrace(); } finally { // 释放资源 if (resultSet != null) { try { resultSet.close(); } catch (SQLException e) { e.printStackTrace(); } } if (preparedStatement != null) { try { preparedStatement.close(); } catch (SQLException e) { e.printStackTrace(); } } if (connection != null) { try { connection.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }}}
2.Mybatis介绍
MyBatis 本是apache的一个开源项目iBatis,2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis 。
2013年11月迁移到Github。
Mybatis介绍对使用JDBC操作数据库的过程进行封装,使开发者只需要关注 SQL 本身,而不需要花费精力去处理例如注册驱动、创建connection、创建statement、手动设置参数、结果集检索等jdbc繁杂的过程代码。
Mybatis通过XML或注解的方式,将要执行的各种statement(statement、preparedStatemnt、CallableStatement)配置起来。
通过java对象和statement中的sql进行映射生成最终执行的sql语句,最后由mybatis框架执行sql并将结果映射成java对象并返回。
3.Mabatis架构原理
Mybatis框架如何加载配置文件再读取数据库的?
说明:
- mybatis配置文件
- SqlMapConfig.xml 全局配置文件,运行环境配置,加载SQL映射文件配置等
- Mapper.xml SQL映射文件
- SqlSessionFactory 会话工厂
- sqlSession 会话,对数据库进行增删改查操作
- Executor执行器 具体底层干活的查询对象
- MappedStatement mapper.xml文件中一个select\insert\update\delete标签对应一个Mapped Statement对象
4.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.yalong.mybatis</groupId> <artifactId>MybatisTest</artifactId> <version>1.0</version> <packaging>jar</packaging> <name>MybatisTest</name> <url>http://maven.apache.org</url> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <maven.compiler.source>1.8</maven.compiler.source> <maven.compiler.target>1.8</maven.compiler.target> <maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion> </properties> <dependencies> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.4.6</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.35</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>test</scope> </dependency> </dependencies> </project>
-
在自己配置的数据库中创建user用户表:
<?xml version="1.0" encoding="UTF-8" ?>
CREATE TABLEuser
(id
int(11) NOT NULL AUTO_INCREMENT,username
varchar(32) NOT NULL COMMENT ‘用户名称’,birthday
date DEFAULT NULL COMMENT ‘生日’,sex
char(1) DEFAULT NULL COMMENT ‘性别’,address
varchar(256) DEFAULT NULL COMMENT ‘地址’,
PRIMARY KEY (id
)) ENGINE=InnoDB AUTO_INCREMENT=37 DEFAULT CHARSET=utf8;
2.添加全局配置文件SqlMapConfig.xml<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration> <settings> <!-- 延迟加载总开关 --> <setting name="lazyLoadingEnabled" value="false"/> </settings> <environments default="development"> <environment id="development"> <transactionManager type="JDBC"/> <dataSource type="POOLED"> <property name="driver" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf-8"/> <property name="username" value="root"/> <property name="password" value="yalong"/> </dataSource> </environment> </environments> <mappers> <mapper resource="UserProxyMapper.xml"/> </mappers> </configuration>
-
3.添加实体bean类
public class User
{
private int id;
private String username;
private Date birthday;
private String sex;
private String address;
public List<Orders> getOrders() {
return orders;
}
public void setOrders(List<Orders> orders) {
this.orders = orders;
}
public int getId() {
return id;
}
public void setId(int 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 + '\'' +
'}';
}
}
-
添加操作user表的mapper.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="test"> <!-- 每一个select\insert\update\delete标签对应一个Mapped Statement对象 --> <!-- #{}:相当于JDBC中的?占位符 --> <select id="findUserById" parameterType="int" resultType="com.yalong.mybatis.User"> SELECT * FROM USER WHERE id= #{id} </select> </mapper>
-
增加单元测试类
public class MybatisTest { private SqlSessionFactory sqlSessionFactory; @Before public void init() throws IOException { String resource = "SqlMapConfig.xml"; InputStream inputStream = Resources.getResourceAsStream(resource); sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); } @Test public void testFinUserById() { SqlSession session = sqlSessionFactory.openSession(); User user = null; try { user = session.selectOne("test.findUserById", 1); System.out.println("selectUser ok"); } catch (Exception e) { e.printStackTrace(); } finally { session.close(); } System.out.println(user); } }
-
测试结果
5.MyBatis开发流程小结
使用完之后,核心还是分析注重源码流程,底层实现才是重中之重。