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

通过约定的方式定位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的动态代理方式实现增删改查的更多相关文章

  1. MyBatis学习(三)MyBatis基于动态代理方式的增删改查

    1.前言 上一期讲到MyBatis-Statement版本的增删改查.可以发现.这种代码写下来冗余的地方特别多.写一套没啥.如果涉及到多表多查询的时候就容易出现问题.故.官方推荐了一种方法.即MyBa ...

  2. Mybatis通过接口的方式实现增删改查

    导入jar包 [mybatis] [oracle] 生成数据库 1.添加Mybatis的配置文件mybatis-config.xml 在src目录下创建一个mybatis-config.xml文件,如 ...

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

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

  4. Mybatis实现简单的CRUD(增删改查)原理及实例分析

    Mybatis实现简单的CRUD(增删改查) 用到的数据库: CREATE DATABASE `mybatis`; USE `mybatis`; DROP TABLE IF EXISTS `user` ...

  5. Android-Sqlite-OOP方式操作增删改查

    之前写的数据库增删改查,是使用SQL语句来实现的,Google 就为Android开发人员考虑,就算不会SQL语句也能实现增删改查,所以就有了OOP面向对象的增删改查方式 其实这种OOP面向对象的增删 ...

  6. Mybatis学习笔记之---CRUD(增删改查)

    Mybatis的CRUD(增删改查) 1.pom.xml <dependencies> <dependency> <groupId>junit</groupI ...

  7. MyBatis初级实战之二:增删改查

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...

  8. ASP.NET Identity系列02,在ASP.NET MVC中增删改查用户

    本篇体验在ASP.NET MVC中使用ASP.NET Identity增删改查用户. 源码在这里:https://github.com/darrenji/UseIdentityCRUDUserInMV ...

  9. ssm框架(Spring Springmvc Mybatis框架)整合及案例增删改查

    三大框架介绍 ssm框架是由Spring springmvc和Mybatis共同组成的框架.Spring和Springmvc都是spring公司开发的,因此他们之间不需要整合.也可以说是无缝整合.my ...

随机推荐

  1. 002-pythn基础-循环、编码

    1. 循环 while 条件: 代码块(循环体) else: 当上面的条件为假. 才会执行 执行顺序: 判断条件是否为真. 如果真. 执行循环体. 然后再次判断条件....直到循环条件为假. 程序退出 ...

  2. SQLServer性能优化之---数据库级日记监控

    上节回顾:https://www.cnblogs.com/dotnetcrazy/p/11029323.html 4.6.6.SQLServer监控 脚本示意:https://github.com/l ...

  3. HDU XXXX:求[L,R]的素数数量(数位DP)

    Problem G Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 131072/131072K (Java/Other) Total S ...

  4. C#8.0: 在 LINQ 中支持异步的 IAsyncEnumerable

    C# 8.0中,提供了一种新的IAsyncEnumerable<T>接口,在对集合进行迭代时,支持异步操作.比如在读取文本中的多行字符串时,如果读取每行字符串的时候使用同步方法,那么会导致 ...

  5. redis可视化客户端

    1. 场景描述 redis安装完成后,使用命令行看还是有点不方便,github上有开源的redis可视化客户端,很好用,介绍下. 2.解决方案 使用redisclient客户端,来操作redis. 2 ...

  6. MyBatis select标签的用法

    From<MyBatis从入门到精通> 第一步,在接口中添加方法: public interface UserMapper { SysUser selectById(Long id); } ...

  7. 【DFS练习】-翻棋子-C++

    Description 有一个4*4的棋盘,放有16枚棋子. 每个棋子都是一面黑一面白,一开始有的黑面朝上,有的白面朝上. 下面是一个例子,这个例子用文字描述为: bwbw wwww bbwb bww ...

  8. delegate委托的例子,实现对Form中控件的更新

    using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...

  9. SpringMVC面试题:什么是Servlet?

    一.什么是servlet? servlet是一个Java编写的程序,此程序是基于http协议的,在服务器端(如Tomcat)运行的,是按照servlet规范编写的一个Java类.客户端发送请求至服务器 ...

  10. 使用Mxnet基于skip-gram模型实现word2vect

    1. 需求 使用skip-gram模式实现word2vect,然后在jaychou_lyrics.txt数据集上应用 jaychou_lyrics.txt数据集收录了周杰伦从第一张专辑到第十张专辑中的 ...