mybatis单框架实现数据库新增、删除、修改
mybatis单框架实现数据库新增、删除、修改
·
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>
<!--lombok-->
<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>
<!--测试的范围 只能在test模块使用 单元测试必须要用4以上的版本-->
<scope>test</scope>
</dependency>
<!--加载日志的信息 log4j日志-->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
</dependencies>
1.2 配置java文件夹和resource资源文件夹都能输出到target目录中
<build>
<!--配置xml文件能够编译输出到target java和resources文件夹都配置-->
<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
//属性必须是引用数据类型 数据库Null值 动态sql都是判断属性是否为空
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>
<!--引入jdbc配置文件 引入文件后就能调用里面的值了-->
<properties resource="jdbc.properties"></properties>
<!--以类名作为别名 都是.的形式 让resultType写的短一些-->
<typeAliases>
<package name="entity"/>
</typeAliases>
<!--环境选择 default是谁 就选谁,只能选择一个-->
<environments default="mysql">
<!--多种环境之一 上面的id要与default里面的值要保持一致-->
<environment id="mysql">
<!--事物管理器 JDBC 使用JDBC管理事务(事物提交是自动的)
MANAGED Spring容器去提交-->
<transactionManager type="JDBC"/>
<!--dataSource数据源 连接数据库的对象
unPooled是没有连接池的
POOLED是连接池的 pool游泳
JNDi外部容器管理连接-->
<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>
<!--加载mapper文件-->
<mappers>
<!-- <mapper resource="mapper/EmpMapper.xml"/>-->
<!--扫描mapper接口的 该方式接口必须与mapper.xml文件名完全一致 且同一目录-->
<package name="mapper"/>
</mappers>
</configuration>
注意: mybatis-config.xml文件中导入jdbc.properties文件的指令
<!--引入jdbc配置文件 引入文件后就能调用里面的值了-->
<properties resource="jdbc.properties"></properties>
<!--若有多级目录,resource里面可以写成目录路径/文件名 如temp/jdbc.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 {
/*加载主配置文件 得到SqlSessionFactory对象
* 该对象是一个连接工厂对象
* */
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文件
1.9 主配置文件引入其他配置文件(扫描该配置文件的根目录)
<!--加载mapper文件 mappeer是EmpMapper.xml文件的根目录-->
<mappers>
<package name="mapper"/>
</mappers>
2 新增insert
2.1 在EmpMapper接口中的方法名
int add(Emp e);
2.2 在EmpMapper.xml中准备的sql语句
<!--useGeneratedKeys= 注解回填 keyProperty查询到的key放入实体中的哪个属性,把自动增长的那个值回填到传入的实参的属性里面-->
<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();
/*打开一个连接对象 默认是自动提交 类似与connection 它的方法很难用不用*/
SqlSession sqlSession = sf.openSession();
//调用mapper中的sql 参数写命名空间.id
/*调用自己的mapper 后面写接口.class*/
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表截图
2.4.2 运行截图
2.4.3 添加之后emp表截图
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();
/*打开一个连接对象 默认是自动提交 类似与connection 它的方法很难用不用*/
SqlSession sqlSession = sf.openSession();
//调用mapper中的sql 参数写命名空间.id
/*调用自己的mapper 后面写接口.class*/
EmpMapper em = sqlSession.getMapper(EmpMapper.class);
/*点击这个后就提交了*/
em.delete(8889);
sqlSession.commit();
sqlSession.close();
}
3.4 删除结果
3.4.1 删除之前
3.4.2 运行截图
3.4.2 删除之后
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文件夹下写的测试代码
/*这个是修改方法的sql*/
@org.junit.Test
public void t5(){
//连接工厂
SqlSessionFactory sf = SqlSessionFactoryUtil.sf();
/*打开一个连接对象 默认是自动提交 类似与connection 它的方法很难用不用*/
SqlSession sqlSession = sf.openSession();
//调用mapper中的sql 参数写命名空间.id
/*调用自己的mapper 后面写接口.class*/
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 修改之前
4.4.2 运行截图
4.4.2 修改之后
3.5 知识点总结
若你传入的参数是实体类的对象,对应的xml文件中的update标签中可以通过#{实体类属性名}来获取里面的对应的值
${实体类属性名}也是可以获取的值,正如之前所提到的,这个因为安全性的问题,使用场景一般是模糊查找

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐
所有评论(0)