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 ...
随机推荐
- 微服务-springcloud-注册中心
创建服务注册中心(eureka-server) 1.创建项目,选择 Eureka Server 别的都不要选择,next-finish 2.application.yml中写入如下信息:通过eurek ...
- 终于有人说清楚了--XGBoost算法
1. 什么是XGBoost XGBoost是陈天奇等人开发的一个开源机器学习项目,高效地实现了GBDT算法并进行了算法和工程上的许多改进,被广泛应用在Kaggle竞赛及其他许多机器学习竞赛中并取得了不 ...
- html手机自适应屏幕
<meta name="viewport" content="height=device-width, initial-scale=1.0, maximum-sca ...
- 【MM系列】SAP 采购订单的批量修改
公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[MM系列]SAP 采购订单的批量修改 前言 ...
- C# Linq 常用查询操作符
限定操作: 1. All:用来确定是否序列中的所有元素都满足条件 2. Any:用来确定序列是否包含任何元素,有参方式用来确定序列中是否有元素满足条件 3. Contains:方法用来确定序列是否包含 ...
- C程序疑问解答 ——可怕的野指针
本篇为原创,禁止任何形式的他用! 一.疑问点 指针是C语言一个很强大的功能,同时也是很容易让人犯错的一个功能,用错了指针,轻者只是报个错,重者可能整个系统都崩溃了.下面是大家在编写C程 ...
- [USACO09OCT]Invasion of the Milkweed】乳草的侵占-C++
Farmer John一直努力让他的草地充满鲜美多汁的而又健康的牧草.可惜天不从人愿,他在植物大战人类中败下阵来.邪恶的乳草已经在他的农场的西北部份占领了一片立足之地. 草地像往常一样,被分割成一个高 ...
- JavaScript作用域及预编译
几乎所有的编程语言都可以存储,访问,修改变量,那在JavaScript中这些变量放在那里?程序如何找到他们? js被归类于解释执行语言,但事实上他也是一门编译语言,因为他也要编译,但于传统的编译语言不 ...
- bzoj2431 || 洛谷P1521 求逆序对
考虑一下插⼊法 n<=100n<=100n<=100 f[i][j]f[i][j]f[i][j]表⽰111~iii的全排列有j个逆序对的⽅案数 f[i][j]=Σf[i−1][j−k ...
- 开源一个好用的nodejs访问mysql类库
一.背景问题 自nodejs诞生以来出现了一大批的web框架如express koa2 egg等等,前端可以不再依赖后端可以自己控制服务端的逻辑.原来的后端开发同学的阵地前端如今同样也写的风生水起,撸 ...