MyBatis快速上手
MyBatis介绍
MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。
新建maven项目
首先打开idea工具,新建一个maven项目,流程如下。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0KMsRzsI-1614395924591)(C:\Users\LiHao\Desktop\博客上传md\maven1.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bb2f8xkd-1614395924594)(C:\Users\LiHao\Desktop\博客上传md\maven2.png)]
新建完成项目后,我们需要点击手动导包
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gTeDw64j-1614395924596)(C:\Users\LiHao\Desktop\博客上传md\自动导包.png)]
在生成的maven项目文件中,点击项目名,在src中找到pom文件,并在pom文件中添加依赖。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hP4cRxMl-1614395924599)(C:\Users\LiHao\Desktop\博客上传md\添加依赖.png)]
导入依赖
<!--依赖-->
<dependencies>
<!--MyBatis核心依赖-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.6</version>
</dependency>
<!--MySql依赖-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.46</version>
</dependency>
</dependencies>
编写MyBatis配置文件
完成上述事情只是持久层框架MyBatis开发的前提步骤,下面需要完成的是MyBatis的文件配置。首先在recourses下新建mybatis-config.xml(建议小写)。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Sxh0f1U0-1614395924601)(C:\Users\LiHao\Desktop\博客上传md\新建MyBatis配置xml.png)]
打开新建xml文件,新建的MyBatis约束文件里面是空的。此时打开MyBatis官网,点击左侧入门。就可以找到有关MyBatis配置xml方法。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LCvVfFme-1614395924602)(C:\Users\LiHao\Desktop\博客上传md\配置xml.png)]
复制官网的xml配置文件,对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>
<!--环境配置 environments 中的default属性值和environment中的id名称可以任意取,只需保持一致-->
<environments default="development">
<environment id="development">
<!--type这里是JDBC,是Java的一种事务-->
<transactionManager type="JDBC"/>
<!--数据源配置信息,下面内容包含JDBC的相关配置-->
<dataSource type="POOLED">
<!--配置驱动-->
<property name="driver" value="com.mysql.jdbc.Driver"/>
<!--配置url访问的数据库 其中& 在xml文件中可以使用&转义,这里我们使用的数据库为mybatis_shine-->
<property name="url" value="jdbc:mysql://localhost:3306/mybatis_shine?characterEncoding=utf8&useSSL=false"/>
<!--用户名-->
<property name="username" value="root"/>
<!--密码-->
<property name="password" value="root"/>
</dataSource>
</environment>
</environments>
<!--mapper注册-->
<mappers>
<!--注册mapper文件的所在位置-->
<!--mapper.xml默认建议放在resource中,路径中不能以/开头-->
<mapper resource=""/>
</mappers>
</configuration>
数据库及表的创建
打开Sqlyog,或者navicat或者idea集成的数据库连接工具。执行创建mybaits_shine数据库,并创建t_user表。在表中手动添加两条记录。
-- 创建数据库,并将字符集设置为utf8
create database mybatis_shine default charset =utf8;
-- 选择数据库
use mybatis_shine;
-- 创建一张表
create table t_user(
id int primary key auto_increment, -- id主键自增长
username varchar(50), -- 姓名
password varchar(50), -- 密码
gender tinyint, -- 用0/1表示性别
regist_time datetime -- 注册时间
)default charset =utf8;
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RzZkamJr-1614395924603)(C:\Users\LiHao\Desktop\博客上传md\添加数据.png)]
代码编写
完成上述操作步骤,开始编写Java代码。在Java目录下创建多级包com.demo.entity【实体包】创建User实体类。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7ft9qY3R-1614395924604)(C:\Users\LiHao\Desktop\博客上传md\实体类创建.png)]
创建实体类,提供无参构造方法、有参构造方法、set/get方法,并重写toString方法,便于观察结果。
package com.demo.entity;
import java.util.Date;
/**
* @Author 晴天看晚霞
* @Date 2021/2/27 10:13
* @Description
* @Version 1.0
*/
public class User {
private Integer id; // ID
private String username; //用户名
private String password; //密码
private Boolean gender; //性别
private Date registTime; //注册时间
//无参构造方法
public User() {
}
//有参构造方法
public User(Integer id, String username, String password, Boolean gender, Date registTime) {
this.id = id;
this.username = username;
this.password = password;
this.gender = gender;
this.registTime = registTime;
}
//set/get方法
public Integer getId() {
return id;
}
public void setId(Integer 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 Boolean getGender() {
return gender;
}
public void setGender(Boolean gender) {
this.gender = gender;
}
public Date getRegistTime() {
return registTime;
}
public void setRegistTime(Date registTime) {
this.registTime = registTime;
}
// 重写toString方法,方便输出查看结果
@Override
public String toString() {
return "User{" +
"id=" + id +
", username='" + username + '\'' +
", password='" + password + '\'' +
", gender=" + gender +
", registTime=" + registTime +
'}';
}
}
新建持久层包及实体类接口
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lAecEAvX-1614395924604)(C:\Users\LiHao\Desktop\博客上传md\新建持久层接口.png)]
编写dao层接口
package com.demo.dao;
import com.demo.entity.User;
import java.util.List;
/**
* @Author 晴天看晚霞
* @Date 2021/2/27 10:18
* @Description
* @Version 1.0
*/
public interface UserDao {
/**
* 查询所有的用户
* @return
*/
List<User> queryAll();
}
MyBatis 是持久层多框架避免了持久层实现类的开发,我们不需要编写持久层的实现类,只需要在resources目录下配置xml即可。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SWHR6zSL-1614395924605)(C:\Users\LiHao\Desktop\博客上传md\接口xml.png)]
新建的xml接口配置文件并没有约束信息,从MyBatis官网找寻。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-T1k2wHqu-1614395924606)(C:\Users\LiHao\Desktop\博客上传md\接口xml配置模板.png)]
<?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="org.mybatis.example.BlogMapper">
<select id="selectBlog" resultType="Blog">
select * from Blog where id = #{id}
</select>
</mapper>
改写配置后,需要注意的是我们在编写成员变量时用的驼峰命名法。数据库中的regist_time 起别名为registTime才有与之对应的查询结果。
<?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:接口所在位置的全限定名称-->
<mapper namespace="com.demo.dao.UserDao">
<!--方法配置
标签select:id对应者接口中的方法名,
resultType:对应者sql语句执行完成后的结果类型,本次查询结果为实体类User,所以给出结果的全限定名称
-->
<select id="queryAll" resultType="com.demo.entity.User">
select id,username,password,gender,regist_time as registTime
from t_user
</select>
</mapper>
在写完接口的xml配置文件,将mybatis-config.xml中的信息mapper补充完整。
<?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属性值和environment中的id名称可以任意取,只需保持一致-->
<environments default="development">
<environment id="development">
<!--type这里是JDBC,是Java的一种事务-->
<transactionManager type="JDBC"/>
<!--数据源配置信息,下面内容包含JDBC的相关配置-->
<dataSource type="POOLED">
<!--配置驱动-->
<property name="driver" value="com.mysql.jdbc.Driver"/>
<!--配置url访问的数据库 其中& 在xml文件中可以使用&转义-->
<property name="url" value="jdbc:mysql://localhost:3306/mybatis_shine?characterEncoding=utf8&useSSL=false"/>
<!--用户名-->
<property name="username" value="root"/>
<!--密码-->
<property name="password" value="root"/>
</dataSource>
</environment>
</environments>
<!--mapper注册-->
<mappers>
<!--注册mapper文件的所在位置-->
<!--mapper.xml默认建议放在resource中,路径中不能以/开头-->
<mapper resource="UserDaoMapper.xml"/>
</mappers>
</configuration>
编写测试类
编写测试类,在test包新建UserDaoMapprTest测试类,
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-65I6xcOI-1614395924606)(C:\Users\LiHao\Desktop\博客上传md\新建接口测试类.png)]
新建测试类
package com.demo.test;
import com.demo.dao.UserDao;
import com.demo.entity.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 java.io.IOException;
import java.io.InputStream;
import java.util.List;
/**
* @Author 晴天看晚霞
* @Date 2021/2/27 10:52
* @Description
* @Version 1.0
*/
public class UserDaoMapperTest {
public static void main(String[] args) throws IOException {
//MyBatis API
//1.加载配置文件
InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");
//2.构建SqlSessionFactory,将MyBatista配置文件作为输入流传入build中
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//3.通过SQLSessionFactory创建SqlSession
SqlSession sqlSession = sqlSessionFactory.openSession();
//4.通过SqlSession获得Dao的实现类的对象
UserDao mapper = sqlSession.getMapper(UserDao.class);//获取UserDao实现类的对象
//5.测试查询方法
List<User> users = mapper.queryAll();
for (User user: users) {
System.out.println(user);
}
}
}
执行结果
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TWckbwJe-1614395924608)(C:\Users\LiHao\Desktop\博客上传md\执行结果.png)]
最后如果感觉mybatis的配置文件有些复制不妨将配置xml和接口xml作为模板保存起来。在idea中选择settings,打开菜单选择editor。再次选择File and Code Template。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SbwrIDzi-1614395924608)(C:\Users\LiHao\Desktop\博客上传md\创建模板.png)]
按照下图步骤创建模板
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QLrStKA4-1614395924609)(C:\Users\LiHao\Desktop\博客上传md\创建模板7步骤.png)]
方法
List<User> users = mapper.queryAll();
for (User user: users) {
System.out.println(user);
}
}
}
执行结果
[外链图片转存中...(img-TWckbwJe-1614395924608)]
最后如果感觉mybatis的配置文件有些复制不妨将配置xml和接口xml作为模板保存起来。在idea中选择settings,打开菜单选择editor。再次选择File and Code Template。
[外链图片转存中...(img-SbwrIDzi-1614395924608)]
按照下图步骤创建模板
[外链图片转存中...(img-QLrStKA4-1614395924609)]
这次在MyBatis中出现了,很多细节性的错误。由于时间关系,这里只有一个简单的查询方法。