动态代理的方式实现增删改查:

通过约定的方式定位sql语句

约定 > 配置文件 > 硬编码

约定的目标是省略掉通过硬编码的方式定位sql的代码,通过接口直接定位出sql语句,以下代码为通过硬编码的方法定位sql:

 1      //读取conf.xml 配置文件
 2         Reader reader = Resources.getResourceAsReader("conf.xml");
 3         //创建sqlSessionFactory
 4         SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(reader);
 5         //创建session---> connection
 6         SqlSession session = sessionFactory.openSession();
 7         //statement ---> statement
 8         String sql = "com.offcn.entity.personMapper." + "selectPersonById";
 9         //查询一条数据
10         Person person = session.selectOne(sql,1);
11         //提交事务
12         session.commit();
13         System.out.println(person);
14         //关闭连接
15         session.close();

通过约定的方式定位sql:

 1  Reader reader = Resources.getResourceAsReader("conf.xml");
 2 //创建一个sqlSessionFactory
 3 SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(reader);
 4 //创建一个sqlSession
 5 SqlSession session = sessionFactory.openSession();
 6 //用sqlSession定位sql
 7 PersonMapper personMapper = session.getMapper(PersonMapper.class);
 8 //通过接口中的方法找到sql语句并执行
 9 Person person = personMapper.queryPersonById(3);
10 //提交事务
11 session.commit();
12 System.out.println(person);
13 //关闭连接
14 session.close();    

接口定义的规则:

1.方法名和mapper.xml文件中标签的id值相同

2.方法的输入参数类型和mapper.xml文件中标签的parameterType类型一致

3.方法的返回值和mapper.xml文件中标签的resultType类型一致

定义接口的代码如下:

 1 package com.offcn.mapper;
 2
 3
 4 import java.util.List;
 5
 6 import com.offcn.entity.Person;
 7
 8 public interface PersonMapper {
 9     Person queryPersonById(int id);
10     List<Person> queryAllPersons();
11     void insertPerson(Person person);
12     void deletePersonById(int id);
13     void updatePersonById(Person person);
14 }

接口和映射文件的对应关系图示:

匹配过程;(约定的过程)

1.根据接口名找到mapper.xml文件(根据的是namespace=接口的全类名)

2.根据接口的方法名找到mapper.xml文件中的sql标签(方法名=sql标签中的id值)

以上两点可以保证当调用接口中的方法时,程序能自动定位到某一个Mapper.xml文件中的sql标签

习惯:sql映射文件(mapper.xml)和接口放在同一个包中

具体实现:

1.实体类代码:

 1 package com.offcn.entity;
 2
 3 import java.util.Date;
 4
 5 public class Person {
 6     private int id;
 7     private String name;
 8     private Date dir;
 9     private String address;
10     public Person() {
11         super();
12         // TODO Auto-generated constructor stub
13     }public Person( String name, Date dir, String address) {
14         this.name = name;
15         this.dir = dir;
16         this.address = address;
17     }
18     public Person(int id, String name, Date dir, String address) {
19         super();
20         this.id = id;
21         this.name = name;
22         this.dir = dir;
23         this.address = address;
24     }
25     public int getId() {
26         return id;
27     }
28     public void setId(int id) {
29         this.id = id;
30     }
31     public String getName() {
32         return name;
33     }
34     public void setName(String name) {
35         this.name = name;
36     }
37     public Date getDir() {
38         return dir;
39     }
40     public void setDir(Date dir) {
41         this.dir = dir;
42     }
43     public String getAddress() {
44         return address;
45     }
46     public void setAddress(String address) {
47         this.address = address;
48     }
49     @Override
50     public String toString() {
51         return "Person [id=" + id + ", name=" + name + ", dir=" + dir + ", address=" + address + "]";
52     }
53
54 }

