就是 ssm 那套,在xml 上面写sql
★ 基于SqlSession来实现DAO组件的方式
- MyBatis提供的Starter会自动在Spring容器中配置SqlSession(其实SqlSessionTemplate实现类)、
并将它注入其他组件(如DAO组件)
- DAO组件可直接调用SqlSession的方法来操作数据库。
- SqlSession调用insert()、update()、delete()、selectList()、selectOne()执行SQL语句时,
如果SQL语句中没有占位符参数,就只要传入第1个参数——该参数代表要执行的SQL语句;
如果要执行的SQL语句中带一个占位符参数,那就传入第2个参数——该参数用于为SQL语句中的占位符参数设置值 。
【无论是用insert、update、delete、selectXxx,第一个参数总是指定要执行的SQL语句的名字】。
▲ 开发方式
(1) 定义映射的对象类,非常普通的POJO,甚至无需任何注解。
(2)定义DAO接口。
(3)定义DAO实现类,该实现类使用SqlSession的方法来操作数据库。
(4)使用XML Mapper文件来定义SQL语句、并为SQL语句指定名字。
(5)配置XML Mapper文件的加载路径。
# 指定MyBatis的XML Mapper的加载路径
mybatis.mapper-locations=classpath*:org/crazyit/app/dao/*.xml
# 指定为org.crazyit.app.domain下的所有类指定别名,别名规则是类名首字母小写
mybatis.type-aliases-package=org.crazyit.app.domain
POJO 即 Plain Old Java Object 就是一个普通,平凡的Java对象。
POJO(Plain Old Java Object)是指普通的Java对象,它是一个简单的、基本的Java类,没有任何特殊要求或限制。POJO类通常只包含私有字段、公共访问方法(getter和setter)以及一些自定义的方法。
代码演示:
就是 ssm 那套,在xml 上面写sql
这个没什么好说的,就是比较旧的mybatis
User 类
UserDao 接口
UserDaoImpl 实现类
唯一注意一点的就是:如图
该方法: List selectList(String var1, Object var2); 参数是一个 Object,所以如果有多个参数要传给 selectList , key可以使用 Map 包起来
UserMapper.xml
命名空间对应的时候UseDao
创建和UserDao对应的Mapper文件,用来写sql,这个idea版本可以这样快速创建
UserDaoTest
测试类
application.properties
完整代码:
User
package cn.ljh.app.domain;
import lombok.Data;
//普通的java类
@Data
public class User
{
private Integer id;
private String name;
private String password;
private int age;
public User()
{
}
public User(Integer id, String name, String password, int age)
{
this.id = id;
this.name = name;
this.password = password;
this.age = age;
}
@Override
public String toString()
{
return "User{" +
"id=" + id +
", name='" + name + '\'' +
", password='" + password + '\'' +
", age=" + age +
'}';
}
}
UserDao
package cn.ljh.app.dao;
import cn.ljh.app.domain.User;
import org.apache.ibatis.annotations.*;
import java.util.List;
public interface UserDao
{
//增
int save(User user);
//删
int deleteById(Integer id);
//根据名字模糊查询
List<User> findByNameLike(String namePattern);
//根据年龄区间进行范围查询
List<User> findByAgeBetween(@Param("startAge") int startAge, @Param("endAge") int endAge);
}
UserDaoImpl
package cn.ljh.app.dao.impl;
import cn.ljh.app.dao.UserDao;
import cn.ljh.app.domain.User;
import org.apache.ibatis.session.SqlSession;
import org.springframework.stereotype.Repository;
import java.util.List;
import java.util.Map;
//作为dao组件,把这个类交给容器管理
@Repository
public class UserDaoImpl implements UserDao
{
private final SqlSession sqlSession;
//通过有参构造器进行依赖注入
public UserDaoImpl(SqlSession sqlSession)
{
this.sqlSession = sqlSession;
}
//UserMapper.xml 的命名空间
private final static String namespace = "cn.ljh.app.dao.UserDao.";
//增
@Override
public int save(User user)
{
//insert 、 delete 、 update 、select 等方法的第一个参数一直都是 SQL 语句的 ID ,就是命名空间
int insert = sqlSession.insert(namespace + "save", user);
return insert;
}
//删
@Override
public int deleteById(Integer id)
{
int delete = sqlSession.delete(namespace + "deleteById", id);
return delete;
}
//根据名字模糊查询
@Override
public List<User> findByNameLike(String namePattern)
{
List<User> users = sqlSession.selectList(namespace + "findByNameLike", namePattern);
return users;
}
//根据年龄区间进行范围查询
@Override
public List<User> findByAgeBetween(int startAge, int endAge)
{
//该方法:<E> List<E> selectList(String var1, Object var2); 参数是一个 Object
//所以如果有多个参数要传给 selectList , key可以使用 Map 包起来
List<User> users = sqlSession.selectList(namespace + "findByAgeBetween",
Map.of("startAge", startAge, "endAge", endAge));
return users;
}
}
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="cn.ljh.app.dao.UserDao">
<insert id="save">
insert into user_inf values (null , #{name} , #{password} , #{age})
</insert>
<delete id="deleteById">
delete from user_inf where user_id = #{id}
</delete>
<select id="findByNameLike" resultType="user">
select user_id as id , name , password , age from user_inf where name like #{namePattern}
</select>
<select id="findByAgeBetween" resultType="cn.ljh.app.domain.User">
select user_id as id ,name , password , age from user_inf where age between #{startAge} and #{endAge}
</select>
</mapper>
UserDaoTest
package cn.ljh.app;
import cn.ljh.app.dao.UserDao;
import cn.ljh.app.domain.User;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.CsvSource;
import org.junit.jupiter.params.provider.ValueSource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import java.util.List;
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.NONE)
public class UserDaoTest
{
@Autowired
private UserDao userDao;
//添加user对象
@ParameterizedTest
@CsvSource({"aa,xxx,2", "bb,xxx,3"})
public void testSave(String name, String password, int age)
{
//没有id,save就是添加
int save = userDao.save(new User(null, name, password, age));
System.err.println(save);
}
//根据id删除用户对象
@ParameterizedTest
@ValueSource(ints = {17})
public void testDelete(Integer id)
{
userDao.deleteById(id);
}
//根据名字模糊查询
@ParameterizedTest
@ValueSource(strings = {"孙%", "%精"})
public void testFindByNameLike(String namePattern)
{
List<User> users = userDao.findByNameLike(namePattern);
users.forEach(System.err::println);
}
//根据年龄区间进行范围查询
@ParameterizedTest
@CsvSource({"15,20", "500,1000"})
public void testFindByAgeBetween(int startAge, int endAge)
{
List<User> users = userDao.findByAgeBetween(startAge, endAge);
users.forEach(System.err::println);
}
}
application.properties
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/springboot?serverTimezone=UTC
spring.datasource.username=root
spring.datasource.password=123456
# 如果想看到SQL语句输出,需要将Mapper组件的日志级别设置为debug
logging.level.cn.ljh.app.dao=debug
# 指定 MyBatis 的 XML Mapper 的加载路径
mybatis.mapper-locations=classpath*:cn/ljh/app/dao/*.xml
# 指定为 cn.ljh.app.domain 下的所有类指定别名,别名规则是类名首字母小写
# 就是说xml的这个 resultType="user"
mybatis.type-aliases-package=cn.ljh.app.domain
pom.xml
<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.4.5</version>
</parent>
<groupId>cn.ljh</groupId>
<artifactId>MyBatis_sqlSession</artifactId>
<version>1.0.0</version>
<name>MyBatis_sqlSession</name>
<properties>
<java.version>11</java.version>
</properties>
<dependencies>
<!-- 导入 MyBatis 整合 spring boot 的 starter -->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.2.0</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<excludes>
<exclude>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</exclude>
</excludes>
</configuration>
</plugin>
</plugins>
</build>
</project>