前言
介绍一下mybatis的使用
使用步骤
1.创建项目
第一步:new一个新的工程
创建好的项目结构是这样的
2.导入依赖
刚导入的pom.xml应该是这样的
然后导入依赖包,需要什么依赖就去(https://mvnrepository.com/ )maven官网找想要的依赖。
测试mybatis用到的依赖如下
<dependencies>
<!--mysql-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.28</version>
</dependency>
<!--mybatis-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.9</version>
</dependency>
<!--junit-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.2</version>
<scope>test</scope>
</dependency>
<!--lombok-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.26</version>
</dependency>
</dependencies>
3.添加配置
首先做一下mysql数据库的相关配置
在resources下创建一个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>
<!--在控制台输出发送的sql日志-->
<setting name="logImpl" value="STDOUT_LOGGING"/>
<setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>
<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/mybatis"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
</environments>
<mappers>
<!--声明含有sql的接口所在包-->
<package name="com.itheima.mapper"/>
</mappers>
</configuration>
这里面几个注意的点:
- < setting name=“mapUnderscoreToCamelCase” value=“true”/>这个配置是开启驼峰命名的,开启这个配置后,如果数据库表中的字段名和实体类中的属性名符合驼峰映射的话,就不需要手动映射了。
MyBatis允许你在配置文件或代码中启用驼峰命名规则转换,这样它会自动将Java驼峰式命名的属性名转换成下划线风格的数据库字段名。例如,firstName会转换成first_name。 - < property name=“url” value=“jdbc:mysql://localhost:3306/mybatis”/>这行配置用于指定连接数据库的URL。这里的各个部分含义如下:
jdbc:mysql://:这是JDBC驱动程序的协议头,表明使用MySQL的JDBC驱动程序。
localhost:表示数据库服务器的地址,这里的localhost意味着数据库运行在同一台机器上。
3306:这是MySQL默认的端口号,用于监听客户端的连接请求。
mybatis:这是数据库的名字,你将连接到这个特定的数据库实例。
这里的配置指定了数据库的URL、驱动程序、用户名和密码,这些都是建立数据库连接所必需的信息。在实际应用中,你可能需要根据自己的数据库环境调整这些值,比如更换localhost为实际的服务器IP,修改端口号,以及使用正确的数据库名称、用户名和密码。 - 这一行是用来扫描指定包下的Mapper接口,以便MyBatis可以自动识别并加载这些接口对应的XML映射文件。
4.编写实体类
如上面图片所示:
在java包下创建一个公司域名的包,在这个包下创建一个domain的包,这个包就是装实体类的包(一般公司都是domain包,这个包名不固定)
package com.itheima.domain;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.time.LocalDate;
import java.time.LocalDateTime;
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Emp {
private Integer id;
private String username;
private String password;
private String name;
private String gender;
private String image;
private String job;
//注意:这四个属性跟数据表中的字段不一致
private LocalDate ed;
private Integer deptId;
private LocalDateTime createTime;
private LocalDateTime updateTime;
}
这里的字段要和数据库表的字段一一对应,起名字不必和表字段一致,但要知道实体类中的属性是什么意思。
还要注意使用的是lombok这个包(有些公司不让用),只用lombok只需要加三个注释就可以实现有参和无参构造函数,get,set方法和equals的重写
前提是pom.xml中有lombok包
5.编写mapper接口
用注释编写sql语句
使用注释增删改查的注释就是图片上的注释
注意:如果实体类名字和数据库表中的名字不一样,也不是按照驼峰命名,那么需要使用@result这个注释表明。
用xml编写sql语句
这里mapper层不需要写注释了,
xml中的代码如上。
namespace是mapper接口的全类名。注意语句标签中的id要和接口中的方法名字一样,reseltMap是解决名称不一致的,type中写的是实体类中的全类名。
用xml写sql的好处是可以使用动态sql
演示代码如下:
<update id="updateAll">
update emp
<set>
<if test="username != null and username != ''">
username = #{username},
</if>
<if test="password != null and password != ''">
password = #{password},
</if>
<if test="name != null and name != ''">
name = #{name},
</if>
<if test="gender!=null">
gender = #{gender},
</if>
<if test="image!=null and image!=''">
image = #{image},
</if>
<if test="job!=null ">
job = #{job},
</if>
<if test="ed != null">
entrydate = #{ed},
</if>
<if test="deptId != null">
dept_id = #{deptId},
</if>
<if test="createTime != null">
create_time = #{createTime},
</if>
<if test="updateTime != null">
update_time = #{updateTime},
</if>
</set>
where id = #{id}
</update>
这是if的动态sql,主要是进行判断的,符合条件的才进行sql查询
set:set元素会检查每个if语句中的条件。如果某个字段的值不为NULL,那么这个字段就会被包含在SET子句中。注意每个if语句的结尾都包含了逗号,这是因为set元素会自动移除最后一个字段后的逗号,以保证SQL语句的语法正确。
where元素的特点:
如果where元素内的任何条件都不满足,则整个where元素将被忽略,不会生成任何SQL。
如果where元素内的第一个条件满足,那么where元素会自动在生成的SQL中添加WHERE关键字。
where元素会移除它内部条件语句前的AND或OR关键字,以防止SQL语法错误。
代码如下:
<select id="selectUsers" parameterType="map" resultType="User">
SELECT * FROM users
<where>
<if test="username != null">
AND username = #{username}
</if>
<if test="email != null">
AND email = #{email}
</if>
<if test="isActive != null">
AND is_active = #{isActive}
</if>
</where>
</select>
foreach
<select id="findUsersByIds" parameterType="java.util.List" resultType="com.example.User">
SELECT * FROM users
WHERE id IN
<foreach item="item" index="index" collection="list" open="(" separator="," close=")">
#{item}
</foreach>
</select>
在这个例子中,collection属性设置为list,意味着传入的参数应该是一个List。item属性定义了一个变量item,用于表示List中的每个元素。open和close属性用于生成括号包围IN子句,而separator属性则指定了元素之间的逗号分隔符。
注意:
这个写sql的xml要放在resources,而且路径名字和上面的mapper接口名字一样
起包名要注意/的使用
5.编写测试类
编写测试类要在test/java下建包。
最好写一个util工具类
如果调用sql用这个工具类就好。
代码如下:
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;
public class MybatisUtil {
private static SqlSessionFactory sqlSessionFactory = null;
//保证SqlSessionFactory仅仅创建一次
static {
try {
//读取配置文件
InputStream stream = Resources.getResourceAsStream("SqlMapConfig.xml");
//创建SqlSessionFactory
sqlSessionFactory = new SqlSessionFactoryBuilder().build(stream);
} catch (Exception e) {
e.printStackTrace();
}
}
//获取sqlSession
public static SqlSession getSqlSession() {
return sqlSessionFactory.openSession();
}
//提交事务 关闭sqlSession
public static void close(SqlSession sqlSession) {
if (sqlSession != null) {
//提交事务
sqlSession.commit();
//释放资源
sqlSession.close();
}
}
}
接下来写测试类就可以了
代码如下:
import com.itheima.domain.Emp;
import com.itheima.mapper.EmpMapper;
import com.itheima.util.MybatisUtil;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;
import java.time.LocalDate;
public class EmpTest {
@Test
public void testFindById() {
SqlSession sqlSession = MybatisUtil.getSqlSession();
EmpMapper empMapper = sqlSession.getMapper(EmpMapper.class);
Emp emp = empMapper.findById(1);
System.out.println(emp);
MybatisUtil.close(sqlSession);
}
@Test
public void insertOne() {
SqlSession sqlSession = MybatisUtil.getSqlSession();
EmpMapper empMapper = sqlSession.getMapper(EmpMapper.class);
Emp emp = new Emp();
emp.setEd(LocalDate.of(2001,5,2));
empMapper.insertOne(emp.getEd());
MybatisUtil.close(sqlSession);
}
}
注意:要加上@Test这个注解,就可以测试了。。。