MyBatis是Apache的一个Java开源项目,是一款支持动态SQL语句的持久化框架,支持目的是让开发人员将精力集中在SQL语句上。下面将介绍如何搭建MyBatis的开发环境。
1、下载相关jar包
需要下载的jar包:MyBatis框架jar包和JDBC数据库驱动。
MyBatis的jar包下载地址:https://github.com/mybatis/mybatis-3/releases
MySQL数据库驱动下载地址:https://dev.mysql.com/downloads/connector/j/
将下载后的jar包添加到项目中。
如果使用Maven,则pom.xml文件配置如下:
<!-- MyBatis框架 -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.4</version>
</dependency>
<!-- MySQL的JDBC数据库驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.17</version>
</dependency>
<!-- log4j日志框架 -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
2、创建数据库表
在MySQL数据库中,创建 tb_user(用户信息表),并添加测试数据。
-- 判断数据表是否存在,存在则删除
DROP TABLE IF EXISTS tb_user;
-- 创建“用户信息”数据表
CREATE TABLE IF NOT EXISTS tb_user
(
id INT AUTO_INCREMENT PRIMARY KEY COMMENT '用户编号',
user_name VARCHAR(50) NOT NULL COMMENT '用户姓名',
blog_url VARCHAR(50) NOT NULL COMMENT '博客地址',
remark VARCHAR(50) COMMENT '备注'
) COMMENT = '用户信息表';
-- 添加测试数据
INSERT INTO tb_user(user_name,blog_url,remark) VALUES('pan_junbiao的博客','https://blog.csdn.net/pan_junbiao','您好,欢迎访问 pan_junbiao的博客');
INSERT INTO tb_user(user_name,blog_url,remark) VALUES('pan_junbiao的博客_02','https://blog.csdn.net/pan_junbiao','您好,欢迎访问 pan_junbiao的博客');
3、搭建项目环境
创建Java项目,将其命名为MyBatisFirstDemo,并在项目中src下创建如下文件:
com.pjb.mybatis.datasource包:数据库连接。
com.pjb.mybatis.po包:持久层对象。
com.pjb.mybatis.sqlmap包:SQL映射配置文件。
com.pjb.mybatis.test包:测试主程序。
log4j.properties配置文件:log4j日志输出环境配置参数文件。
SqlMapConfig.xml配置文件:MyBatis配置文件。
项目结构如下图:
3.1 编写日志输出环境配置文件
编写log4j.properties配置文件,其配置信息如下:
# Global logging configuration
# 在开发环境下日志级别要设置成 DEBUG,生产环境设置为 INFO 或 ERROR
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
3.2 编写数据库连接池配置文件
编写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>
<!-- 全局配置参数 -->
<settings>
<!-- 指定 MyBatis 所用日志的具体实现,未指定时将自动查找 -->
<setting name="logImpl" value="LOG4J"/>
<!-- 开启自动驼峰命名规则(camel case)映射 -->
<setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>
<!-- 和Spring整合后environments配置将被废除 -->
<environments default="development">
<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/db_admin?useSSL=false&serverTimezone=GMT%2b8"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</dataSource>
</environment>
</environments>
<!-- 加载映射文件 -->
<mappers>
<mapper resource="com/pjb/mybatis/sqlmap/UserMapper.xml" />
</mappers>
</configuration>
3.3 编写数据交互类
(1)在com.pjb.mybatis.datasource包下,创建DataConnection.java类,用于获取数据库连接。
package com.pjb.mybatis.datasource;
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 java.io.InputStream;
/**
* 数据库连接类
* @author pan_junbiao
**/
public class DataConnection
{
private String resource = "SqlMapConfig.xml";
private SqlSessionFactory sqlSessionFactory;
private SqlSession sqlSession;
public SqlSession getSqlSession()
{
try
{
InputStream inputStream = Resources.getResourceAsStream(resource);
//创建会话工厂,传入MyBatis配置文件信息
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
sqlSession = sqlSessionFactory.openSession();
}
catch (Exception ex)
{
ex.printStackTrace();
}
return sqlSession;
}
}
(2)在com.pjb.mybatis.po包下,创建User.java类,用户信息持久化类。
package com.pjb.mybatis.po;
import java.io.Serializable;
/**
* 用户信息持久化类
* @author pan_junbiao
**/
public class User implements Serializable
{
private int id; //用户编号
private String userName; //用户姓名
private String blogUrl; //博客地址
private String remark; //备注
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 getBlogUrl()
{
return blogUrl;
}
public void setBlogUrl(String blogUrl)
{
this.blogUrl = blogUrl;
}
public String getRemark()
{
return remark;
}
public void setRemark(String remark)
{
this.remark = remark;
}
}
(3)在com.pjb.mybatis.sqlmap包下,创建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="test">
<!-- 根据用户编号,查询单个用户实体 -->
<select id="findUserById" parameterType="int" resultType="com.pjb.mybatis.po.User">
SELECT * FROM tb_user WHERE id = #{id}
</select>
<!-- 根据用户名称,模糊查询用户列表 -->
<select id="findUserByUserName" parameterType="java.lang.String" resultType="com.pjb.mybatis.po.User">
SELECT * FROM tb_user WHERE user_name LIKE '%${value}%'
</select>
<!-- 新增用户 -->
<insert id="insertUser" parameterType="com.pjb.mybatis.po.User">
INSERT INTO tb_user(user_name,blog_url,remark)
VALUES(#{userName},#{blogUrl},#{remark});
</insert>
<!-- 修改用户 -->
<update id="updateUser" parameterType="com.pjb.mybatis.po.User">
UPDATE tb_user SET user_name = #{userName} ,blog_url=#{blogUrl} ,remark=#{remark} WHERE id = #{id}
</update>
<!-- 删除用户 -->
<delete id="deleteUser" parameterType="java.lang.Integer">
DELETE FROM tb_user WHERE id = #{id}
</delete>
</mapper>
3.4 编写测试用例
在com.pjb.mybatis.test包下,创建MyBatisTest.java类,并编写相关测试用例。
3.4.1 查询操作(查询单个实体)
/**
* 根据用户编号,查询单个用户实体
*/
public static void findUserByIdTest()
{
DataConnection dataConnection = new DataConnection();
SqlSession sqlSession = dataConnection.getSqlSession();
User user = sqlSession.selectOne("test.findUserById",1);
System.out.println("用户编号:"+user.getId());
System.out.println("用户姓名:"+user.getUserName());
System.out.println("博客地址:"+user.getBlogUrl());
System.out.println("备注信息:"+user.getRemark());
sqlSession.close();
}
执行结果:
3.4.2 查询操作(查询多个实体)
/**
* 根据用户名称,模糊查询用户列表
*/
public static void findUserByUserNameTest()
{
DataConnection dataConnection = new DataConnection();
SqlSession sqlSession = dataConnection.getSqlSession();
List<User> userList = sqlSession.selectList("test.findUserByUserName","pan_junbiao的博客");
for (User user : userList)
{
System.out.println("用户编号:"+user.getId());
System.out.println("用户姓名:"+user.getUserName());
System.out.println("博客地址:"+user.getBlogUrl());
System.out.println("备注信息:"+user.getRemark());
}
sqlSession.close();
}
执行结果:
关于selectOne()与selectList()方法:在加载SQL映射文件中的某个SQL配置时,可以调用SqlSession类提供的方法。在使用查询语句时,如果查询的数据时唯一的,也就是只有一条数据,那么可以使用selectOne()方法进行查询。如果查询的数据可能多于一条,那么可以使用selectList()方法进行查询。
3.4.3 新增操作
/**
* 新增用户
*/
public static void insertUserTest()
{
DataConnection dataConnection = new DataConnection();
SqlSession sqlSession = dataConnection.getSqlSession();
User user = new User();
user.setUserName("pan_junbiao的博客");
user.setBlogUrl("https://blog.csdn.net/pan_junbiao");
user.setRemark("您好,欢迎访问 pan_junbiao的博客");
int result = sqlSession.insert("test.insertUser",user);
sqlSession.commit();
sqlSession.close();
System.out.println("新增用户完成!");
System.out.println("新增结果:" + result);
}
执行结果:
3.4.4 修改操作
/**
* 修改用户
*/
public static void updateUserTest()
{
DataConnection dataConnection = new DataConnection();
SqlSession sqlSession = dataConnection.getSqlSession();
User user = new User();
user.setId(3);
user.setUserName("pan_junbiao的博客_002");
user.setBlogUrl("https://blog.csdn.net/pan_junbiao");
user.setRemark("您好,欢迎访问 pan_junbiao的博客_002");
int result = sqlSession.update("test.updateUser",user);
sqlSession.commit();
sqlSession.close();
System.out.println("修改用户完成!");
System.out.println("修改结果:" + result);
}
执行结果:
3.4.5 删除操作
/**
* 删除用户
*/
public static void deleteUserTest()
{
DataConnection dataConnection = new DataConnection();
SqlSession sqlSession = dataConnection.getSqlSession();
int result = sqlSession.update("test.deleteUser", 3);
sqlSession.commit();
sqlSession.close();
System.out.println("删除用户完成!");
System.out.println("删除结果:" + result);
}
执行结果: