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 ...
随机推荐
- 并发编程-concurrent指南-计数器CountDownLatch
java.util.concurrent.CountDownLatch 是一个并发构造,它允许一个或多个线程等待一系列指定操作的完成. CountDownLatch 以一个给定的数量初始化.count ...
- Java并发包中线程池ThreadPoolExecutor原理探究
一.线程池简介 线程池的使用主要是解决两个问题:①当执行大量异步任务的时候线程池能够提供更好的性能,在不使用线程池时候,每当需要执行异步任务的时候直接new一个线程来运行的话,线程的创建和销毁都是需要 ...
- HDU 5775:Bubble Sort(树状数组)
http://acm.hdu.edu.cn/showproblem.php?pid=5775 Bubble Sort Problem Description P is a permutation ...
- Django用户头像上传
1 将文件保存到服务器本地 upload.html ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 <!DOCTYPE html> <html ...
- django基础知识之模板:
模板介绍 作为Web框架,Django提供了模板,可以很便利的动态生成HTML 模版系统致力于表达外观,而不是程序逻辑 模板的设计实现了业务逻辑(view)与显示内容(template)的分离,一个视 ...
- C#中的委托和事件(上篇)
每一个初学C#的程序猿,在刚刚碰到委托和事件的概念时,估计都是望而却步,茫然摸不到头脑的.百度一搜,关于概念介绍的文章大把大把的,当然也不乏深入浅出的好文章.可看完这些文章,大多数新手,估计也只是信心 ...
- 大话Spark(9)-源码之TaskScheduler
上篇文章讲到DAGScheduler会把job划分为多个Stage,每个Stage中都会创建一批Task,然后把Task封装为TaskSet提交到TaskScheduler. 这里我们来一起看下Tas ...
- SpringBoot基于数据库实现简单的分布式锁
本文介绍SpringBoot基于数据库实现简单的分布式锁. 1.简介 分布式锁的方式有很多种,通常方案有: 基于mysql数据库 基于redis 基于ZooKeeper 网上的实现方式有很多,本文主要 ...
- ASP.NET CORE配置用户密码验证
在 class Startup 中配置 public void ConfigureServices(IServiceCollection services) { services.AddDbConte ...
- 数组指针&&指针数组
数组指针: 定义 int (*p)[n]; 占用内存中一个指针的存储空间 ()优先级高,首先说明p是一个指针,指向一个int型的一维数组,故名数组(的)指针.指向的一维数组的长度是n,也可以 ...