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

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

通过约定的方式定位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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/482538.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

孙正义看未来30年:这个趋势,永远不会错(附完整PPT)

来源&#xff1a;大数据实验室 对于今后30年来讲&#xff0c;我认为现在是个很关键的时刻&#xff0c;尤其是在各位的人生当中。而且现在是一整个概念的转变&#xff0c;我们要包容这个概念的转变。我想先给大家看两张照片。这是美国纽约的第五大道&#xff0c;左边那张是1900年…

可视化解释11种基本神经网络架构

来源&#xff1a;海豚数据科学实验室标准&#xff0c;循环&#xff0c;卷积和自动编码器网络随着深度学习的飞速发展&#xff0c;已经创建了完整的神经网络体系结构主机&#xff0c;以解决各种各样的任务和问题。尽管有无数的神经网络架构&#xff0c;但对于任何深度学习工程师…

设计模式之二抽象工厂设计模式

继上篇简单工厂设计模式之后&#xff0c;今天继续讲解抽象工厂设计模式。在简单工厂中&#xff0c;我们的工厂类一次只可以处理一类产品。那么如果我们想处理多类产品&#xff0c;简单工厂是满足不了的。必须要用抽象工厂设计模式。 我们先从概念上来了解下什么是抽象工厂设计模…

Nature封面:只低一毫米,时间也会变慢!叶军团队首次在毫米尺度验证广义相对论...

来源&#xff1a;凹非寺作者&#xff1a;晓查 明敏你知道吗&#xff1f;在地球上&#xff0c;楼层越低&#xff0c;时间过得越慢。这可不是玄学&#xff0c;而是爱因斯坦广义相对论预言的时间膨胀效应&#xff1a;引力越大&#xff0c;时间越慢。△ 在不同高度差上验证时钟变快…

DARPA可解释AI研究(XAI计划)的4年回顾与经验总结

来源&#xff1a;智源社区作者&#xff1a;David Gunning, Eric Vorm, Jennifer Yunyan Wang, Matt Turek编译&#xff1a;牛梦琳摘要&#xff1a;从项目管理人员和评估人员的角度&#xff0c;对国防高级研究计划局&#xff08;DARPA&#xff09;的可解释人工智能&#xff08;X…

​从ASML年报看半导体产业的未来

来源&#xff1a;半导体行业观察在前几天的文章《光刻机巨头ASML的十年变迁》中&#xff0c;笔者梳理了ASML近10年来的财报数据&#xff0c;介绍了其EUV/DUV光刻机出货量、年销售额、研发投入以及各地区的销售情况等。近日&#xff0c;ASML又公布了2021年年报&#xff0c;我们一…

04.MyBatis别名的设置和类型转换器

别名的设置:(别名不区分大小写): 设置单个别名: <configuration><properties resource"db.properties" /><typeAliases><!-- 设置单个别名 --><typeAlias type"com.offcn.entity.Person" alias"person"/><type…

史上首次,强化学习算法控制核聚变登上Nature:DeepMind让人造太阳向前一大步...

来源&#xff1a;机器之心过去三年&#xff0c;DeepMind 和瑞士洛桑联邦理工学院 EPFL 一直在进行一个神秘的项目&#xff1a;用强化学习控制核聚变反应堆内过热的等离子体&#xff0c;如今它已宣告成功。DeepMind研究科学家David Pfau在论文发表后感叹道&#xff1a;「为了分享…

机器人流程自动化技术的新发展

来源&#xff1a;学习时报作者&#xff1a;李蕾蓬勃发展的数字经济&#xff0c;是全球新一轮科技进步的产物&#xff0c;直接受到新兴数字技术与智能技术的驱动。机器人流程自动化技术&#xff08;简称“RPA”&#xff09;&#xff0c;是近些年获得快速发展与广泛应用的重要智能…

论人工智能历史、现状与未来发展战略

来源&#xff1a;《学术前沿》作者&#xff1a;郭毅可人工智能问世60多年来&#xff0c;承载着人类对自己的智慧的无限自信。在这样的自信下&#xff0c;人工智能发展到了今天&#xff0c;人们在追求机器从事尽可能多的智力劳动的路上走得很快&#xff0c;也很远。今天人工智能…

PHP 开发者大会

