目录
前言
一、准备工作
1.1、下载MyBatis
1.2、数据库设计
二、搭建框架
2.1、创建Maven项目
2.2、jar包、引入依赖
2.3、创建MyBatis核心配置文件
2.4、映射文件
2.5、通过junit测试功能
2.6、框架优化
三、增删改查+优化
四、小结——注意事项
前言
本篇全程从0到1搭建MyBatis框架,连接MySQL,以向数据库中插入一条信息为例进行使用,再到最后的优化,绝对的一条龙服务~
一、准备工作
1.1、下载MyBatis
MyBatis下载地址:GitHub - mybatis/mybatis-3: MyBatis SQL mapper framework for Java
注意:这里的mybatis版本之间差异不是很大,可以自己选择版本,本篇以3.5.7为例;安装位置就放在一个你能找到的地方就ok;
1.2、数据库设计
这里以向用户表插入信息为例,搭建MyBatis框架;
(1)、用MySQL创建一个库名为:ssm;
(2)、在ssm数据库下创建一个表,名为user的用户表,sql语句如下:
create table user(id int, username varchar(20), password varchar(20));
二、搭建框架
2.1、创建Maven项目
创建Maven项目基本上就是把项目名自定义一下,然后一路next就完事了;
2.2、jar包、引入依赖
都是在pom.xml的project中加入:
jar包:
<packaging>jar</packaging>
引入依赖:
<dependencies>
<!-- Mybatis核心 -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.7</version>
</dependency>
<!-- junit测试 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<!-- MySQL驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.16</version>
</dependency>
</dependencies>
2.3、创建MyBatis核心配置文件
习惯上命名为mybatis-config.xml,这个文件名仅仅只是建议,并非强制要求。将来整合Spring之后,这个配置文件可以省略;
用处:用来连接数据库以及全局配置信息;
核心配置文件存放的位置是src/main/resources目录下,如下:
注意:所有的配置文件都放在resources文件下
文件配置内容如下:
<?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="1111"/>
</dataSource>
</environment>
</environments>
<!--这里需要引入映射文件-->
<mappers>
<mapper resource="mappers/UserMapper.xml"/>
</mappers>
</configuration>
这里直接复制粘贴即可,别忘记输入你的数据库名称和密码以及url,如下图:
2.4、映射文件
这里需要映射什么呢,就是我们所要插入信息的用户表,所以还需要在java中创建一个用户表,如下:
public class User {
private int id;
private String username;
private String password;
public User(int id, String username, String password) {
this.id = id;
this.username = username;
this.password = password;
}
public User() {
}
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;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", username='" + username + '\'' +
", password='" + password + '\'' +
'}';
}
}
那怎么样才能通过mybatis实现与数据库的交互呢?我们可以提供一个公开的接口供MyBatis使用,如下:
解释:
MyBatis中的mapper接口相当于以前的dao。但是区别在于,mapper仅仅是接口,我们不需要 提供实现类;
为什么可以这么做呢,还记得JDBC实现与数据库的连接吗,咱们用MyBatis就可以不用像JDBC那一套那么繁琐,按照规定,我们只需要提供一个接口即可;
如何将这个接口和刚刚创建的映射文件关联起来呢?接着往下看!
映射文件UserMapper.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="com.bite.mybatis.mapper.UserMapper"> <!--这里建立映射关系-->
<!--
mapper接口和映射文件要保证两个一致
1.mapper接口的全类名和映射文件的namespace一致
2.mapper接口中的方法的方法名要和映射文件的sql的id一致
-->
<!--int insertUser();-->
<insert id="insertUser">
insert into user values(null, "admin", "123");
</insert>
</mapper
解释:
这里的<mapper namespace="com.bite.mybatis.mapper.UserMapper"> 就是在建立映射关系(注意看代码中的注释,那是我们需要格外注意的地方,否则就会报错!),然后将你想要写的sql语句写在这个标签下即可,仔细观察你会发现,不是直接将sql语句写入其中,而是通过一个inser的标签,实际上这个标签就表明了你要对这个表进行一个什么操作,MyBatis不仅提供了这个insert,还有很多其他方法,如下图:
咱们只需要将我们所要实现的逻辑(sql语句), 写入对应功能的标签下即可,例如select标签就是查询功能,那咱们只需要在这个标签下写查询的sql语句即可;
这里我的是插入功能,那么这里所需要的sql代码就是插入逻辑,向user表中插入数据;
insert标签后面的id熟悉是什么?
这便是我们需要像MyBatis提供的接口;
2.5、通过junit测试功能
在java文件下创建如下目录结构,用于测试;
测试代码如下:(解释都在注释中)
import com.bite.mybatis.mapper.UserMapper;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Test;
import java.io.IOException;
import java.io.InputStream;
public class MyBatisTest {
@Test
public void testInsert() throws IOException {
//获取核心配置文件的输入流
InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
//获取SqlSessionFactoryBuilder对象
SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
//获取sqlSessionFactory对象
SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(is);
//获取sql的会话对象SqlSession,是MyBatis提供操作数据库的对象
SqlSession sqlSession = sqlSessionFactory.openSession();
//获取UserMapper类的代理实现类对象
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
//调用mapper接口中的方法,实现添加用户信息的功能
int result = mapper.insertUser();
System.out.println("结果:" + result);
//提交事务(若没有commit,只会插入表中,但是不显示插入结果)
sqlSession.commit();
//关闭会话
sqlSession.close();
}
}
执行结果:
2.6、框架优化
优化一:自动提交事务(commit)
上面我们提到,若不写commit方法,是不会自动提交sql语句的,并且每次此提交都要写是很麻烦的,实际上我们在创建SqlSession会话的时候是可以指定是否自动提交的,只需要在openSession构造参数中填写true,即可实现自动提交事务~
如下代码:
import com.bite.mybatis.mapper.UserMapper;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Test;
import java.io.IOException;
import java.io.InputStream;
public class MyBatisTest {
@Test
public void testInsert() throws IOException {
//获取核心配置文件的输入流
InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
//获取SqlSessionFactoryBuilder对象
SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
//获取sqlSessionFactory对象
SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(is);
//获取sql的会话对象SqlSession(不会自动提交事务,如下),是MyBatis提供操作数据库的对象
//SqlSession sqlSession = sqlSessionFactory.openSession();
//获取sql的会话对象SqlSession(会自动提交事务,如下),是MyBatis提供操作数据库的对象
SqlSession sqlSession = sqlSessionFactory.openSession(true);
//获取UserMapper类的代理实现类对象
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
//调用mapper接口中的方法,实现添加用户信息的功能
int result = mapper.insertUser();
System.out.println("结果:" + result);
//提交事务(若没有commit,只会插入表中,但是不显示插入结果)
//sqlSession.commit();
//关闭会话
sqlSession.close();
}
}
优化二:日志功能
日志功能就是可以在我们执行代码后,会给打印一些日志信息,如:执行的sql代码,修改了几行...等等;
(1)首先先向pom.xml中加入log4j依赖
<!-- log4j日志 -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
(2)向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>
注意:如下图,这里标红,是没事的,直接点击运行没有关系:
执行效果:
三、增删改查+优化
框架优化中讲到MyBatisTest的设计,你每写一个增加、删除等功能,都需要把获取SqlSession这套流程再写一遍,相当麻烦,因此我们可以把这条流程封装成一个方法getSqlSession()专门用来获取SqlSession对象;对应的,如果我们需要实现某一功能,例如删除功能,我们就可以另外写一个@Test测试方法进行测试,方法中,通过代理实现类对象UserMapper实现对应功能即可;
如下代码:(增删改查)
SqlSessionUtil.java中实现获取SqlSession流程,以及对应的测试方法,如下:
import com.bite.mybatis.mapper.UserMapper;
import com.bite.mybatis.pojo.User;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Test;
import javax.xml.ws.RequestWrapper;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
public class SqlSessionUtil {
public static SqlSession getSqlSession() {
SqlSession sqlSession = null;
try {
//获取核心配置文件的输入流
InputStream in = Resources.getResourceAsStream("mybatis-config.xml");
//获取建造工厂方法
SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
//获取工厂对象
SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(in);
//获取SqlSession对象(设置参数为true,自动提交)
sqlSession = sqlSessionFactory.openSession(true);
} catch (IOException e) {
e.printStackTrace();
}
return sqlSession;
}
//修改数据功能
@Test
public void testUpdate() {
SqlSession sqlSession = SqlSessionUtil.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
mapper.updateUser();
sqlSession.close();
}
//删除数据
@Test
public void testDelete() {
SqlSession sqlSession = SqlSessionUtil.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
mapper.deleteUser();
sqlSession.close();
}
//查询
@Test
public void testGetUserById() {
SqlSession sqlSession = SqlSessionUtil.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
User user = mapper.getUserById();
System.out.println(user);
sqlSession.close();
}
//查询所有
@Test
public void testGetAllUser() {
SqlSession sqlSession = SqlSessionUtil.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
List<User> list = mapper.getAllUser();
list.forEach(System.out::println);
}
}
UserMapper.java中实现对应功能的接口
import com.bite.mybatis.pojo.User;
import java.util.List;
public interface UserMapper {
//添加用户信息
int insertUser();
//修改用户信息
void updateUser();
//删除用户信息
void deleteUser();
//查找数据
User getUserById();
//查询所有用户信息
List<User> getAllUser();
}
UserMapper.xml通过对应功能写入sql语句(注意查询功能有些不一样,注意看注释!)
<?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.bite.mybatis.mapper.UserMapper"> <!--这里建立映射关系-->
<!--
mapper接口和映射文件要保证两个一致
1.mapper接口的全类名和映射文件的namespace一致
2.mapper接口中的方法的方法名要和映射文件的sql的id一致
-->
<!--int insertUser();-->
<insert id="insertUser">
insert into user values(null, "admin", "123");
</insert>
<!--void updateUser-->
<update id="updateUser">
update user set username='root',password='123' where id = 2;
</update>
<!--void deleteUser-->
<delete id="deleteUser">
delete from user where id = 1;
</delete>
<!--User getUserById-->
<!--
resultType: 设置结果类型,即查询的数据要转换为的java类型
resultMap:自定义映射,处理多对一或一对多的银蛇关系
-->
<select id="getUserById" resultType="com.bite.mybatis.pojo.User">
select * from user where id = 2;
</select>
<!--List<User> getAllUser-->
<!--注意这里为什么不直接写List,因为我们还是需要先转化为实体类对象,再放入List-->
<select id="getAllUser" resultType="com.bite.mybatis.pojo.User">
select * from user;
</select>
</mapper>
四、小结——注意事项
注意:mapper接口和映射文件要保证两个一致
1.mapper接口的全类名和映射文件的namespace一致;
2.mapper接口中的方法的方法名要和映射文件的sql的id一致;
以上两点一定要注意,否则就会失败;