Mybatis简介
MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis,实质上Mybatis对ibatis进行一些改进。
MyBatis是一个优秀的持久层框架,它对jdbc的操作数据库的过程进行封装,使开发者只需要关注 SQL 本身,而不需要花费精力去处理例如注册驱动、创建connection、创建statement、手动设置参数、结果集检索等jdbc繁杂的过程代码。
Mybatis框架核心
1、mybatis配置文件,包括Mybatis全局配置文件和Mybatis映射文件,其中全局配置文件配置了数据源、事务等信息;映射文件配置了SQL执行相关的信息。
2、mybatis通过读取配置文件信息(全局配置文件和映射文件),构造出SqlSessionFactory,即会话工厂。
3、通过SqlSessionFactory,可以创建SqlSession即会话。Mybatis是通过SqlSession来操作数据库的。
4、SqlSession本身不能直接操作数据库,它是通过底层的Executor执行器接口来操作数据库的。Executor接口有两个实现类,一个是普通执行器,一个是缓存执行器(默认)。
5、Executor执行器要处理的SQL信息是封装到一个底层对象MappedStatement中。该对象包括:SQL语句、输入参数映射信息、输出结果集映射信息。其中输入参数和输出结果的映射类型包括HashMap集合对象、POJO对象类型。
Mybatis使用入门指南
1.下载Mybatis
mybaits的代码由github.com管理,下载地址:Mybatis下载网址
2.导入jar包
Mybatis的jar包
此外,Mybatis属于是JDBC框架,自然少不了jdbc的驱动包啦,根据使用的数据库,下载对应的驱动包就行了。
本教程中还额外使用了junit,便于代码的分段测试,与Mybatis框架无关。
以上提到的两种jar包,推荐前往Maven仓库进行下载,链接为Maven中央仓库
3.代码实现
完成了jar包导入后,我们就可以开始进行Mybatis框架的搭建与使用啦。
(本教程使用的编辑器为Intellij IDEA)
a)创建一个java项目
无须勾选任何框架,直接一路Next,输入项目名称,点击Finish便创建完成。
b)创建项目内文件架构
整个项目的文件架构如上图所示,接下来,博主会顺着架构的顺序依次进行讲解!
c)开发步骤:
1、创建PO(model)类,根据需求创建;
2、创建全局配置文件SqlMapConfig.xml;
3、编写映射文件;
4、加载映射文件,在SqlMapConfig.xml中进行加载;
5、编写测试程序,即编写Java代码,连接并操作数据库。
思路:
1.读取配置文件;
2.通过SqlSessionFactoryBuilder创建SqlSessionFactory会话工厂。
3.通过SqlSessionFactory创建SqlSession。
4.调用SqlSession的操作数据库方法。
5.关闭SqlSession。
在看代码实现之前,希望小伙伴能够熟记这个Mybatis开发的流程,代码是实现的一种工具,开发的思路才是核心,只有掌握了思路,才能在面对问题的时候想到解决方案。
d)代码实现
在开始之前,先给自己的开发过程搞一份“保险”,就是使用lib包中导入的log4j这个jar包,提供日志。
log4j.properties
# Global logging configuration
log4j.rootLogger=DEBUG, stdout
# Console output...
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n
“保险”搞定,那么就开始干活了!
根据思路的第一步,根据需求创建model类。
既然要创建model,那么我们首先要有一张数据表
接下来的操作博主就基于这张表来讲解。
User.java
package model;
import java.io.Serializable;
import java.util.Date;
public class User implements Serializable {
//这里的变量与表中的列一致
private int id;
private String username;
private String password;
//常规get/set方法
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 String getPassword(){
return password;
}
public void setPassword(String password){
this.password=password;
}
//定义类容器
public User(){
}
public User(String username, String password) {
this.username = username;
this.password = password;
}
//定义输出结构
@Override
public String toString(){
return "User[id="+id+",username="+username+",password="+password+"]";
}
}
第二步,创建全局配置文件SqlMapConfig.xml
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>
<properties resource="db.properties"></properties>
<!--配置别名-->
<typeAliases>
<package name="model"></package>
</typeAliases>
</configuration>
第三步,编写映射文件;
User.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="user">
//查找用户sql语句
<select id="findUserByName" parameterType="String" resultType="model.User">
select * from user where username like '%${value}%'
</select>
//插入用户sql语句
<insert id="insertUser" parameterType="model.User">
<selectKey keyProperty="id" resultType="int" order="AFTER">
select LAST_INSERT_ID()
</selectKey>
insert into user(username,password)
values(#{username},#{password});
</insert>
//删除用户sql语句
<delete id="deleteUser" parameterType="String">
delete from user where username=#{username}
</delete>
//更新用户sql语句
<update id="updateUser" parameterType="model.User">
update user set password=#{password} where id=#{id};
</update>
</mapper>
第四步,加载映射文件,在SqlMapConfig.xml中进行加载
<mappers>
<mapper resource="sqlmap/User.xml"></mapper>
</mappers>
上面的代码添加到SqlMapConfig.xml末尾的位置,完整的代码如下:
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>
<properties resource="db.properties"></properties>
<!--配置别名-->
<typeAliases>
<package name="model"></package>
</typeAliases>
<mappers>
<mapper resource="sqlmap/User.xml"></mapper>
</mappers>
</configuration>
第五步,编写测试程序,即编写Java代码,连接并操作数据库。
1.读取配置文件
既然是要操作数据库,那必须要和数据库连接呀,那么JDBC技术中的数据库基本配置步骤还是不能少的,走起!
db.properties
driverClass=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8&serverTimezone=UTC
name=root
password=******
上面是使用数据库的配置文件,以这种额外配置文件的形式写出有一个好处,就是你下次写Mybatis项目的时候这个配置文件可以直接复制黏贴,不用再写一遍了。
注意:与JDBC的url略有不同,url要加serverTimezone=UTC,否则会报错!
接下来,就去SqlMapConfig.xml中配置Mybatis
<!--配置Mybatis信息-->
<environments default="development">
<environment id="development">
<!--配置JDBC事务控制,有Mybatis进行管理-->
<transactionManager type="JDBC"></transactionManager>
<!--配置数据源,采用dbcp连接池-->
<dataSource type="POOLED">
<property name="driver" value="${driverClass}"/>
<property name="url" value="${url}"/>
<property name="username" value="${name}"/>
<property name="password" value="${password}"/>
</dataSource>
</environment>
</environments>
完整的代码如下
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>
<properties resource="db.properties"></properties>
<!--配置别名-->
<typeAliases>
<package name="model"></package>
</typeAliases>
<!--配置Mybatis信息-->
<environments default="development">
<environment id="development">
<!--配置JDBC事务控制,有Mybatis进行管理-->
<transactionManager type="JDBC"></transactionManager>
<!--配置数据源,采用dbcp连接池-->
<dataSource type="POOLED">
<property name="driver" value="${driverClass}"/>
<property name="url" value="${url}"/>
<property name="username" value="${name}"/>
<property name="password" value="${password}"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="sqlmap/User.xml"></mapper>
</mappers>
</configuration>
2.通过SqlSessionFactoryBuilder创建SqlSessionFactory会话工厂
demo.java
package test;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.*;
import org.junit.Before;
import java.io.InputStream;
public class demo {
@Before
public void before() throws IOException {
System.out.println("获取session");
InputStream inputStream = Resources.getResourceAsStream("SqlMapConfig.xml");
SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
}
}
3.通过SqlSessionFactory创建SqlSession
demo.java
package test;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.*;
import org.junit.Before;
import java.io.InputStream;
public class demo {
SqlSession session = null;
@Before
public void before() throws IOException {
System.out.println("获取session");
InputStream inputStream = Resources.getResourceAsStream("SqlMapConfig.xml");
SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
session = sessionFactory.openSession();
}
}
4.调用SqlSession的操作数据库方法
demo.java
package test;
import model.User;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.*;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
public class demo {
SqlSession session = null;
@Before
public void before() throws IOException {
System.out.println("获取session");
InputStream inputStream = Resources.getResourceAsStream("SqlMapConfig.xml");
SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
session = sessionFactory.openSession();
}
//添加用户
@Test
public void test1() throws IOException {
InputStream inputStream = Resources.getResourceAsStream("SqlMapConfig.xml");
SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession session = sessionFactory.openSession();
User user = new User("superadmin", "superadmin");
int i = session.insert("insertUser", user);
session.commit();
System.out.println("===i=" + i);
System.out.println("用户的id : " + user.getId());
}
//删除用户
@Test
public void test2() throws IOException {
int i = session.delete("deleteUser", "superadmin");
session.commit();
System.out.println("i=" + i);
}
//更新用户
@Test
public void test3() throws IOException {
User user = new User();
user.setId(1);
user.setPassword("root");
int i = session.update("updateUser", user);
session.commit();
System.out.println("更改的行号:" + i);
}
//查找用户
@Test
public void test4() throws IOException{
List<User> users = session.selectList("findUserByName", "y");
System.out.println(users);
}
}
5.关闭SqlSession
package test;
import model.User;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.*;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
public class demo {
SqlSession session = null;
@Before
public void before() throws IOException {
System.out.println("获取session");
InputStream inputStream = Resources.getResourceAsStream("SqlMapConfig.xml");
SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
session = sessionFactory.openSession();
}
@After
public void after() {
System.out.println("关闭session");
session.close();
}
//添加用户
@Test
public void test1() throws IOException {
InputStream inputStream = Resources.getResourceAsStream("SqlMapConfig.xml");
SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession session = sessionFactory.openSession();
User user = new User("superadmin", "superadmin");
int i = session.insert("insertUser", user);
session.commit();
System.out.println("===i=" + i);
System.out.println("用户的id : " + user.getId());
}
//删除用户
@Test
public void test2() throws IOException {
int i = session.delete("deleteUser", "superadmin");
session.commit();
System.out.println("i=" + i);
}
//更新用户
@Test
public void test3() throws IOException {
User user = new User();
user.setId(1);
user.setPassword("root");
int i = session.update("updateUser", user);
session.commit();
System.out.println("更改的行号:" + i);
}
//查找用户
@Test
public void test4() throws IOException{
List<User> users = session.selectList("findUserByName", "y");
System.out.println(users);
}
}
好啦,到这里整个Mybatis实现增删改查就完成啦!是不是感觉比JDBC更加的灵活呢?
结语
这篇博客主要介绍了Mybatis实现增删改查,如果想了解JDBC的小伙伴可以看下博主的这篇文章JDBC连接数据库详解
如果说这篇文章有让你学到一定的知识的话,不妨点个赞和关注,让博主能够看到。如果讲解中有什么错误和疏忽,也劳烦在评论中指出或提问,博主会第一时间进行更新和答复,谢谢!