PHPCON 2019 开发者大会(上海)2019.8.10-8-11 郭新华,和陈雷给我留下的影响很大 再看下天气,利奇马台风,都坐满了,来的都是真爱. Swoole 的韩天峰开始演讲,感觉是程序员标准的样子,哈哈哈 2345 的高旭 讲公司用swoole 的架构 鸟哥因为台风问题没来成,搞了个直播,哈哈哈,感觉很…

IEEE Fellow杨铮:打破「视觉」垄断,无线信号为 AI 开启「新感官」

来源&#xff1a;AI科技评论作者&#xff1a;陈彩娴编辑&#xff1a;岑峰2020年年初疫情刚开始时&#xff0c;清华大学的官方号曾祭出一篇题为《清华教师升级「十大神器」&#xff0c;上课力满格》的推文&#xff0c;讲述了软件学院某老师如何居家办公、探索出一套防止学生偷懒…

对于量子计算来说,99%的准确度足够吗?

UNIVERSITY OF NEW SOUTH WALES来源&#xff1a;IEEE电气电子工程师来自荷兰代尔夫特理工大学&#xff08;Delft University of Technology&#xff09;、日本理化学研究所&#xff08;Riken&#xff09;和悉尼新南威尔士大学&#xff08;UNSW&#xff09;的研究团队在硅中开发…

人工智能将如何改变芯片设计

来源&#xff1a;ScienceAI编译&#xff1a;绿萝摩尔定律的终结正在逼近。工程师和设计师只能将晶体管小型化并尽可能多地封装到芯片中。因此&#xff0c;他们正在转向其他芯片设计方法&#xff0c;将 AI 等技术融入到设计过程中。例如&#xff0c;三星正在将人工智能添加到其内…

计算机科学家证明,为什么更大的神经网络可以做得更好

来源&#xff1a;ScienceAI编辑&#xff1a;萝卜皮我们的物种很大程度上归功于对生的拇指。但如果进化给了我们额外的拇指&#xff0c;事情可能不会有太大改善。每只手一个拇指就足够了。神经网络并非如此&#xff0c;这是执行类人任务的领先人工智能系统。随着他们变得更大&am…

生命,到底是什么?

来源&#xff1a;腾讯研究院作者&#xff1a;Mark A. Bedua译者&#xff1a;宋词、范星辰令人着迷的生命地球表面布满了生命&#xff0c;而且通常很容易辨认。猫、胡萝卜、细菌都是活的&#xff0c;桥、肥皂泡、沙粒都是死的。但众所周知&#xff0c;生物学家们却没有关于生命的…

2022图机器学习必读的11大研究趋势和方向: 微分方程/子图表示/图谱理论/非对称/动态性/鲁棒性/通用性/强化学习/图量子等...

来源&#xff1a;机器学习研究组订阅作者&#xff1a;Michael Bronstein 牛津大学DeepMind人工智能教授、Twitter图机器学习负责人编译&#xff1a;熊宇轩一、要点概述几何在机器学习中变得越来越重要。微分几何和同源场为机器学习研究引入了新的思想&#xff0c;包括利用了对…

day31 线程

01 进程间通信 """ 队列:先进先出 堆栈:先进后出 """ from multiprocessing import Queue q Queue(5) # 括号内可以传参数 表示的是这个队列的最大存储数 # 往队列中添加数据 q.put(1) q.put(2) print(q.full()) # 判断队列是否满了 q.put(3)…

机器学习理论基础到底有多可靠?

来源&#xff1a;机器学习算法与Python实战选自&#xff1a;aidancooper.co.uk 作者&#xff1a;Aidan Cooper编译&#xff1a;机器之心 知其然&#xff0c;知其所以然。机器学习领域近年的发展非常迅速&#xff0c;然而我们对机器学习理论的理解还很有限&#xff0c;有些模型…

07.MyBatis中的关联查询

关联查询&#xff1a; 一对一&#xff1a; 两种方式实现: 1.通过业务扩展的方式进行一对一查询&#xff0c;新建一个实体类&#xff0c;继承其中属性多的一个&#xff0c;然后写上另一个类中的属性&#xff1a; 实体类: 映射文件: 1 <!-- 业务扩展的方式进行一对一查询&…