MyBatis学习(三)MyBatis基于动态代理方式的增删改查
1、前言
上一期讲到MyBatis-Statement版本的增删改查、可以发现、这种代码写下来冗余的地方特别多、写一套没啥、如果涉及到多表多查询的时候就容易出现问题。故、官方推荐了一种方法、即MyBatis基于动态代理方式的增删改查、它是一种基于接口开发、Mapper动态的对SQL进行寻找。通过具体概念请点击此处 查阅、这里不过多解释、代码中有详细的注释。
项目骨架如图所示:

2、前期准备
1、编写conf.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>
    <!--  通过 environments 的 default值 和 environment 的 id 来指定mybatis运行时的数据库环境  -->
    <environments default="development">
        <!--    开发环境(本机)、environment可以有多套    -->
        <environment id="development">
            <!--  事务提交方式
                  JDBC:利用JDBC处理事务(commit rollback close)
                  MANAGED:将事务交给其他组件托管(Spring、jobss),默认情况下会关闭连接。
              -->
            <transactionManager type="JDBC"/>
            <!--   数据源类型
                   POOLED:使用数据库连接池
                   UNPOOLED:传统的JDBC模式(消耗性能、不推荐)
                   JNDI:从tomcat中获取内置数据库连接池
                     -->
            <dataSource type="POOLED">
                <!-- 配置数据库信息 -->
                <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/xiao?serverTimezone=GMT%2B8"/>
                <property name="username" value="root"/>
                <property name="password" value="123456"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <!--   加载映射文件     -->
        <mapper resource="com/feng/mapper/studentMapper.xml"/>
    </mappers>
</configuration>
2、创建实体类和对应的表(entity)
package com.feng.entity;
public class Student {
    private int stuNo;
    private String stuName;
    private int stuAge;
    private String graName;
    public int getStuNo() {
        return stuNo;
    }
    public void setStuNo(int stuNo) {
        this.stuNo = stuNo;
    }
    public String getStuName() {
        return stuName;
    }
    public void setStuName(String stuName) {
        this.stuName = stuName;
    }
    public int getStuAge() {
        return stuAge;
    }
    public void setStuAge(int stuAge) {
        this.stuAge = stuAge;
    }
    public String getGraName() {
        return graName;
    }
    public void setGraName(String graName) {
        this.graName = graName;
    }
    public Student(int stuNo, String stuName, int stuAge, String graName) {
        this.stuNo = stuNo;
        this.stuName = stuName;
        this.stuAge = stuAge;
        this.graName = graName;
    }
    public Student() {
    }
    @Override
    public String toString() {
        return '{'+"stuNo=" + stuNo +
                ", stuName='" + stuName + '\'' +
                ", stuAge=" + stuAge +
                ", graName='" + graName + '\'' +
                '}';
    }
}

