mybatis单框架实现数据库新增、删除、修改
1 准备工作
1.1 导入依赖
<dependencies>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.9</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.29</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.24</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.2</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
</dependencies>
1.2 配置java文件夹和resource资源文件夹都能输出到target目录中
<build>
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/**</include>
</includes>
</resource>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/**</include>
</includes>
</resource>
</resources>
</build>
1.3 创建需要查询的实体类(全部引用数据类型)
package entity;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@AllArgsConstructor
@NoArgsConstructor
@Data
public class Emp {
private Integer empno;
private String ename;
private String job;
private Integer mgr;
private String hiredate;
private Double sal;
private Double comm;
private Integer deptno;
}
1.4 在resource资源文件夹下面创建jdbc.properties文件
# key-value 形式的文件 笔者使用的是mysql8
jdbc.driver=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql://127.0.0.1:3306/数据库名称
jdbc.username=账户
jdbc.password=密码
1.5 在resource资源文件夹下创建log4j.properties文件
#代表root节点整个工程下所有输出日志的地方配置的输出的级别和输出的位置。
log4j.rootLogger=DEBUG,Console,D
#代表配置控制台的类。
log4j.appender.Console=org.apache.log4j.ConsoleAppender
log4j.appender.Console.layout=org.apache.log4j.PatternLayout
log4j.appender.Console.layout.ConversionPattern=%d [%t] %-5p [%c] - %m%n
log4j.logger.org.apache=INFO
log4j.logger.java.sql.ResultSet=INFO
log4j.logger.java.sql.Connection=DEBUG
log4j.logger.java.sql.Statement=DEBUG
log4j.logger.java.sql.PreparedStatement=DEBUG
### 输出到日志文件 ###
log4j.appender.D = org.apache.log4j.DailyRollingFileAppender
log4j.appender.D.File = logs/mybatis.log
log4j.appender.D.Append = true
log4j.appender.D.Threshold = DEBUG
log4j.appender.D.layout = org.apache.log4j.PatternLayout
log4j.appender.D.layout.ConversionPattern =%-d{yyyy-MM-dd HH\:mm\:ss} [ %t\:%r ] - [ %p ] %m%n
1.6 在resource资源文件夹下面创建mybatis-config.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>
<properties resource="jdbc.properties"></properties>
<typeAliases>
<package name="entity"/>
</typeAliases>
<environments default="mysql">
<environment id="mysql">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</dataSource>
</environment>
</environments>
<mappers>
<package name="mapper"/>
</mappers>
</configuration>
注意: mybatis-config.xml文件中导入jdbc.properties文件的指令
<properties resource="jdbc.properties"></properties>
1.7 创建SqlSessionFactoryFactory工具类
package util;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import java.io.InputStream;
public class SqlSessionFactoryUtil {
private static String resource = "mybatis-config.xml";
private static SqlSessionFactory sf=null;
static {
try {
InputStream inputStream = Resources.getResourceAsStream(resource);
sf = new SqlSessionFactoryBuilder().build(inputStream);
} catch (Exception e) {
e.printStackTrace();
}
}
public static SqlSessionFactory sf(){
return sf;
}
}
1.8 创建EmpMapper接口和EmpMapper.xml文件
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/4cef90486e12acf56f0e5e76ca27c500.png)
1.9 主配置文件引入其他配置文件(扫描该配置文件的根目录)
<mappers>
<package name="mapper"/>
</mappers>
2 新增insert
2.1 在EmpMapper接口中的方法名
int add(Emp e);
2.2 在EmpMapper.xml中准备的sql语句
<insert id="add" useGeneratedKeys="true" keyProperty="empno">
insert into emp values(null,#{ename},#{job},#{mgr},#{hiredate},#{sal},#{comm},#{deptno})
</insert>
2.3 在test文件夹下写的测试代码
@org.junit.Test
public void t3(){
SqlSessionFactory sf = SqlSessionFactoryUtil.sf();
SqlSession sqlSession = sf.openSession();
EmpMapper em = sqlSession.getMapper(EmpMapper.class);
Emp emp=new Emp(null,"小王","经理",1234,null,5000D,null,10);
em.add(emp);
System.out.println("添加后:"+emp);
sqlSession.commit();
sqlSession.close();
}
2.4 新增结果
2.4.1 添加之前 emp表截图
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/f1a2f21f698753899de173106f00a24f.png)
2.4.2 运行截图
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/e63348e11fceaa4019f08a65cc832d5c.png)
2.4.3 添加之后emp表截图
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/6a682f46aeb6947c87a4a7a0cf960538.png)
2.5 知识点总结
注意:新增时若某一字段设置了自动增长,那么插入的是null值的,得到的结果就算最新的自动增长的那个数字
设置了useGeneratedKeys="true" keyProperty="empno"就会自动回填到你填写的参数中
另外你传入的是实参是对象,那么可以通过#{}的方式去获取实参里面的每一个属性值
3 删除delete
3.1 在EmpMapper接口中的方法名
int delete(int id);
3.2 在EmpMapper.xml中准备的sql语句
<insert id="delete">
delete from emp WHERE empno=#{id}
</insert>
3.3 在test文件夹下写的测试代码
public void t4(){
SqlSessionFactory sf = SqlSessionFactoryUtil.sf();
SqlSession sqlSession = sf.openSession();
EmpMapper em = sqlSession.getMapper(EmpMapper.class);
em.delete(8889);
sqlSession.commit();
sqlSession.close();
}
3.4 删除结果
3.4.1 删除之前
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/f373169dfefdb6fac062dcab8c801736.png)
3.4.2 运行截图
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/aa124f7546c566259fa252c03e36f5c6.png)
3.4.2 删除之后
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/7dc4a6b60e359ad0d6b460c9cec97b11.png)
3.5 知识点总结
sqlSession.commit();这是设置了该事务提交,因为transactionManager type="JDBC"是默认是手动提交的
不写这句话的话,数据库是不会产生任何变化的
4 修改update
4.1 在EmpMapper接口中的方法名
int update(Emp e);
4.2 在EmpMapper.xml中准备的sql语句
<update id="update">
update emp set ename=#{ename},job=#{job},mgr=#{mgr},hiredate=#{hiredate},sal=#{sal},
comm=#{comm},deptno=#{deptno}
where empno=#{empno}
</update>
4.3 在test文件夹下写的测试代码
@org.junit.Test
public void t5(){
SqlSessionFactory sf = SqlSessionFactoryUtil.sf();
SqlSession sqlSession = sf.openSession();
EmpMapper em = sqlSession.getMapper(EmpMapper.class);
Emp emp=new Emp(8890,"张三","哈哈哈",1234,"2019-08-03",8888d,6666d,20);
em.update(emp);
sqlSession.commit();
sqlSession.close();
}
4.4 修改结果
4.4.1 修改之前
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/b083ff4814fe76ab39f9f0d53723e24f.png)
4.4.2 运行截图
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/5e693c250cb9e9c98596d8db8d9cc40e.png)
4.4.2 修改之后
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/a23e764ea8bc27d847f7dbe6d1baed7a.png)
3.5 知识点总结
若你传入的参数是实体类的对象,对应的xml文件中的update标签中可以通过#{实体类属性名}来获取里面的对应的值
${实体类属性名}也是可以获取的值,正如之前所提到的,这个因为安全性的问题,使用场景一般是模糊查找