2.映射文件mapper.xml代码:

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <!DOCTYPE mapper
 3   PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 4   "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 5 <mapper namespace="com.offcn.mapper.PersonMapper">
 6     <!-- 根据id查询 -->
 7   <select id="queryPersonById" parameterType="int" resultType="com.offcn.entity.Person">
 8     select * from person where id = #{id}
 9   </select>
10   <!-- 查询所有 -->
11   <select id="queryAllPersons"  resultType="com.offcn.entity.Person">
12     select * from person
13   </select>
14   <!-- 增加 -->
15   <insert id="insertPerson" parameterType="com.offcn.entity.Person">
16       insert into person (name,bir,address) value (#{name},#{dir},#{address})
17   </insert>
18   <!-- 删除 -->
19   <delete id="deletePersonById" parameterType="int">
20       delete from person where id = #{id}
21   </delete>
22   <!-- 修改 -->
23   <update id="updatePersonById" parameterType="com.offcn.entity.Person">
24       update person set name = #{name},bir = #{dir},address = #{address} where id = #{id}
25   </update>
26 </mapper>

3.接口代码:

 1 package com.offcn.mapper;
 2 import java.util.List;
 3 import com.offcn.entity.Person;
 4 public interface PersonMapper {
 5     Person queryPersonById(int id);
 6     List<Person> queryAllPersons();
 7     void insertPerson(Person person);
 8     void deletePersonById(int id);
 9     void updatePersonById(Person person);
10 }

4.全局配置文件conf.xml:

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <!DOCTYPE configuration
 3   PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
 4   "http://mybatis.org/dtd/mybatis-3-config.dtd">
 5 <configuration>
 6   <environments default="development">
 7     <environment id="development">
 8       <transactionManager type="JDBC"/>
 9       <dataSource type="POOLED">
10         <property name="driver" value="com.mysql.jdbc.Driver"/>
11         <property name="url" value="jdbc:mysql://localhost:3306/person?serverTimezone=UTC"/>
12         <property name="username" value="root"/>
13         <property name="password" value="root"/>
14       </dataSource>
15     </environment>
16   </environments>
17   <mappers>
18     <mapper resource="com/offcn/mapper/personMapper.xml"/>
19   </mappers>
20 </configuration>

5.测试类代码:

  1 package com.offcn.test;
  2
  3 import java.io.IOException;
  4 import java.io.Reader;
  5 import java.util.Date;
  6 import java.util.List;
  7
  8 import org.apache.ibatis.io.Resources;
  9 import org.apache.ibatis.session.SqlSession;
 10 import org.apache.ibatis.session.SqlSessionFactory;
 11 import org.apache.ibatis.session.SqlSessionFactoryBuilder;
 12
 13 import com.offcn.entity.Person;
 14 import com.offcn.mapper.PersonMapper;
 15
 16 public class Test {
 17     public static void main(String[] args) throws IOException {
 18         //queryPersonById();
 19         //insertPerson();
 20         //deletePerson();
 21         updatePerosnById();
 22         queryAllPersons();
 23     }
 24     //根据id查询
 25     public static void queryPersonById() throws IOException {
 26         //读取conf.xml文件
 27         Reader reader = Resources.getResourceAsReader("conf.xml");
 28         //创建一个sqlSessionFactory
 29         SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(reader);
 30         //创建一个sqlSession
 31         SqlSession session = sessionFactory.openSession();
 32         //用sqlSession定位sql
 33         PersonMapper personMapper = session.getMapper(PersonMapper.class);
 34         //通过接口中的方法找到sql语句并执行
 35         Person person = personMapper.queryPersonById(3);
 36         //提交事务
 37         session.commit();
 38         System.out.println(person);
 39         //关闭连接
 40         session.close();
 41     }
 42     //查询所有的方法
 43     public static void queryAllPersons() throws IOException {
 44         //读取conf.xml文件
 45         Reader reader = Resources.getResourceAsReader("conf.xml");
 46         //创建sqlSessionFactory
 47         SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(reader);
 48         //创建一个sqlSession
 49         SqlSession session = sessionFactory.openSession();
 50         //通过session定位映射文件
 51         PersonMapper personMapper = session.getMapper(PersonMapper.class);
 52         //通过接口中的方法定位sql语句并执行
 53         List<Person> persons = personMapper.queryAllPersons();
 54         //提交事务
 55         session.commit();
 56         for (Person person : persons) {
 57             System.out.println(person);
 58         }
 59         //关闭连接
 60         session.close();
 61     }
 62     //增加的方法
 63     public static void insertPerson() throws IOException {
 64         //读取conf.xml文件
 65         Reader reader = Resources.getResourceAsReader("conf.xml");
 66         //创建sqlSessionFactory
 67         SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(reader);
 68         //创建sqlSession
 69         SqlSession session = sessionFactory.openSession();
 70         //通过sqlSession定位映射文件
 71         PersonMapper personMapper = session.getMapper(PersonMapper.class);
 72         //通过接口中的方法定位sql语句
 73         Person person = new Person("王大拿",new Date(),"天津");
 74         personMapper.insertPerson(person);
 75         //提交事务
 76         session.commit();
 77         System.out.println("增加成功");
 78         //关闭连接
 79         session.close();
 80     }
 81     //删除的方法
 82     public static void deletePerson() throws IOException {
 83         //读取conf.xml
 84         Reader reader = Resources.getResourceAsReader("conf.xml");
 85         //创建一个sqlSessionFactory
 86         SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(reader);
 87         //创建一个sqlSession
 88         SqlSession session = sessionFactory.openSession();
 89         //通过session定位映射文件
 90         PersonMapper personMapper = session.getMapper(PersonMapper.class);
 91         //通过接口中的方法定位sql语句
 92         personMapper.deletePersonById(1);
 93         //提交事务
 94         session.commit();
 95         System.out.println("删除成功");
 96         //关闭连接
 97         session.close();
 98     }
 99     //修改的方法
100     public static void updatePerosnById() throws IOException {
101         //读取conf.xml
102         Reader reader = Resources.getResourceAsReader("conf.xml");
103         //创建sqlSessionFactory
104         SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(reader);
105         //创建一个sqlSession
106         SqlSession session = sessionFactory.openSession();
107         //通过sqlSession定位樱色号文件
108         PersonMapper personMapper = session.getMapper(PersonMapper.class);
109         //通过接口中的方法定位sql
110         Person person = new Person(3,"张三",new Date(),"江苏");
111         personMapper.updatePersonById(person);
112         //提交事务
113         session.commit();
114         System.out.println("修改成功");
115         session.close();
116     }
117 }

需要注意的注意事项:

在全局配置文件conf.xml文件中,引入配置文件的方式有四种,常用以下两种:

第一种:

<mapper resource="com/offcn/mapper/studentMapper.xml"/>

第二种:(要求接口和映射文件必须在同一个包下而且必须同名

<package name="com.offcn.mapper"/>

常见错误:

转载于:https://www.cnblogs.com/man-tou/p/11333019.html

02.Mybatis的动态代理方式实现增删改查相关推荐

  1. Spring Boot入门系列(十八)整合mybatis,使用注解的方式实现增删改查

    之前介绍了Spring Boot 整合mybatis 使用xml配置的方式实现增删改查,还介绍了自定义mapper 实现复杂多表关联查询.虽然目前 mybatis 使用xml 配置的方式 已经极大减轻 ...

  2. 【Java】Mybatis mapper动态代理方式

    前言 我们在使用Mybatis的时候,获取需要执行的SQL语句的时候,都是通过调用xml文件来获取,例如:User user = (User) sqlSession.selectOne("c ...

  3. 【MyBatis】安装 + 框架搭建 + 优化 + 增删改查(全程一条龙服务讲解~)

    目录 前言 一.准备工作 1.1.下载MyBatis 1.2.数据库设计 二.搭建框架 2.1.创建Maven项目 2.2.jar包.引入依赖 2.3.创建MyBatis核心配置文件 2.4.映射文件 ...

  4. springboot+mybatis+thymleft 做一套简单增删改查

    首先我们先创建项目 注意:创建SpringBoot项目时一定要联网不然会报错 项目创建好后我们首先对 application.yml 进行编译 #指定端口号 server:port: 8888 #配置 ...

  5. jdbc增删改查有哪些步骤_用Mybatis如何实现对数据库的增删改查步骤

    使用Mybatiss实现对数据库的增删改查 文件目录 1.导入jar包,这里使用maven <dependencies><!--mybatis依赖--><!-- org. ...

  6. springboot整合mybatis实现简单的单表增删改查(完整代码可下载)

    搭建项目 项目简单效果,前端效果丑的一批,主要是后端功能实现: springboot增删改查 csdn完整代码下载链接: springboot+mybatis Gitee下载地址: Gitee下载地址 ...

  7. python增删改查的框架layui_spring+springMvc+mybatis+layui实现数据表格的增删改查(纯layui实现)...

    [实例简介] 项目描述: 这是通过ssm+layui 实现的简单的对数据表格的增删改查,所有页面纯由layui实现. 如果你是新手学习layui,那这个绝对会对你有很大的帮助: 如果你之前已经学过甚至 ...

  8. Mybatis Mapper动态代理方式 typeAliases 别名的使用

    目录结构及配置文件与原始dao方法相比更简便 只需一个UserMapper的接口,放在一起的配置文件,配置文件中namespace的地址确定jdk动态代理的对象 <?xml version=&q ...

  9. Mybatis学习笔记【part03】增删改查

    Mybatis 学习笔记 Part03 1.传入参数与返回参数设置(查) <!-- 根据 id 查询 --> <select id="findById" resu ...

最新文章

  1. Hinton,Lecun和Bengio三巨头联手再发万字长文:深度学习的昨天、今天和明天
  2. 中国移动 全球通、 动感地带、神州行 的区别
  3. 内存总是不够?HBaseGeoMesa配置优化了解一下
  4. ACM将一个十进制的数转换为一个十六进制的数输出
  5. 查看apt-get安装软件的版本
  6. bzoj1612 奶牛的比赛
  7. python画二维折线图_python画折线图的程序
  8. 神马js都是浮云-----限时秒杀
  9. OpenCV图像处理专栏六 | 来自何凯明博士的暗通道去雾算法(CVPR 2009最佳论文)
  10. GAMIT/GLOBK入门简介和安装
  11. VMware ESXi 7.0 U3e SLIC 2.6 Unlocker 集成 Intel NUC 网卡、USB 网卡和 NVMe 驱动 (2022.07 更新)
  12. 上传智能车竞赛比赛成绩
  13. 解决listview条目错乱问题
  14. Django 实现单点登录(SSO)
  15. 防百度云加速html,百度云加速3.0轻松应对全球最大DDoS攻击
  16. Java中常见的30道例题代码
  17. 在中国在行其道的智慧城市,为何折戟多伦多
  18. CET-4 week8# 细枝末节
  19. 基于Spacebuilder开发问题汇总
  20. 常见web安全隐患及解决方案

热门文章

  1. linux spinlock/rwlock/seqlock原理剖析(基于ARM64)
  2. 每日一题(23)——malloc与free(四)
  3. ubuntu常见问题
  4. TQ210——下载总结
  5. php+redis+设置前缀,spring使用Redis自定义前缀后缀名(去掉SimpleKey []+自定义)
  6. java 异步调用方法_乐字节Java编程之方法、调用、重载、递归
  7. mac最好用的markdown_「建议收藏」PCMaclinux,最好用Markdown编辑器清单
  8. LeetCode 2023. 连接后等于目标字符串的字符串对
  9. Docker安装+镜像拉取+容器+创建镜像+push to docker hub
  10. 05.序列模型 W2.自然语言处理与词嵌入