3、Mapper文件的编写
一个Mapper对应一个xml、动态代理方式中、mapper和对应的xml关系紧密、故两者放在同一文件夹下。
package com.feng.mapper;
import com.feng.entity.Student;
import java.util.List;
// 操作mybatis的接口
public interface StudentMapper {
    /*
    a. 约定
     1、方法名和mapper.xml文件中标签的id值相同
     2、方法的输入参数和mapper.xml文件中标签的parameterType类型一致
     3、方法的返回值和mapper.xml文件中标签的resultType类型一致
    b. 实现
      1、namespace的值就是接口的全类名 (实现接口和xml的映射)
      2、根据接口的方法名、找到mapper.xml中的SQL标签(方法名 = SQL标签Id值)
      习惯:SQL映射文件(mapper.xml) 和接口放在同一个包中、注意修改conf.xml加载mapper文件的路径
      以上、可以通过接口的方法定位 ---> SQL语句
     */
    Student queryStudentByStuNo(int stuNo);
    // 查询全部
    List<Student> queryAllStudents();
    // 增加
    void addStudent(Student student);
    // 删除
    void deleteStudentByStuNo(int stuNo);
    // 修改
    void updateStudentByStuNo(Student student);
}
<?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.xml映射文件的唯一标识-->
<mapper namespace="com.feng.mapper.StudentMapper">
    <!--  通过 namespace.id来定位该sql  -->
    <!--  各种标签的id;
    parameterType:输入参数的类型;
    resultType:查询的返回结果的类型(具体对象映射到路径)
    -->
    <select id="queryStudentByStuNo" parameterType="int" resultType="com.feng.entity.Student">
        select * from student where stuno = #{stuNo}
    </select>
    <select id="queryAllStudents" resultType="com.feng.entity.Student">
        select * from student
    </select>
    <insert id="addStudent" parameterType="com.feng.entity.Student">
        insert into student(stuno,stuname,stuage,graname) values(#{stuNo},#{stuName},#{stuAge},#{graName})
    </insert>
    <update id="updateStudentByStuNo" parameterType="com.feng.entity.Student">
        update student set stuname=#{stuName},stuage=#{stuAge},graname=#{graName} where stuno=#{stuNo}
    </update>
    <delete id="deleteStudentByStuNo" parameterType="int">
        delete from student where stuno = #{stuNo}
    </delete>
</mapper>
4、编写测试类进行测试
(注:Mybatis约定了一个输入参数对应一个输出参数、且不能出现多个、故改动代码逻辑、采用对象的方式对返回值进行约定。)
package com.feng.test;
import com.feng.entity.Student;
import com.feng.mapper.StudentMapper;
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.IOException;
import java.io.Reader;
import java.util.List;
public class Test {
    // 1、查询单个学生
    public static void queryStudentByStuNo() throws IOException {
        // conf.xml ---->  reader
        Reader reader = Resources.getResourceAsReader("com/feng/conf.xml");
        // reader ---> SqlSession
        SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(reader);
        SqlSession session = sessionFactory.openSession();
        StudentMapper studentMapper = session.getMapper(StudentMapper.class);
        Student student = studentMapper.queryStudentByStuNo(1);// 接口中的方法->SQL语句
        System.out.println(student);
        session.close();
    }
    // 2、查询全部学生
    public static void queryAllStudents() throws IOException {
        Reader reader = Resources.getResourceAsReader("com/feng/conf.xml");
        SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(reader);
        SqlSession session = sessionFactory.openSession();
        StudentMapper studentMapper = session.getMapper(StudentMapper.class);
        List<Student> students = studentMapper.queryAllStudents();
        System.out.println(students);
        session.close();
    }
    // 3、增加学生
    public static void addStudent() throws IOException {
        Reader reader = Resources.getResourceAsReader("com/feng/conf.xml");
        SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(reader);
        SqlSession session = sessionFactory.openSession();
        Student student = new Student(3, "柴犬", 25, "六年级");
        StudentMapper studentMapper = session.getMapper(StudentMapper.class);
        studentMapper.addStudent(student);
        session.commit();   // 提交事务
        System.out.println("增加成功!");
        session.close();
    }
    // 4、修改学生
    public static void updateStudentByStuNo() throws IOException {
        Reader reader = Resources.getResourceAsReader("com/feng/conf.xml");
        SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(reader);
        SqlSession session = sessionFactory.openSession();
        Student student = new Student();
        // 修改那个人, where stuNo = 2
        student.setStuNo(2);
        // 修改成啥样子
        student.setStuName("三哈");
        student.setStuAge(25);
        student.setGraName("一年级");
        StudentMapper studentMapper = session.getMapper(StudentMapper.class);
        studentMapper.updateStudentByStuNo(student);
        session.commit();   // 提交事务
        System.out.println("修改成功!");
        session.close();
    }
    // 5、删除学生
    public static void deleteStudentByStuNo() throws IOException {
        Reader reader = Resources.getResourceAsReader("com/feng/conf.xml");
        SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(reader);
        SqlSession session = sessionFactory.openSession();
        StudentMapper studentMapper = session.getMapper(StudentMapper.class);
        studentMapper.deleteStudentByStuNo(3);
        session.commit();   // 提交事务
        System.out.println("删除成功");
        session.close();
    }
    public static void main(String[] args) throws IOException {
        deleteStudentByStuNo();
        queryAllStudents();
    }
}
5、测试结果

MyBatis学习(三)MyBatis基于动态代理方式的增删改查的更多相关文章
- 02.Mybatis的动态代理方式实现增删改查
		
动态代理的方式实现增删改查: 通过约定的方式定位sql语句 约定 > 配置文件 > 硬编码 约定的目标是省略掉通过硬编码的方式定位sql的代码,通过接口直接定位出sql语句,以下代码为通过 ...
 - MyBatis学习(三)---MyBatis和Spring整合
		
想要了解MyBatis基础的朋友可以通过传送门: MyBatis学习(一)---配置文件,Mapper接口和动态SQL http://www.cnblogs.com/ghq120/p/8322302. ...
 - Spring Boot入门系列(十八)整合mybatis,使用注解的方式实现增删改查
		
之前介绍了Spring Boot 整合mybatis 使用xml配置的方式实现增删改查,还介绍了自定义mapper 实现复杂多表关联查询.虽然目前 mybatis 使用xml 配置的方式 已经极大减轻 ...
 - Android-Sqlite-OOP方式操作增删改查
		
之前写的数据库增删改查,是使用SQL语句来实现的,Google 就为Android开发人员考虑,就算不会SQL语句也能实现增删改查,所以就有了OOP面向对象的增删改查方式 其实这种OOP面向对象的增删 ...
 - 基于vue-easytable实现数据的增删改查
		
基于vue-easytable实现数据的增删改查 原理:利用vue的数据绑定和vue-easetable的ui完成增删改查 后端接口: 1.条件查询表中数据 http://localhost:4795 ...
 - MyBatis总结三:使用动态代理实现dao接口
		
由于我们上一篇实现MyBatis的增删改查的接口实现类的方法都是通过sqlsession调用方法,参数也都类似,所以我们使用动态代理的方式来完善这一点 MyBatis动态代理生成dao的步骤: 编写数 ...
 - EF6 学习笔记(二):操练 CRUD 增删改查
		
EF6学习笔记总目录 ASP.NET MVC5 及 EF6 学习笔记 - (目录整理) 接上篇: EF6 学习笔记(一):Code First 方式生成数据库及初始化数据库实际操作 本篇原文链接: I ...
 - 基于SpringMVC的文件(增删改查)上传、下载、更新、删除
		
一.项目背景 摘要:最近一直在忙着项目的事,3个项目过去了,发现有一个共同的业务,那就是附件的处理,附件包括各种文档,当然还有图片等特殊文件,由于时间的关系,每次都是匆匆忙忙的搞定上线,称这项目的空档 ...
 - 【EF6学习笔记】(二)操练 CRUD 增删改查
		
本篇原文链接: Implementing Basic CRUD Functionality 说明:学习笔记参考原文中的流程,为了增加实际操作性,并能够深入理解,部分地方根据实际情况做了一些调整:并且根 ...
 
随机推荐
- 洛谷 P4426 - [HNOI/AHOI2018]毒瘤(虚树+dp)
			
题面传送门 神仙虚树题. 首先考虑最 trival 的情况:\(m=n-1\),也就是一棵树的情况.这个我相信刚学树形 \(dp\) 的都能够秒掉罢(确信).直接设 \(dp_{i,0/1}\) 在表 ...
 - P3438 [POI2006]ZAB-Frogs
			
P3438 [POI2006]ZAB-Frogs 给出一个不一样的解法.不需要用到斜率优化等高级算法. 下文记 \(n=w_x,m=w_y\). 首先,答案显然满足可二分性,因此二分答案 \(d\in ...
 - Java培训班学员如何找工作?如何过试用期?
			
在本文里,首先将结合我了解的多家培训班辅导学员就业的情况,来讲讲培训班学员如何高效找工作.由于本人在周末会兼职在培训班讲课,也帮助过不少学员成功入职,所以下文还会给出"培训班学员如何快速适应 ...
 - rkhunter使用
			
1.下载地址:http://jaist.dl.sourceforge.net/project/rkhunter/rkhunter/1.4.6/ 2.上传至Linux后解压 3.编译安装 [root@t ...
 - 为 Rainbond Ingress Controller 设置负载均衡
			
Rainbond 作为一款云原生应用管理平台,天生带有引导南北向网络流量的分布式网关 rbd-gateway.rbd-gateway 组件,实际上是好雨科技团队开发的一种 Ingress Contro ...
 - cvc-complex-type.2.3: Element 'servlet' cannot have character [children], because the type's content
			
错误原因:粘贴代码 <servlet> <servlet-name>barServlet</servlet-name> <servlet-class>S ...
 - BIO/NIO/AIO对比
			
IO 模型 就是使用什么样的通道进行数据的发送和接收,很大程度上决定了程序通信的性能. Java 支持三种网络编程模型:BIO.NIO.AIO. Java BIO,同步并阻塞(传统阻塞型),服务器实现 ...
 - Spark(二十)【SparkSQL将CSV导入Kudu】
			
目录 SparkSql 将CSV导入kudu pom 依赖 scala 代码 启动脚本 SparkSql 将CSV导入kudu pom 依赖 <properties> <spark. ...
 - Mybatis相关知识点(一)
			
MyBatis入门 (一)介绍 MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code, ...
 - Android中的性能优化
			
由于手机硬件的限制,内存和CPU都无法像pc一样具有超大的内存,Android手机上,过多的使用内存,会容易导致oom,过多的使用CPU资源,会导致手机卡顿,甚至导致anr.我主要是从一下几部分进行优 ...