前言:
网上很多博客讲的都太简略了,对很多刚接触的朋友很不友好,所以做了一个从零开始的傻瓜式教程。直接开始教程吧就。
过程:
第一步:创建一个新的maven项目。
file/New/Project...
注意点:JDK版本不能选择18这种不支持STL的版本,这里可以选择11版本,就是把文件下了就行,如果用18版本可能会出现pom.xml为空以及没有src目录的问题,这点要非常注意。看那个Project SDK!
什么都不选直接点Next
到这一步直接取名字就可以了,注意一下文件路径改不改,尽量不要用中文,开头字母也尽量不要大写。然后点击Finish
这就是新建的一个正常的maven项目,如果你出现了pom为空的问题可以去看看JDK版本
如果一切正常就开始下一步。
第二步:创建数据库
我用的sqlyog,这里我的数据库名是user,建的表也是user ,这里没啥说的,
注意:在创建数据库的时候记得选编码格式,自动可能会出现中文无法输入的问题。我选择的是utf8mb4。
下面是user表的细节。最开始在完全不会的时候建议别改,后面会了随便改,害怕改了后面程序运行不下来。这里是直接图形化的,直接用sql语句写也没啥强调的点。
最后的结构是这样
当你数据表建好之后就进入下一步。
第三步:导入必要的pom依赖。
下面的代码直接复制,然后粘贴到pom.xml里面。注意一下mysql的version,这个最方便的方法就是看你下载的mysql文件夹,后面数字就是你的版本,至于其他两个没出问题就不用修改。
<dependencies>
<!--mybatis核心包-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.9</version>
</dependency>
<!--mysql驱动包-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.30</version>
</dependency>
<!-- 单元测试 -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.24</version>
</dependency>
</dependencies>
就复制到这就行了。
会报错但不用管!这个是里面一个插件有问题,不干扰正常使用
第四步:创建目录结构
位置在src/main/java/下面
取名字建议取com.XXX,XXX为你的项目名字。
这里我取的是com.yue
创建完之后在这个包下面创建entity目录,mapper目录,和test三个目录,目录如下
目录结构创建完就可以进行下一步。
第五步:完善entity目录
在entity目录下创建一个Userentity.java文件。
复制下面代码这里package调成自己的包名,我是因为中间是yue所以才是这样,里面的类里面三个元素名字注意和你的数据库表的内容一样,这样能避免很多问题。(这点很重要)
entity起到的作用就是把你的元素声明一下,不涉及函数。
package com.yue.entity;
import lombok.Data;
@Data
public class Userentity {
private int id;
private String username;
private String pwd;
}
这一步结束就到下一步。
第六步:完善mapper目录
创建一个Usermapper.inferface,还是点创建Java,但选下面那个就是了
复制代码
package com.yue.mapper;
import com.yue.entity.Userentity;
import org.apache.ibatis.annotations.Param;
import java.util.List;
import java.util.List;
public interface Usermapper {
int save(Userentity userEntity);
int delete(int id);
int update(@Param("username") String name ,@Param("pwd") String password);
List<Userentity> Quary(String name);
}
Usermapper.inferface起到的作用就是声明你要用的函数,这里是抽象类的。
这一步完成之后创建一个UserDao.java,还是在这个目录下,这个是为了方便后面进行增删改查,对这些内容进行一个抽象封装这里面实现的内容就不详细解释了,下次有时间再说。
复制代码:
package com.yue.mapper;
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 com.yue.entity.Userentity;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
public class UserDao {
public void saves(String name,String pwd){
try {
String resource="mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream);
SqlSession session=sqlSessionFactory.openSession();
Usermapper mapper=session.getMapper(Usermapper.class);
Userentity userEntity=new Userentity();
userEntity.setUsername(name);
userEntity.setPwd(pwd);
int i=mapper.save(userEntity);
if (i>0){
System.out.println("成功");
session.commit();
}
else {
System.out.println("失败");
}
}catch (IOException e){
e.printStackTrace();
}
}
public void Del(int id){
try {
String resource="mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream);
SqlSession session=sqlSessionFactory.openSession();
Usermapper mapper=session.getMapper(Usermapper.class);
int j = mapper.delete(id);
if (j>0){
System.out.println("成功");
session.commit();
}
else {
System.out.println("失败");
}
}catch (IOException e){
e.printStackTrace();
}
}
public void change(String username,String pwd){
try {
String resource="mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream);
SqlSession session=sqlSessionFactory.openSession();
Usermapper mapper=session.getMapper(Usermapper.class);
int s = mapper.update(username,pwd);
if(s == 1){
System.out.println("修改成功");
session.commit();
}else{
System.out.println("表中无此数据");
}
}catch (IOException e){
e.printStackTrace();
}
}
public void search(String name){
try {
String resource="mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream);
SqlSession session=sqlSessionFactory.openSession();
List<Userentity> list = session.getMapper(Usermapper.class).Quary(name);
for(Userentity userEntity : list){
System.out.println("序号:"+userEntity.getId()+" 用户名:"+userEntity.getUsername()+" 密码:"+userEntity.getPwd());
}
}catch (IOException e){
e.printStackTrace();
}
}
}
文件目录为:
当文件目录这个样子的时候就可以进行下一步了
第六步:完善resources
在这下面创建xml而不是在其他地方就是因为这个地方优先搜索,其他地方还要注意文件路径。
创建两个xml文件
一个是mybatis-config.xml,一个是Usermapper.xml
第一个文件内容是连接数据库,里面要修改的地方就是数据库名和密码等。
username和password选自己的就行了,然后url要注意的就是localhost:3306/user的user是只你的数据库,至于后面是编码格式,时区等,不需要进行修改。
下面的<mapper resource就是你的另一个xml,如果你不放在resource目录下就要考虑很复杂的文件路径问题,建议不要考虑
<?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/user?characterEncoding=UTF-8&serverTimezone=UTC"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="Usermapper.xml"></mapper>
</mappers>
</configuration>
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.yue.mapper.Usermapper">
<insert id="save" parameterType="com.yue.entity.Userentity">
INSERT INTO user (username,pwd)VALUES (#{username},#{pwd})
</insert>
<delete id="delete" parameterType="com.yue.entity.Userentity">
delete from user where id=#{id}
</delete>
<update id="update" parameterType="com.yue.entity.Userentity">
update user set pwd=#{pwd} where username=#{username}
</update>
<select id="Quary" parameterType="com.yue.entity.Userentity" resultType="com.yue.entity.Userentity">
select * from user where username=#{username}
</select>
</mapper>
如果你的数据库的内容和你在最开始写的东西不一样,也就是entity.java不一样,会报错,要整一个resultMap什么的,很复杂,所以建议不要不一样。
这两个文件创建完之后就可以进行下一步了,也是最后一步。
第六步:创建测试文件
在test目录下创建一个MybitsTest.java文件,目录结构为
当你有这样的文件路径之后就马上结束了,复制以下代码在该java文件。运行测试一下增删改查的功能就可以了。
package com.yue.test;
import com.yue.mapper.UserDao;
public class MybitsTest {
public static void main(String[] args) {
//声明一个Dao的对象
UserDao userDao = new UserDao();
//增加
userDao.saves("编号1","1234");
//删除
userDao.Del(8);
//修改
userDao.change("st","11122");
//查找
userDao.search("st");
}
}
正常的运行结果
当你看到这种运行结果就说明没问题了。恭喜实现了功能,下面详细介绍一下增删改查的具体实现。
本身的运行逻辑就在于:在Userentity和Usermapper里面分别声明你的变量和函数,然后在mybatis-config.xml里面连数据库,在Usermapper.xml里面写具体的函数语句,也就是把抽象函数实例化,最后因为嫌测试起来重复的太多,就直接写一个UserDao,在里面把增删改查操作封装一下。最后在test文件里创建一个Dao的实例对象,调用函数即可。
增:
public void saves(String name,String pwd){
try {
String resource="mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream);
SqlSession session=sqlSessionFactory.openSession();
Usermapper mapper=session.getMapper(Usermapper.class);
Userentity userEntity=new Userentity();
userEntity.setUsername(name);
userEntity.setPwd(pwd);
int i=mapper.save(userEntity);
if (i>0){
System.out.println("成功");
session.commit();
}
else {
System.out.println("失败");
}
}catch (IOException e){
e.printStackTrace();
}
}
1,先导入了连接数据库的资源文件,也就是mybatis-config.xml,这几行可以当作固定搭配,不变直接复制即可
String resource="mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream);
SqlSession session=sqlSessionFactory.openSession();
2,然后根据情况,如果是增删改这种操作类的,就是下面这个
Usermapper mapper=session.getMapper(Usermapper.class);
如果是查找就是这个
List<Userentity> list = session.getMapper(Usermapper.class).Quary(name);
在前面这些完成之后就可以创建一个实例对象然后设置一下,因为开始我们save函数传参传的就是userEntity对象。
Userentity userEntity=new Userentity();
userEntity.setUsername(name);
userEntity.setPwd(pwd);
在这些都设定好的情况下,直接通过mapper对象调用函数,用int承接判断状态,如果>0就提交,f反之就失败,这是根据返回值来判断。
int i=mapper.save(userEntity);
if (i>0){
System.out.println("成功");
session.commit();
}
else {
System.out.println("失败");
}
最后把这一系列操作放在try...catch里面就结束。
对应的Usermapper的sql语句是
<insert id="save" parameterType="com.yue.entity.Userentity">
INSERT INTO user (username,pwd)VALUES (#{username},#{pwd})
</insert>
删:这个和增唯一的区别就是调用函数的那一行,和sql语句,没啥好说的
int j = mapper.delete(id);
对应的Usermapper的sql语句是
<delete id="delete" parameterType="com.yue.entity.Userentity">
delete from user where id=#{id}
</delete>
改:我的改是通过名字修改密码,所以传入两个参数,这里要注意的点就是,如果要传入两个参数,在 Usermapper声明函数的时候要用@Param声明。括号里面的是Userentity对应的,如果不这样会报错。
代码唯一变得差不多也就这,还有判断变成了是否判1
int s = mapper.update(username,pwd);
对应的Usermapper的sql语句是
<update id="update" parameterType="com.yue.entity.Userentity">
update user set pwd=#{pwd} where username=#{username}
</update>
查:
public void search(String name){
try {
String resource="mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream);
SqlSession session=sqlSessionFactory.openSession();
List<Userentity> list = session.getMapper(Usermapper.class).Quary(name);
for(Userentity userEntity : list){
System.out.println("序号:"+userEntity.getId()+" 用户名:"+userEntity.getUsername()+" 密码:"+userEntity.getPwd());
}
}catch (IOException e){
e.printStackTrace();
}
}
查的变化很大,因为可能要承接很多,所以前面代码也从
Usermapper mapper=session.getMapper(Usermapper.class);
变成用List承接的
List<Userentity> list = session.getMapper(Usermapper.class).Quary(name);
然后还得输出,输出就用遍历把list都输出一下就好了
for(Userentity userEntity : list){
System.out.println("序号:"+userEntity.getId()+" 用户名:"+userEntity.getUsername()+" 密码:"+userEntity.getPwd());
}
对应的Usermapper的sql语句是
<select id="Quary" parameterType="com.yue.entity.Userentity" resultType="com.yue.entity.Userentity">
select * from user where username=#{username}
</select>
结语:
里面一些可能报错的点都提出来了,如果还有问题可以评论区讨论。个人感觉这个过程和直接用jdbc连接数据库操作可能不太一样,但本质上是一样的,不同之处只是把过程给拆开放在了不同的文件进行处理,像是Userentity.java这个文件放的就只是存的变量,Usermapper.java放的也只是声明,而xml文件里本质就一个连数据库的xml,还有一个实例化Usermapper.java里面函数的Usermapper.xml,其他的Dao只是把整体的实现封装了一下,让在test里面展现的时候更简单一些而已,本质上逻辑没有太大变化。