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

时间:2023-03-09 14:13:14
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);
}

接口和映射文件的对应关系图示:

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

匹配过程;(约定的过程)

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的动态代理方式实现增删改查