02.Mybatis的动态代理方式实现增删改查
动态代理的方式实现增删改查:
通过约定的方式定位sql语句
约定 > 配置文件 > 硬编码
约定的目标是省略掉通过硬编码的方式定位sql的代码,通过接口直接定位出sql语句,以下代码为通过硬编码的方法定位sql:
//读取conf.xml 配置文件
Reader reader = Resources.getResourceAsReader("conf.xml");
//创建sqlSessionFactory
SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(reader);
//创建session---> connection
SqlSession session = sessionFactory.openSession();
//statement ---> statement
String sql = "com.offcn.entity.personMapper." + "selectPersonById";
//查询一条数据
Person person = session.selectOne(sql,1);
//提交事务
session.commit();
System.out.println(person);
//关闭连接
session.close();
通过约定的方式定位sql:
Reader reader = Resources.getResourceAsReader("conf.xml");
//创建一个sqlSessionFactory
SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(reader);
//创建一个sqlSession
SqlSession session = sessionFactory.openSession();
//用sqlSession定位sql
PersonMapper personMapper = session.getMapper(PersonMapper.class);
//通过接口中的方法找到sql语句并执行
Person person = personMapper.queryPersonById(3);
//提交事务
session.commit();
System.out.println(person);
//关闭连接
session.close();
接口定义的规则:
1.方法名和mapper.xml文件中标签的id值相同
2.方法的输入参数类型和mapper.xml文件中标签的parameterType类型一致
3.方法的返回值和mapper.xml文件中标签的resultType类型一致
定义接口的代码如下:
package com.offcn.mapper; import java.util.List; import com.offcn.entity.Person; public interface PersonMapper {
Person queryPersonById(int id);
List<Person> queryAllPersons();
void insertPerson(Person person);
void deletePersonById(int id);
void updatePersonById(Person person);
}
接口和映射文件的对应关系图示:
匹配过程;(约定的过程)
1.根据接口名找到mapper.xml文件(根据的是namespace=接口的全类名)
2.根据接口的方法名找到mapper.xml文件中的sql标签(方法名=sql标签中的id值)
以上两点可以保证当调用接口中的方法时,程序能自动定位到某一个Mapper.xml文件中的sql标签
习惯:sql映射文件(mapper.xml)和接口放在同一个包中
具体实现:
1.实体类代码:
package com.offcn.entity; import java.util.Date; public class Person {
private int id;
private String name;
private Date dir;
private String address;
public Person() {
super();
// TODO Auto-generated constructor stub
}public Person( String name, Date dir, String address) {
this.name = name;
this.dir = dir;
this.address = address;
}
public Person(int id, String name, Date dir, String address) {
super();
this.id = id;
this.name = name;
this.dir = dir;
this.address = address;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Date getDir() {
return dir;
}
public void setDir(Date dir) {
this.dir = dir;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
@Override
public String toString() {
return "Person [id=" + id + ", name=" + name + ", dir=" + dir + ", address=" + address + "]";
} }
2.映射文件mapper.xml代码:
<?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">
<mapper namespace="com.offcn.mapper.PersonMapper">
<!-- 根据id查询 -->
<select id="queryPersonById" parameterType="int" resultType="com.offcn.entity.Person">
select * from person where id = #{id}
</select>
<!-- 查询所有 -->
<select id="queryAllPersons" resultType="com.offcn.entity.Person">
select * from person
</select>
<!-- 增加 -->
<insert id="insertPerson" parameterType="com.offcn.entity.Person">
insert into person (name,bir,address) value (#{name},#{dir},#{address})
</insert>
<!-- 删除 -->
<delete id="deletePersonById" parameterType="int">
delete from person where id = #{id}
</delete>
<!-- 修改 -->
<update id="updatePersonById" parameterType="com.offcn.entity.Person">
update person set name = #{name},bir = #{dir},address = #{address} where id = #{id}
</update>
</mapper>
3.接口代码:
package com.offcn.mapper;
import java.util.List;
import com.offcn.entity.Person;
public interface PersonMapper {
Person queryPersonById(int id);
List<Person> queryAllPersons();
void insertPerson(Person person);
void deletePersonById(int id);
void updatePersonById(Person person);
}
4.全局配置文件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="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/person?serverTimezone=UTC"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="com/offcn/mapper/personMapper.xml"/>
</mappers>
</configuration>
5.测试类代码:
package com.offcn.test; import java.io.IOException;
import java.io.Reader;
import java.util.Date;
import java.util.List; 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 com.offcn.entity.Person;
import com.offcn.mapper.PersonMapper; public class Test {
public static void main(String[] args) throws IOException {
//queryPersonById();
//insertPerson();
//deletePerson();
updatePerosnById();
queryAllPersons();
}
//根据id查询
public static void queryPersonById() throws IOException {
//读取conf.xml文件
Reader reader = Resources.getResourceAsReader("conf.xml");
//创建一个sqlSessionFactory
SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(reader);
//创建一个sqlSession
SqlSession session = sessionFactory.openSession();
//用sqlSession定位sql
PersonMapper personMapper = session.getMapper(PersonMapper.class);
//通过接口中的方法找到sql语句并执行
Person person = personMapper.queryPersonById(3);
//提交事务
session.commit();
System.out.println(person);
//关闭连接
session.close();
}
//查询所有的方法
public static void queryAllPersons() throws IOException {
//读取conf.xml文件
Reader reader = Resources.getResourceAsReader("conf.xml");
//创建sqlSessionFactory
SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(reader);
//创建一个sqlSession
SqlSession session = sessionFactory.openSession();
//通过session定位映射文件
PersonMapper personMapper = session.getMapper(PersonMapper.class);
//通过接口中的方法定位sql语句并执行
List<Person> persons = personMapper.queryAllPersons();
//提交事务
session.commit();
for (Person person : persons) {
System.out.println(person);
}
//关闭连接
session.close();
}
//增加的方法
public static void insertPerson() throws IOException {
//读取conf.xml文件
Reader reader = Resources.getResourceAsReader("conf.xml");
//创建sqlSessionFactory
SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(reader);
//创建sqlSession
SqlSession session = sessionFactory.openSession();
//通过sqlSession定位映射文件
PersonMapper personMapper = session.getMapper(PersonMapper.class);
//通过接口中的方法定位sql语句
Person person = new Person("王大拿",new Date(),"天津");
personMapper.insertPerson(person);
//提交事务
session.commit();
System.out.println("增加成功");
//关闭连接
session.close();
}
//删除的方法
public static void deletePerson() throws IOException {
//读取conf.xml
Reader reader = Resources.getResourceAsReader("conf.xml");
//创建一个sqlSessionFactory
SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(reader);
//创建一个sqlSession
SqlSession session = sessionFactory.openSession();
//通过session定位映射文件
PersonMapper personMapper = session.getMapper(PersonMapper.class);
//通过接口中的方法定位sql语句
personMapper.deletePersonById(1);
//提交事务
session.commit();
System.out.println("删除成功");
//关闭连接
session.close();
}
//修改的方法
public static void updatePerosnById() throws IOException {
//读取conf.xml
Reader reader = Resources.getResourceAsReader("conf.xml");
//创建sqlSessionFactory
SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(reader);
//创建一个sqlSession
SqlSession session = sessionFactory.openSession();
//通过sqlSession定位樱色号文件
PersonMapper personMapper = session.getMapper(PersonMapper.class);
//通过接口中的方法定位sql
Person person = new Person(3,"张三",new Date(),"江苏");
personMapper.updatePersonById(person);
//提交事务
session.commit();
System.out.println("修改成功");
session.close();
}
}
需要注意的注意事项:
在全局配置文件conf.xml文件中,引入配置文件的方式有四种,常用以下两种:
第一种:
<mapper resource="com/offcn/mapper/studentMapper.xml"/>
第二种:(要求接口和映射文件必须在同一个包下而且必须同名)
<package name="com.offcn.mapper"/>
常见错误:
02.Mybatis的动态代理方式实现增删改查的更多相关文章
- MyBatis学习(三)MyBatis基于动态代理方式的增删改查
1.前言 上一期讲到MyBatis-Statement版本的增删改查.可以发现.这种代码写下来冗余的地方特别多.写一套没啥.如果涉及到多表多查询的时候就容易出现问题.故.官方推荐了一种方法.即MyBa ...
- Mybatis通过接口的方式实现增删改查
导入jar包 [mybatis] [oracle] 生成数据库 1.添加Mybatis的配置文件mybatis-config.xml 在src目录下创建一个mybatis-config.xml文件,如 ...
- Spring Boot入门系列(十八)整合mybatis,使用注解的方式实现增删改查
之前介绍了Spring Boot 整合mybatis 使用xml配置的方式实现增删改查,还介绍了自定义mapper 实现复杂多表关联查询.虽然目前 mybatis 使用xml 配置的方式 已经极大减轻 ...
- Mybatis实现简单的CRUD(增删改查)原理及实例分析
Mybatis实现简单的CRUD(增删改查) 用到的数据库: CREATE DATABASE `mybatis`; USE `mybatis`; DROP TABLE IF EXISTS `user` ...
- Android-Sqlite-OOP方式操作增删改查
之前写的数据库增删改查,是使用SQL语句来实现的,Google 就为Android开发人员考虑,就算不会SQL语句也能实现增删改查,所以就有了OOP面向对象的增删改查方式 其实这种OOP面向对象的增删 ...
- Mybatis学习笔记之---CRUD(增删改查)
Mybatis的CRUD(增删改查) 1.pom.xml <dependencies> <dependency> <groupId>junit</groupI ...
- MyBatis初级实战之二:增删改查
欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...
- ASP.NET Identity系列02,在ASP.NET MVC中增删改查用户
本篇体验在ASP.NET MVC中使用ASP.NET Identity增删改查用户. 源码在这里:https://github.com/darrenji/UseIdentityCRUDUserInMV ...
- ssm框架(Spring Springmvc Mybatis框架)整合及案例增删改查
三大框架介绍 ssm框架是由Spring springmvc和Mybatis共同组成的框架.Spring和Springmvc都是spring公司开发的,因此他们之间不需要整合.也可以说是无缝整合.my ...
随机推荐
- POJ 2175:Evacuation Plan(费用流消圈算法)***
http://poj.org/problem?id=2175 题意:有n个楼,m个防空洞,每个楼有一个坐标和一个人数B,每个防空洞有一个坐标和容纳量C,从楼到防空洞需要的时间是其曼哈顿距离+1,现在给 ...
- Solr 全文搜索
## 1. 概述 在本文中,我们将探讨一个[Apache Solr](http://lucene.apache.org/solr/)搜索引擎中的基本概念 - 全文搜索. Apache Solr是一个开 ...
- (CVE-2017-10271)weblogic12.1.3.0漏洞测试与打补丁过程
1.漏洞测试 搭建完成weblogic12.1.3.0后,开始用工具测试 点击connect,右下角显示connected,说明已连接→说明漏洞存在 CMD输入:ls ,然后点击Execute执行 ...
- python基础知识四 小数据池,深浅拷贝,集合+菜中菜
四.小数据池,深浅拷贝,集合+菜中菜 1小数据池 --缓存机制(驻留机制) '==' 判断两边内容是否相等 'is' 基于内存地址进行判断是否相同 a = 10 b = 10 print(a ...
- [分享] 一款极简单的 BaseEntity CRUD 方法
前言 尝试过 ado.net.dapper.ef,以及Repository仓储,甚至自己还写过生成器工具,以便做常规CRUD操作. 它们日常操作不方便之处: 每次使用前需要声明,再操作: 很多人一个实 ...
- md文档的书写《二》
对<md文档的书写一>的补充和部分归总 我使用的是Typora,快捷键可能有些片面,没有特殊说明,下文所有快捷键都是Typora编辑器下支持的快捷键,望知晓. 关于标题的书写补充 除了 ( ...
- 如何优雅关闭 Spring Boot 应用
## 前言 随着线上应用逐步采用 SpringBoot 构建,SpringBoot应用实例越来多,当线上某个应用需要升级部署时,常常简单粗暴地使用 kill 命令,这种停止应用的方式会让应用将所有处理 ...
- Git的一些简单而且常用的操作
转载自我自己的博客 介绍 很多初学者可能并不太清楚Git 与GitHub 这两个概念的联系和区别,在这里我大致介绍一下这两个名词. Git 是一个免费.开源的分布式版本控制系统(VCS).版本控制系统 ...
- ArcGIS API For JavaScript 开发(五)要素图层的编辑
2018-4-3 这篇博客主要讲述要素的层的编辑功能,是基于FeatureLayer的applyEdit方法.由于自己目前正在学习当中,有许多不足之处请各位指出,欢迎指导学习! 主要功能是 1.将地图 ...
- CentOS 下编译安装PHP
1. 去php官网下载源码 http://www.php.net/downloads.php ,我下载使用的版本是(php-5.4.8.tar.gz) 2. 安装环境 yum install ...