Mybatis基础环境搭建
插件安装
-
Free Mybatis plugin:用来进行Mapper之间的相互跳转
会提示你没有写映射,可以直接点击下面的MybatisGenerator生成
就会在mapper文件中自动生成这一行,然后我们直接写sql语句就行
-
Lombok:写实体类的辅助
搭建环境
1.建立数据库
![image-20210102152004430](https://i-blog.csdnimg.cn/blog_migrate/ad267aa17b58126c97fba0713e44f924.png)
2.新建一个maven工程
引入相关依赖
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.example</groupId>
<artifactId>mybatis</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
</properties>
<dependencies>
<!--mybatis核心-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.2</version>
</dependency>
<!--lombok-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.2</version>
</dependency>
<!--单元测试-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13</version>
<scope>test</scope>
</dependency>
<!--数据库驱动-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.47</version>
</dependency>
</dependencies>
<build>
<plugins>
<!--修改jdk版本-->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
</plugins>
</build>
</project>
编写MyBatis核心配置文件
约定俗称的名字是mybatis-config.xml
要在resources里自己新建
![image-20210102153815299](https://i-blog.csdnimg.cn/blog_migrate/36eb0b92954977165c674df3f72fcef1.png)
写一下配置文件的模板,下次可以自动生成
https://www.cnblogs.com/wessonshin/p/12675098.html
模板
<?xml version="1.0" encoding="UTF-8" ?>
<!--这个文件头规定了接下来的xml该怎么写-->
<!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.jdbc.Driver"/>
<property name="url" value="${url}"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
</environments>
</configuration>
编写相关测试代码
package com.xinzhi.entity;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
/**
* @author SJ
* @date 2021/1/2
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User implements Serializable {
private int id;
private String username;
private String password;
}
package com.xinzhi.dao;
import com.xinzhi.entity.User;
import java.util.List;
/**
* @author SJ
* @date 2021/1/2
*/
public interface UserMapper {
/**
* 查询所有用户信息
* @return
*/
List<User> selectUsers();
}
mybatis里dao层的接口通常用xxxMapper来命名
在Resources里面新建mappers包专门用来存放mapper。
我们mapper也是需要建立的配置文件,我们可以写模板,下自自动生成。
![image-20210102165751510](https://i-blog.csdnimg.cn/blog_migrate/96f95a1dace73fdea257944d85ccbf54.png)
为刚刚的selectUsers建立UserMapper
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Xfl40kXp-1609838496815)(https://i.loli.net/2021/01/05/3YljFBMp15gzGKP.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">
<!--namespace指向接口-->
<mapper namespace="com.xinzhi.dao.UserMapper">
<select id="selectUsers" resultType="com.xinzhi.entity.User">
select id,username,password
from user;
</select>
</mapper>
配置文件中的namespace中的名称对应Mapper接口或者Dao接口的完整包名。
在mybatis-config.xml中注册该mapper
<mappers>
<mapper resource="mappers/UserMapper.xml"/>
</mappers>
测试
import com.xinzhi.dao.UserMapper;
import com.xinzhi.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 org.junit.Test;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
/**
* @author SJ
* @date 2021/1/2
*/
public class TestUser {
@Test
public void testSelectUsers(){
String resources="mybatis-config.xml";
InputStream inputStream= null;
try {
inputStream = Resources.getResourceAsStream(resources);
} catch (IOException e) {
e.printStackTrace();
}
//打开一个连接和服务器进行对话的过程就叫一个会话
SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream);
//开启会话
SqlSession session = sqlSessionFactory.openSession();
//通过这个接口拿到这个接口的代理对象
UserMapper mapper = session.getMapper(UserMapper.class);
//有了代理对象之后就能调用方法
List<User> users = mapper.selectUsers();
for (User user : users) {
System.out.println(user);
}
//sql开启了之后需要提交事务
session.commit();
//关闭会话
session.close();
}
}
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Drw9pbDr-1609838496820)(https://i.loli.net/2021/01/05/KQaNpCzSx5fmFuh.png)]
步骤总结:
- 定义操作接口
- 根据接口写映射文件
- 在在mybatis-config.xml中注册该映射文件
CRUD实现
1.通过id查询用户
- 定义接口
/**
* 根据id查询用户
* @param id
* @return
*/
User selectUserById(int id);
-
写映射文件中写sql
参数用#{ }传递
<select id="selectUserById" resultType="com.xinzhi.entity.User">
select id,username,password
from user
where id=#{id}
</select>
- 还是在UserMapper这个文件中写的,上面已经在配置文件里注册过了
测试:
User user = mapper.selectUserById(1);
System.out.println(user);
![image-20210102194702512](https://i-blog.csdnimg.cn/blog_migrate/909adc071d8625515390a10f2bc9084f.png)
优化Test
import com.xinzhi.dao.UserMapper;
import com.xinzhi.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 org.junit.After;
import org.junit.Before;
import org.junit.Test;
import java.io.IOException;
import java.io.InputStream;
/**
* @author SJ
* @date 2021/1/2
*/
public class TestUser {
SqlSession session;
@Before
public void before(){
String resources="mybatis-config.xml";
InputStream inputStream= null;
try {
inputStream = Resources.getResourceAsStream(resources);
} catch (IOException e) {
e.printStackTrace();
}
//打开一个连接和服务器进行对话的过程就叫一个会话
SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream);
//开启会话
session = sqlSessionFactory.openSession();
}
@Test
public void testSelectUsers(){
//通过这个接口拿到这个接口的代理对象
UserMapper mapper = session.getMapper(UserMapper.class);
//有了代理对象之后就能调用方法
/* List<User> users = mapper.selectUsers();
for (User user : users) {
System.out.println(user);
}*/
User user = mapper.selectUserById(1);
System.out.println(user);
}
@After
public void after(){
//sql开启了之后需要提交事务
session.commit();
//关闭会话
session.close();
}
}
在执行test之前执行before
在执行test之后执行after
这样就可以写多个test了
mapper理解
<select id="selectUserById" resultType="com.xinzhi.entity.User">
select id,username,password
from user
where id=#{id}
</select>
- id:这条sql对应的是哪个方法
- resultType:返回值类型(如果查询有结果的话)
- parameterType:参数类型(如果有参数的话)
- #{id}:sql中的变量,要保证大括号中的变狼必须在User对象里有
#{ }和${ }的区别
#{ }相当于占位符(更推荐)
${ }相当于字符串拼串
2.插入用户
/**
* 增加用户
* @param user
*/
void saveUser(User user);
<insert id="saveUser" parameterType="com.xinzhi.entity.User">
insert into user (username,password) values(#{username},#{password})
</insert>
@Test
public void testSaveUser(){
UserMapper mapper = session.getMapper(UserMapper.class);
mapper.saveUser(new User(6,"zhangsan","123"));
}
![image-20210102202452827](https://i-blog.csdnimg.cn/blog_migrate/a2d23848293268bcfc94ac72a3beb2e0.png)
3.修改用户
/**
* 更新用户信息
* @param user
*/
//如果返回值是int 返回的就是受影响的行数
void updateUser(User user);
<update id="updateUser" parameterType="com.xinzhi.entity.User">
update user set username=#{username} , password=#{password}
where id=#{id}
</update>
@Test
public void testUpdateUser(){
UserMapper mapper = session.getMapper(UserMapper.class);
mapper.updateUser(new User(4, "张丰", "123"));
}
4.删除用户
/**
* 删除用户
* @param id
*/
void deleteUser(int id);
<delete id="deleteUser">
delete from user where id=#{id}
</delete>
@Test
public void testDeleteUser(){
UserMapper mapper = session.getMapper(UserMapper.class);
mapper.deleteUser(5);
}
![image-20210102204034490](https://i-blog.csdnimg.cn/blog_migrate/8f8085ad7ad585f251be437df7681366.png)
基于注解的CRUD
不用写mapper.xml
方法上面写sql语句
package com.xinzhi.dao;
import com.xinzhi.entity.Admin;
import org.apache.ibatis.annotations.Delete;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.Update;
import java.util.List;
/**
* @author SJ
* @date 2021/1/2
*/
public interface AdminMapper {
/**
* 查询所有用户信息
* @return
*/
@Select("select id,username,password from admin ")
List<Admin> selectAdmins();
/**
* 根据id查询用户
* @param id
* @return
*/
@Select("select id,username,password from admin where id=#{id}")
Admin selectAdminById(int id);
/**
* 增加用户
* @param Admin
*/
@Insert("insert into admin (username,password) values(#{username},#{password})")
int saveAdmin(Admin Admin);
/**
* 更新用户信息
* @param Admin
*/
@Update("update admin set username=#{username} , password=#{password} where id=#{id}")
void updateAdmin(Admin Admin);
/**
* 删除用户
* @param id
*/
@Delete("delete from admin where id=#{id}")
void deleteAdmin(int id);
}
然后用类名在配置文件中注册mapper
<mapper class="com.xinzhi.dao.AdminMapper"/>
- @param Admin
*/
@Insert(“insert into admin (username,password) values(#{username},#{password})”)
int saveAdmin(Admin Admin);
/**
* 更新用户信息
* @param Admin
*/
@Update("update admin set username=#{username} , password=#{password} where id=#{id}")
void updateAdmin(Admin Admin);
/**
* 删除用户
* @param id
*/
@Delete("delete from admin where id=#{id}")
void deleteAdmin(int id);
}
然后用类名在配置文件中注册mapper
```xml
<mapper class="com.xinzhi.dao.AdminMapper"/>
![image-20210102205853715](https://i-blog.csdnimg.cn/blog_migrate/a3d34280f9a1e444ce4be1ca429999de.png)