【Java WEB】MyBatis详解
个人主页Hello Code.
本文专栏《Java WEB从入门到实战》
Java WEB完整内容请点击前往Java WEB从入门到实战 查看
如有问题,欢迎指正,一起学习~~
文章目录
快速入门
MyBatis介绍入门程序 相关API映射配置文件
查询功能新增功能修改功能删除功能 核心配置文件
数据库连接配置文件引用起别名 Dao层的实现
传统方式接口代理方式 动态sql
if标签foreach标签SQL 片段的抽取 分页插件多表操作
一对一一对多多对多 注解开发
查询操作新增操作 注解多表操作构建SQL
查询操作新增操作修改操作删除操作
快速入门
框架是一款半成品软件,我们可以基于这个半成品软件继续开发,来完成我们的个性化需求
ORM(Object Relational Mapping)对象关系映射
指的是持久化数据和实体对象的映射模式,为了解决面向对象与关系型数据库存在的互不匹配的现象的技术
MyBatis介绍
原始 JDBC 的操作问题分析
- 频繁创建和销毁数据库的连接会造成系统资源浪费从而影响系统性能sql 语句在代码中硬编码,如果要修改sql语句,就需要修改 java 代码,造成代码不易维护查询操作时,需要手动将结果集中的数据封装到实体对象中增删改查操作需要参数时,需要手动将实体对象的数据设置到sql 语句的占位符
- 使用数据库连接池初始化连接资源将sql 语句抽取到配置文件中使用反射、内省等底层操作技术,将实体与表进行属性与字段的自动映射
数据库数据准备
导入 jar 包
在src 下创建映射配置文件
SELECT FROM student
在 src 下创建核心配置文件
编写测试类完成相关API 的使用
运行测试查看结果
package mybatis.study.dao; import mybatis.study.bean.Student; import .apache.ibatis.io.Resources; import .apache.ibatis.session.SqlSession; import .apache.ibatis.session.SqlSessionFactory; import .apache.ibatis.session.SqlSessionFactoryBuilder; import .junit.Test; import java.io.IOException; import java.io.InputStream; import java.util.List; public class StudentTest01 { @Test public void selectAll() thros IOException { // 1.加载核心配置文件 InputStream is = Resources.getResourceAsStream("MyBatisConfig.xml"); // 2. 获取SqlSession工厂对象 SqlSessionFactory sqlSessionFactory = ne SqlSessionFactoryBuilder().build(is); // 3.通过SqlSession工厂对象获取SqlSession对象 SqlSession sqlSession = sqlSessionFactory.openSession(); // 4.执行映射配置文件中的sql语句,并接收结果 Listlist = sqlSession.selectList("StudentMapper.selectAll"); // 5.处理结果 for(Student stu : list){ System.out.println(stu); } // 6.释放资源 sqlSession.close(); is.close(); } }
相关API
Resources
.apache.ibaties.io.Resources加载资源的工具类核心方法
返回值 方法名 说明 InputStreamgetResourcesAsStream(String fileName)通过类加载器返回指定资源的字节输入流
除了使用这个工具类的方法,还可以使用类名.class.getClassLoader().getResourceAsStream(配置文件名.xml)获取到字节输入流对象
SqlSessionFactoryBuilder
.apache.ibaties.session.SqlSessionFactoryBuilder获取SqlSessionFactory 工厂对象的功能类核心方法
返回值 方法名 说明 SqlSessionFactorybuild(InputStream is)通过指定资源字节输入流获取SqlSession 工厂对象
SqlSessionFactory
.apache.ibaties.srssion.SqlSessionFactory获取SqlSession 构建者对象的工厂接口核心方法
返回值 方法名 说明 SqlSessionopenSession()获取SqlSession 构建者对象,并开启手动提交事务SqlSessionopenSession(boolean autoCommit)获取SqlSession构建者对象,如果参数为true,则开启自动提交事务
SqlSession
.apache.ibaties.session.SqlSession构建者对象接口。用于执行SQL、管理事务、接口代理核心方法
返回值 方法名 说明 ListselectList(String statement,Object paramter)执行查询语句,返回List集合TselectOne(String statement,Object paramter)执行查询语句,返回一个结果对象intinsert(String statement,Object paramter)执行新增语句,返回影响行数intupdate(String statement,Object paramter)执行修改语句,返回影响行数intdelete(String statement,Object paramter)执行删除语句,返回影响行数voidmit()提交事务voidrollback()回滚事务TgetMapper(Classcls)获取指定接口的代理实现类对象voidclose()释放资源
映射配置文件
映射配置文件包含了数据和对象之间的映射关系以及要执行的SQL语句
查询功能
@Test public void selectById() thros IOException { InputStream is = Resources.getResourceAsStream("MybatisConfig.xml"); SqlSessionFactory sqlSessionFactory = ne SqlSessionFactoryBuilder().build(is); SqlSession sqlSession = sqlSessionFactory.openSession(); Student stu = sqlSession.selectOne("StudentMapper.selectById", 1); System.out.println(stu); sqlSession.close(); is.close(); }
注意属性名要和对象中的成员变量名称一致,才能获取到正确的值 对于增删改操作,返回的的结果都是int类型的影响行数,故resultType可以省略不写 注意属性名要和对象中的成员变量名称一致,才能获取到正确的值 核心配置文件包含了MyBatis 最核心的设置和属性信息。如数据库的连接、事务、连接池信息等
为了方便修改,可以将核心配置文件中的数据库连接信息抽取出来jdbc.properties 在核心配置文件中起别名后,就可以简化映射配置文件中的全类名 MyBatis自带的一些别名 分层思想控制层(controller)、业务层(service)、持久层(dao)调用流程 在MyBatis中,持久层叫mapper LOG4J 在日常开发过程中,排查问题时难免需要输出 MyBatis 真正执行的 SQL语句、参数、结果等信息,我们就可以借助 LOG4J 的功能来实现执行信息的输出使用步骤
传统方式实现Dao层,我们既需要写接口,还要写实现类。而MyBatis 框架可以帮助我们省略编写 Dao层接口实现类的步骤。程序员只需要编写接口,由MyBatis 框架根据接口的定义来创建该接口的动态代理对象 实现规则 代码实现 通过动态代理开发模式,我们只编写一个接口,不写实现类,我们通过 getMapper()方法最终获取到.apache.ibatis.binding.MapperProxy 代理对象,然后执行功能,而这个代理对象正是 MyBatis 使用了 JDK 的动态代理技术,帮助我们生成了代理实现类对象,从而可以进行相关持久化操作 动态代理实现类对象在执行方法的时候最终调用了 mapperMethod.execute() 方法,这个方法中通过 sitch语句根据操作类型来判断是新增、修改、删除、查询操作,一步回到了 MyBatis 最原生的 SqlSession 方式来执行增删改查 MyBatis 映射配置文件中,前面使用的SQL 都是比较简单的,有时候业务逻辑复杂时,我们的 SQL就是动态变化的,此时前面学习的 SQL 就不能满足需求了多条件查询 我们可以将一些重复性的SQL 语句进行抽取,以达到复用的效果
id唯一标识
parameterType指定参数映射的对象类型
resultType指定结果映射的对象类型SQL 获取参数
#{属性名}
新增功能
@Test
public void insert() thros IOException {
InputStream is = Resources.getResourceAsStream("MybatisConfig.xml");
SqlSessionFactory sqlSessionFactory = ne SqlSessionFactoryBuilder().build(is);
SqlSession sqlSession = sqlSessionFactory.openSession(true);
Student stu = ne Student(7,"老八",28);
int result = sqlSession.insert("StudentMapper.insert", stu);
// 如果没有开启自动提交事务,对于增删改,在执行完SQL后还需要提交事务
// sqlSession.mit();
System.out.println(result);
is.close();
sqlSession.close();
}
id唯一标识,配合名称空间使用
parameterType指定参数映射的对象类型
resultType指定结果映射的对象类型
SQL获取参数
#{属性名}
修改功能
@Test
public void update() thros IOException {
InputStream is = Resources.getResourceAsStream("MybatisConfig.xml");
SqlSessionFactory sqlSessionFactory = ne SqlSessionFactoryBuilder().build(is);
SqlSession sqlSession = sqlSessionFactory.openSession();
Student stu = ne Student(6,"周七七",37);
int result = sqlSession.insert("StudentMapper.update", stu);
// 如果没有开启自动提交事务,对于增删改,在执行完SQL后还需要提交事务
sqlSession.mit();
System.out.println(result);
is.close();
sqlSession.close();
}
id唯一标识,配合名称空间使用
parameterType指定参数映射的对象类型
resultType指定结果映射的对象类型SQL 获取参数
#{属性名}
删除功能
@Test
public void delete() thros IOException {
InputStream is = Resources.getResourceAsStream("MybatisConfig.xml");
SqlSessionFactory sqlSessionFactory = ne SqlSessionFactoryBuilder().build(is);
SqlSession sqlSession = sqlSessionFactory.openSession();
int result = sqlSession.delete("StudentMapper.delete", 7);
System.out.println(result);
// 提交事务
sqlSession.mit();
sqlSession.close();
is.close();
}
id唯一标识,配合名称空间使用
parameterType指定参数映射的对象类型
resultType指定结果映射的对象类型SQL 获取参数
#{属性名}
核心配置文件
数据库连接配置文件引用
driver=.mysql.jdbc.Driver
url=jdbc:mysql://192.168.23.129
username=root
passord=密码
resource数据库连接配置文件路径获取数据库连接参数
${键名}
起别名
type指定全类名
alias指定别名
别名 数据类型 stringjava.lang.Stringlongjava.lang.Longintjava.lang.Integerdoublejava.lang.Doublebooleanjava.lang.Boolean……
Dao层的实现
传统方式
控制层 --> 业务层 --> 持久层 --> DB
package mybatis.study.mapper;
import mybatis.study.bean.Student;
import java.util.List;
public interface StudentMapper {
// 查询全部
public abstract List
package mybatis.study.mapper.impl;
import mybatis.study.bean.Student;
import mybatis.study.mapper.StudentMapper;
import .apache.ibatis.io.Resources;
import .apache.ibatis.session.SqlSession;
import .apache.ibatis.session.SqlSessionFactory;
import .apache.ibatis.session.SqlSessionFactoryBuilder;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
public class StudentMapperImpl implements StudentMapper {
@Override
public List
package mybatis.study.service;
import mybatis.study.bean.Student;
import java.util.List;
public interface StudentService {
// 查询全部
public abstract List
package mybatis.study.service.impl;
import mybatis.study.bean.Student;
import mybatis.study.mapper.StudentMapper;
import mybatis.study.mapper.impl.StudentMapperImpl;
import mybatis.study.service.StudentService;
import java.util.List;
public class StudentServiceImpl implements StudentService {
// 创建持久层对象
private StudentMapper mapper = ne StudentMapperImpl();
@Override
public List
package mybatis.study.controller;
import mybatis.study.bean.Student;
import mybatis.study.service.StudentService;
import mybatis.study.service.impl.StudentServiceImpl;
import .junit.Test;
import java.util.List;
public class StudentController {
// 创建业务层对象
private StudentService service = ne StudentServiceImpl();
@Test
public void selectAll(){
List
导入jar 包修改核心配置文件
接口代理方式
在 src下编写LOG4J 配置文件# Global logging configuration
# 输出信息的显示。四个级别ERROR、WARN、INFO、DEBUG
log4j.rootLogger=DEBUG, stdout
# Console output...
log4j.appender.stdout=.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n
映射配置文件中的名称空间必须和 Dao 层接口的全类名相同映射配置文件中的增删改查标签的id属性必须和Dao层接口的方法名相同映射配置文件中的增删改查标签的 parameterType 属性必须和 Dao层 接口方法的参数相同映射配置文件中的增删改查标签的resultType 属性必须和 Dao层 接口方法的返回值相同
删除mapper层接口的实现类修改映射配置文件修改service 层接口的实现类,采用接口代理方式实现功能
@Override
public List
动态sql
SELECT FROM student WHERe id = ? AND name = ? AND age = ?
SELECt FROM student WHERe id = ? AND name = ?动态SQL 标签
foreach标签
属性
collection参数容器类型,(list-集合,array-数组)
open开始的 SQL 语句
close结束的 SQL 语句
item参数变量名
separator分隔符
SQL 片段的抽取
分页插件
分页可以将很多条结果进行分页显示如果当前在第一页,则没有上一页。如果在一页,则没有下一页需要明确当前是第几页,这一页中显示多少条结果
在企业级的开发中,分页也是一种常见的技术。而目前使用的 MyBatis 是不带分页功能的,如果想实现分页的功能,需要我们手动编写 LIMIT 语句。不同的数据库实现分页的 SQL 语句也是不同的,所以手写分页成本较高。这个时候可以借助分页插件来帮助我们实现分页功能
PageHelper第三方分页助手。将复杂的分页操作进行封装,从而让分页功能变得非常简单
分页插件实现步骤
- 导入jar 包pagehelper-5.1.10.jar jsqlparser-3.1.jar在核心配置文件中集成分页助手插件在测试类中使用分页助手相关 API 实现分页功能
分页参数的获取
PageInfo封装分页相关参数的功能类核心方法
返回值 方法名 说明 longgetTotal()获取总条数intgetPages()获取总页数intgetPageNum()获取当前页intgetPageSize()获取每页显示条数intgetPrePage()获取上一页intgetNextPage()获取下一页booleanisIsFirstPage()获取是否是第一页booleanisIsLastPage()获取是否是一页
@Test public void selectPaging() thros IOException { InputStream is = Resources.getResourceAsStream("MyBatisConfig.xml"); SqlSessionFactory sqlSessionFactory = ne SqlSessionFactoryBuilder().build(is); SqlSession sqlSession = sqlSessionFactory.openSession(true); StudentMapper mapper = sqlSession.getMapper(StudentMapper.class); // 通过分页助手实现分页功能 // 参数当前页,显示的条数 PageHelper.startPage(1,3); Listlist = mapper.selectAll(); for(Student stu : students){ System.out.println(stu); } //获取分页相关参数 PageInfo info = ne PageInfo<>(list); System.out.println("总条数" + info.getTotal()); System.out.println("总页数" + info.getPages()); System.out.println("当前页" + info.getPageNum()); System.out.println("每页条数" + info.getPageSize()); System.out.println("上一页" + info.getPrePage()); System.out.println("下一页" + info.getNextPage()); System.out.println("是否是第一页" + info.isIsFirstPage()); System.out.println("是否是一页" + info.isIsLastPage()); sqlSession.close(); is.close(); }
多表操作
我们之前学习的都是基于单表操作的,二实际开发中,随着业务逻辑难度的加深,肯定需要多表操作的多表模型的分类
一对一在任意一方建立外键,关联对方的主键一对多在多的一方建立外键,关联少的一方的主键多对多借助中间表,中间表至少两个字段,分别关联两张表的主键 一对一
一对一模型人和身份证,是一对一的关系数据准备
CREATE DATAbase db12; USE db12; CREATE TABLE person( id INT PRIMARY KEY AUTO_INCREMENT, NAME VARCHAR(20), age INT ); INSERT INTO person VALUES (NULL,'张三',23),(NULL,'李四',24),(NULL,'王五',25); CREATE TABLE card( id INT PRIMARY KEY AUTO_INCREMENT, number VARCHAR(30), pid INT, CONSTRAINT cp_fk FOREIGN KEY (pid) REFERENCES person(id) ); INSERT INTO card VALUES (NULL,'12345',1),(NULL,'23456',2),(NULL,'34567',3);映射配置文件
SELECT c.id,number,pid,NAME,age FROM card c,person p WHERe c.pid = p.id;
@Test public void selectAll() thros IOException { InputStream is = Resources.getResourceAsStream("MyBatisConfig.xml"); SqlSessionFactory sqlSessionFactory = ne SqlSessionFactoryBuilder().build(is); SqlSession sqlSession = sqlSessionFactory.openSession(true); OneToOneMapper mapper = sqlSession.getMapper(OneToOneMapper.class); Listlist = mapper.selectAll(); for(Card card : list){ System.out.println(card); } }
id属性唯一标识
type属性实体对象类型
column属性表中字段名称
property属性实体对象变量名称配置被包含对象的映射关系标签
property属性被包含对象的变量名
javaType属性被包含对象的数据类型 一对多
一对多模型班级和学生,一个班级可以有多个学生数据准备
CREATE TABLE classes( id INT PRIMARY KEY AUTO_INCREMENT, NAME VARCHAR(20) ); INSERT INTO classes VALUES (NULL,'一班'), (NULL,'二班'); CREATE TABLE student( id INT PRIMARY KEY AUTO_INCREMENT, NAME VARCHAR(30), age INT, cid INT, CONSTRAINT cs_fk FOREIGN KEY (cid) REFERENCES classes(id) ); INSERT INTO student VALUES (NULL,'张三',23,1),(NULL,'李四',24,1),(NULL,'王五',25,2),(NULL,'赵六',26,2);映射配置文件
SELECT c.id cid,c.name ame,s.id sid, s.name sname,s.age sage FROM classes c,student s WHERe c.id = s.cid;
@Test public void selectAll() thros IOException { InputStream is = Resources.getResourceAsStream("MyBatisConfig.xml"); SqlSessionFactory sqlSessionFactory = ne SqlSessionFactoryBuilder().build(is); SqlSession sqlSession = sqlSessionFactory.openSession(true); OneToManyMapper mapper = sqlSession.getMapper(OneToManyMapper.class); Listclasses = mapper.selectAll(); for(Classes cls : classes){ System.out.println(cls.getId() + "," + cls.getName()); List students = cls.getStudents(); for(Student stu : students){ System.out.println("t" + stu); } } }
多对多模型学生和课程,一个学生可以选择多门课程,一个课程也可以被多个学生所选择数据准备 我们除了使用映射配置文件来操作以外,还可以使用注解形式来操作常用注解 修改、删除操作原理相同 一对一 @Results封装映射关系的父注解 一对多 many属性一对多查询的固定属性@Many一对多查询的注解 多对多 多对多中的一些注解和一对多一样,主要区别就是多对多中使用了第三张中间表 我们之前通过注解开发时,相关SQL语句都是自己直接拼写的。一些关键字写起来比较麻烦,而且容易出错MyBatis 给我们提供了 .apache.ibatis.jdbc.SQL 功能类,专门用于构建 SQL语句
定义功能类并提供获取查询的SQL 语句的方法@SelectProvider生成查询用的 SQL语句注解 定义功能类并提供获取新增SQL语句的方法@InsertProvider生成新增用的SQL语句注解 定义功能类并提供获取修改SQL语句的方法@UpdateProvider生成修改用的 SQL语句注解 定义功能类并提供获取删除的 SQL语句的方法@DeleteProvider生成删除用的SQL语句注解
id属性唯一标识
type属性实体对象类型
column属性表中字段名称
property属性实体对象变量名称
property属性被包含集合对象的变量名
ofType属性集合中保存的对象数据类型
多对多
CREATE TABLE course(
id INT PRIMARY KEY AUTO_INCREMENT,
NAME VARCHAR(20)
);
INSERT INTO course VALUES (NULL,'语文'),(NULL,'数学');
CREATE TABLE stu_cr(
id INT PRIMARY KEY AUTO_INCREMENT,
sid INT,
cid INT,
CONSTRAINT sc_fk1 FOREIGN KEY (sid) REFERENCES student(id),
CONSTRAINT sc_fk2 FOREIGN KEY (cid) REFERENCES course(id)
);
INSERT INTO stu_cr VALUES (NULL,1,1),(NULL,1,2),(NULL,2,1),(NULL,2,2);
映射配置文件
@Test
public void selectAll() thros IOException {
InputStream is = Resources.getResourceAsStream("MyBatisConfig.xml");
SqlSessionFactory sqlSessionFactory = ne SqlSessionFactoryBuilder().build(is);
SqlSession sqlSession = sqlSessionFactory.openSession(true);
ManyToManyMapper mapper = sqlSession.getMapper(ManyToManyMapper.class);
List
id属性唯一标识
type属性实体对象类型
column属性表中字段名称
property属性实体对象变量名称
property属性被包含集合对象的变量名
ofType属性集合中保存的对象数据类型
注解开发
@Select("查询的SQL语句")执行查询操作注解
@Insert("新增的SQL语句")执行新增操作注解
@Update("修改的SQL语句")执行修改操作注解
@Delete("删除的SQL语句")执行删除操作注解
查询操作
创建接口和查询方法在核心配置文件中配置映射关系
新增操作
编写测试类@Test
public void selectAll() thros IOException {
InputStream is = Resources.getResourceAsStream("MyBatisConfig.xml");
SqlSessionFactory sqlSessionFactory = ne SqlSessionFactoryBuilder().build(is);
SqlSession sqlSession = sqlSessionFactory.openSession(true);
StudentMapper mapper = sqlSession.getMapper(StudentMapper.class);
List
在接口中创建新增方法
// 新增操作
@Insert("INSERT INTO student VALUES (#{id},#{name},#{age})")
public abstract Integer insert(Student stu);
编写测试类实现功能@Test
public void insert() thros IOException {
InputStream is = Resources.getResourceAsStream("MyBatisConfig.xml");
SqlSessionFactory sqlSessionFactory = ne SqlSessionFactoryBuilder().build(is);
SqlSession sqlSession = sqlSessionFactory.openSession(true);
StudentMapper mapper = sqlSession.getMapper(StudentMapper.class);
Student stu = ne Student(null,"周七",27);
Integer result = mapper.insert(stu);
System.out.println(result);
}
注解多表操作
// 查询全部
@Select("SELECT FROM card")
@Results(
{
@Result(column = "id", property = "id"),
@Result(column = "number", property = "number"),
@Result(
property = "p", //被包含对象的变量名
javaType = Person.class, //被包含对象的实际数据类型
column = "pid", // 根据查询出的card表中的pid查询person表
// one、@One 是一对一操作的固定写法
// select属性指定调用哪个接口中的哪个方法
one=@One(select = "mybatis.study.one_to_one.PersonMapper.selectById")
)
}
)
public abstract List
// 根据id查询
@Select("SELECT FROM student WHERe id = #{id}")
public abstract Person selectById(Integer id);
Result[] value()定义了Result数组@Result封装映射关系的子注解
column属性查询出表中的字段名称
property属性实体对象中的属性名
javaType属性被包含对象的数据类型
one属性一对一查询的固定属性@One一对一查询的注解
select属性指定调用某个接口中的方法
// 查询全部
@Select("SELECT FROM classes")
@Results({
@Result(column = "id",property = "id"),
@Result(column = "name",property = "name"),
@Result(
property = "students",
javaType = List.class,
column = "id",
many=@Many(select = "mybatis.study.one_to_many.StudentMapper.selectByCid")
)
})
public abstract List
//根据cid查询student表
@Select("SELECT FROM student WHERe cid = #{cid}")
public abstract List
select属性指定调用某个接口中的方法
// 查询全部
@Select("SELECT DISTINCT s.id,s.name,s.age FROM student s,stu_cr sc WHERe sc.sid=s.id")
@Results({
@Result(column = "id",property = "id"),
@Result(column = "name",property = "name"),
@Result(column = "age",property = "age"),
@Result(
property = "courses",
javaType= List.class,
column = "id",
many = @Many(select = "mybatis.study.many_to_many.CourseMapper.selectBySid")
)
})
public abstract List
// 根据学生id查询所选课程
@Select("SELECT c.id,c.name FROM stu_cr sc,course c WHERe sc.cid=c.id AND sc.sid = #{id}")
public abstract List
构建SQL
方法名 说明 SELECT(String…column)根据字段拼接查询语句FROM(String…table)根据表名拼接语句WHERe(String…condition)根据条件拼接语句INSERT_INTO(String table)根据表名拼接新增语句VALUES(String column,String values)根据字段和值拼接插入数据语句UPDATe(String table)根据表名拼接修改语句DELETE_FROM(String table)根据表名拼接删除语句… …… …
查询操作
type属性生成SQL 语句功能类对象
method属性指定调用方法
public static String getSql(){
String sql = ne SQL(){
{
SELECT("");
FROM("student");
}
}.toString();
return sql;
}
// 查询全部
// @Select("SELECT FROM student")
@SelectProvider(type = ReturnSql.class, method = "getSelectAll")
public abstract List
新增操作
type属性生成SQL语句功能类对象
method属性指定调用方法
// 定义方法,返回新增的sql语句
public String getInsert(Student stu){
return ne SQL(){
{
INSERT_INTO("student");
INTO_VALUES("#{id},#{name},#{age}");
}
}.toString();
}
// 新增操作
// @Insert("INSERT INTO student VALUES (#{id},#{name},#{age})")
@InsertProvider(type = ReturnSql.class,method = "getInsert")
public abstract Integer insert(Student stu);
修改操作
type属性生成SQL 语句功能类对象
method属性指定调用方法
// 定义方法,返回修改的SQL语句
public String getUpdate(Student stu){
return ne SQL(){
{
UPDATE("student");
SET("name=#{name}","age=#{age}");
WHERe("id=#{id}");
}
}.toString();
}
// 修改操作
//@Update("UPDATE student SET name=#{name},age=#{age} WHERe id = #{id}")
@UpdateProvider(type = ReturnSql.class,method = "getUpdate")
public abstract Integer update(Student stu);
删除操作
type属性生成SQL 语句功能类对象
method属性指定调用方法
// 定义方法,返回删除的sql语句
public String getDelete(Integer id){
return ne SQL(){
{
DELETE_FROM("student");
WHERe("id=#{id}");
}
}.toString();
}
// 删除操作
//@Delete("DELETE FROM student WHERe id = #{id}")
@DeleteProvider(type = ReturnSql.class,method = "getDelete")
public abstract Integer delete(Integer id);
空调维修
- 温岭冰箱全国统一服务热线-全国统一人工【7X2
- 荆州速热热水器维修(荆州热水器维修)
- 昆山热水器故障码5ER-昆山热水器故障码26
- 温岭洗衣机24小时服务电话—(7X24小时)登记报
- 统帅热水器售后维修服务电话—— (7X24小时)登
- 阳江中央空调统一电话热线-阳江空调官方售后电
- 乌鲁木齐阳春燃气灶厂家服务热线
- 珠海许昌集成灶售后服务电话-全国统一人工【
- 乌鲁木齐中央空调维修服务专线-乌鲁木齐中央空
- 新沂热水器故障电话码维修-新沂热水器常见故障
- 诸城壁挂炉24小时服务热线电话
- 靖江空调24小时服务电话-——售后维修中心电话
- 空调室外滴水管维修(空调室外排水管维修)
- 九江壁挂炉400全国服务电话-(7X24小时)登记报修
- 热水器故障码f.22怎么解决-热水器f0故障解决方法
- 营口热水器售后维修服务电话—— 全国统一人工