一、什么是Mybaits
Mybatis是一款一流的支持自定义SQL、存储过程和高级映射的持久化框架。
支持自定义SQL:在java里面写数据库语句会出现大量的字符串常量比较分散,这样我们在修改的时候就会变得特别的繁琐。而我们的mybatis希望通过定义的方式将sql管理起来。
存储过程:把一个面向对象的东西转化为面向过程,我们的sql语句的查询是一个面向过程的,所以我们将sql和java结合起来实际上是不匹配的,需要我们阻抗不匹配,所以我们通过转化来实现不匹配。比如我们发一个请求是给SQL,我们的java将请求转化为对象,处理完以后将我们的结果也转化为对象,返回到SQL。一般我们编程都是在客服两个不匹配:客户端和服务端的不匹配、服务端和数据库的不匹配。
高级映射的持久化框架:我们的数据库里面事务的HCID特性里面的D是持久化特性,就是我们对数据库的改变是永久性的,不管重启还是怎么它将永远存在。而我们的mybatis就是和数据库有关系,它将一直存在,有持久化特性。它也叫ORM框架(Object Relationship Map)——对象关系映射。
二、为什么要使用Mybatis
使用Mybatis比我们的JDBC更加的便捷,它几乎消除了所有的JDBC代码
三、Mybatis框架,先入门了解
基于Mybatis创建项目
0. 安装Free Mybatis插件
1.创建一个maven项目
1.1添加依赖mybatis
1.2添加依赖mysql驱动
2.创建mybatis配置
2.1src/main/resources->mybatis-config.xml
2.2配置文件中需要配置数据库的信息,driver url username password
3.编码
3.1 entity 包 实体类——>数据库表有关
3.2 mapper 包mapper接口->数据库操作的方法(query,insert)
3.3 映射文件-src/main/resources/mapper——> 创建mapper.xml 定义信息
3.4 编码,创建 SqlSessionFactory SqlSession Mapper Interface
3.5测试一下代码
容易出现的错误:
(1)容易拼写错误
(2)文件夹,包名,类名——要见名思意
(3)环境的配置:一个是开发环境(一般用dev—devpendency),一个是用户环境(一般用prod—product简写)
(4)在实现接口方法的文件中我们的< mapper namespace=“com.wschase.mybatis.mapper.MemoGroupMapper”>这个里面写的是权限名(包名+类名),如果我们写对了那么ctrl点击就会进入到我们的这个接口。
(5)写mapper中的命令(insert select delete update)通过mapper接口的方法名直接获取,防止出现错误
四、下面我们就进入实战看看如何创建一个Mybatis项目
0.安装Free Mybatis插件
1.创建一个maven项目
1.1添加依赖mybatis
1.2添加依赖mysql驱动
<?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.wschase</groupId>
<artifactId>mybatis-maven-case</artifactId>
<version>1.0.0</version>
<name>mybatis-maven-case</name>
<description>这是一个mybatis框架学习的案例</description>
<!--因为要使用mybatis所以我们需要加入它的依赖-->
<dependencies>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.5</version>
</dependency>
<!--mysql驱动依赖-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.43</version>
</dependency>
</dependencies>
</project>
2.创建mybatis配置
2.1src/main/resources->mybatis-config.xml
2.2配置文件中需要配置数据库的信息,driver url username password
<?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="dev">
<environment id="dev">
<transactionManager type="JDBC"></transactionManager>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/memo"/>
<property name="username" value="root"/>
<property name="password" value="1041646364"/>
</dataSource>
</environment>
<environment id="prod">
<transactionManager type="JDBC"></transactionManager>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/memo"/>
<property name="username" value="root"/>
<property name="password" value="1041646364"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="mapper/memoGroupMapper.xml"/>
</mappers>
</configuration>
3.编码
3.1 entity 包 实体类——>数据库表有关
(1)创建包:
(2)创建类:这个类里面的属性对应到数据库里面的表里面的列信息
package com.wschase.entity;
import java.util.Date;
/**这是我们数据库里面的表——对应到java里面就是我们的类
* Author:WSChase
* Created:2019/4/15
*/
public class MemoGroup {
//表里面的列元素就是我们java类里面的属性元素
private Integer id;
private String name;
private Date createdTime;
private Date modifyTime;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Date getCreatedTime() {
return createdTime;
}
public void setCreatedTime(Date createdTime) {
this.createdTime = createdTime;
}
public Date getModifyTime() {
return modifyTime;
}
public void setModifyTime(Date modifyTime) {
this.modifyTime = modifyTime;
}
@Override
public String toString() {
return "MemoGroup{" +
"id=" + id +
", name='" + name + '\'' +
", createdTime=" + createdTime +
", modifyTime=" + modifyTime +
'}';
}
}
3.2 mapper 包mapper接口->数据库操作的方法(query,insert)
(1)mapper包:
(2)接口:我们凡是跟数据库交互的操作我们都在接口中定义为相应的方法
package com.wschase.mybatis.mapper;
import com.wschase.entity.MemoGroup;
/**mapper是我们的映射包:
* 我们凡是跟数据库交互的操作我么都定义为相应的方法
* Author:WSChase
* Created:2019/4/15
*/
public interface MemoGroupMapper {
int insertMemoGroup(MemoGroup memoGroup);
//查询
MemoGroup query();
}
3.3 映射文件-src/main/resources/mapper——> 创建mapper.xml 定义信息
(1)创建映射文件
(2)创建信息
<?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.wschase.mybatis.mapper.MemoGroupMapper">
<resultMap id="memoGroup" type="com.wschase.entity.MemoGroup">
<id property="id" column="id" jdbcType="INTEGER"/>
<result property="name" column="name" jdbcType="VARCHAR"/>
<result property="createdTime" column="created_time" jdbcType="TIMESTAMP"/>
<result property="modifyTime" column="modify_time" jdbcType="TIMESTAMP"/>
</resultMap>
<insert id="insertMemoGroup">
<!--将java的属性和数据库的列名对应起来-->
insert into memo_group(name,created_time)
values(#{name},#{createdTime})
</insert>
<select id="query" resultType="com.wschase.entity.MemoGroup"></select>
</mapper>
3.4 编码,创建 SqlSessionFactory SqlSession Mapper Interface
package com.wschase.mybatis;
import com.wschase.entity.MemoGroup;
import com.wschase.mybatis.mapper.MemoGroupMapper;
import org.apache.ibatis.datasource.pooled.PooledDataSource;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.mapping.Environment;
import org.apache.ibatis.session.Configuration;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.apache.ibatis.transaction.jdbc.JdbcTransactionFactory;
import javax.sql.DataSource;
import java.io.IOException;
import java.util.Date;
/**
* Author:WSChase
* Created:2019/4/15
*/
public class MybatisApplication {
private static SqlSessionFactory sqlSessionFactory;
public static void buildSqlSessionFanctoryWithXml(){
try {
sqlSessionFactory=new SqlSessionFactoryBuilder().build(
//获取calssPath里面的资源使用mybatis里面的工具类
Resources.getResourceAsStream("mybatis-config.xml")
);
System.out.println(sqlSessionFactory);
} catch (IOException e) {
e.printStackTrace();
}
}
public static void buildSqlSessionFactoryJava(){
Configuration configuration=new Configuration();
DataSource dataSource=new PooledDataSource(
"com.mysql.jdbc.Driver",
"jdbc:/mysql://localhost:3306/memo",
"root",
"104164364"
);
Environment environment=new Environment(
"dev",
new JdbcTransactionFactory(),
dataSource
);
configuration.setEnvironment(environment);
sqlSessionFactory=new SqlSessionFactoryBuilder().build(configuration);
System.out.println(sqlSessionFactory);
}
public static void main(String[] args) {
// buildSqlSessionFactoryJava();
buildSqlSessionFanctoryWithXml();
SqlSession sqlSession=sqlSessionFactory.openSession(true);
MemoGroup memoGroup=new MemoGroup();
memoGroup.setName("Mybatis3");
memoGroup.setCreatedTime(new Date());
/**
* 这里对应的就是我们数据库的增删改查的操作
*/
// int effect=sqlSession.insert("com.wschase.mybatis.mapper.MemoGroupMapper.insertMemoGroup",memoGroup);
// System.out.println(effect);
// sqlSession.close();
//这个MemoGroupMapper接口里面定义很多方法在这个地方拿到了它的实例化对象就可以进行操作了
//虽然我们可以看到我们的接口MemoGroupMapper并没有实现类,但是我们的getMapper方法可以获取到
//使得我们可以进行操作(其实它就是将memoGroupMapper文件变成了它的实现类)
MemoGroupMapper memoGroupMapper=sqlSession.getMapper(MemoGroupMapper.class);
int effect=memoGroupMapper.insertMemoGroup(memoGroup);
System.out.println(effect);
sqlSession.close();
}
}
//注意:我们要把我们的表和我们java的对象关联起来。我们需要操作数据库,但是无法直接和我们的数据库进行操作
//因为数据库里面是表格的形式,那么我们就先创建一个实体类:
// entity包(我们以后把跟数据库对应起来的这些表都称之为实体类,并且把它放在entity这个包里面)—
3.5测试一下代码
经过测试以后在我们数据库的表里面就对应的有了添加的数据