MyBatis高级
下面修改的路径,就是文件夹的位置
MyBatis注解开发
简化操作步骤
常用注解
- @Select( "查询的SQL语句”) :执行查询操作注解
- @Insert(“新增的SQL语句”) : 执行新增操作注解
- @Update(“修改的SQL语句”) :执行修改操作注解
- @Delete(“删除的SQL语句”) :执行删除操作注解
查询操作
- 创建接口和查询方法
- 在核心配置文件中配置映射关系
- 编写测试类
jdbc.properties
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://127.0.0.1:3306/db0809pm
username=root
password=2184021338
log4j.properties
#Global logging configuration
# 输出信息显示,级别从高到低:ERROR WARN INFO DEBUG
# stdout:把信息输出到控制台上
log4j.rootLogger=DEBUG, stdout
#Console output...
# 下面的三个是输出格式
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n
MyBatisConfig.xml
<?xml version="1.0" encoding="UTF-8" ?><!--XML文档说明-->
<!--MyBatis的DTD约束:对标签的约束以及相应的提示的功能-->
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
<!--configuration:核心根标签-->
<configuration>
<!-- 引入数据库连接的配置文件-->
<properties resource="jdbc.properties"/>
<!-- 配置LOG4J-->
<settings>
<setting name="logImpl" value="log4j"/>
</settings>
<!-- 起别名-->
<typeAliases>
<package name="com.yy.bEan"/>
</typeAliases>
<!-- environments 配置数据库环境 ,环境可以有多高 default属性指定使用的是哪一个 -->
<environments default="mysql"><!--default:指定是下面的哪一个数据库 -->
<!-- environment 配置数控环境 id属性代表唯一标识 -->
<environment id="mysql">
<!-- transactionManager代表事务的管理 type属性,采用JDBC默认的事务处理 -->
<transactionManager type="JDBC"></transactionManager>
<!-- dataSource 数据源的信息 type属性代表连接池-->
<dataSource type="POOLED">
<!-- property 获取数据库连接的信息 -->
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
</dataSource>
</environment>
</environments>
<!-- mappers 代表引入映射配置文件 -->
<!-- 配置映射关系-->
<mappers>
<package name="com.yy.mapper"/>
</mappers>
</configuration>
接口
public interface PersonMapper {
//查询全部
@Select("SELECT * FROM person")
public abstract List<Person> selectAll();
}
测试类
@Test
public void selectAll() throws Exception{
//加载核心配置文件
InputStream is = Resources.getResourceAsStream("MyBatisConfig.xml");
//获取SqlSession工厂对象
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
//通过个处对象获取SqlSession对象
SqlSession sqlSession = sqlSessionFactory.openSession(true);
//获取PersonMapper接口中的实现类对象
PersonMapper mapper = sqlSession.getMapper(PersonMapper.class);
//调用实现类对象中的方法,接受结果
List<Person> people = mapper.selectAll();
//处理结果
for(Person p : people){
System.out.println(p);
}
//释放资源
sqlSession.close();
is.close();
}
/*
DEBUG [main] - Opening JDBC Connection
DEBUG [main] - Created connection 1916575798.
DEBUG [main] - ==> Preparing: SELECT * FROM person
DEBUG [main] - ==> Parameters:
DEBUG [main] - <== Total: 3
Person{id=1, name='张三', age=23}
Person{id=2, name='李四', age=24}
Person{id=3, name='王五', age=25}
*/
新增操作
- 创建新增方法
- 编写测试类
接口
public interface PersonMapper {
//查询全部
@Select("SELECT * FROM person")
public abstract List<Person> selectAll();
//新增操作
@Insert("INSERT INTO person VALUES (#{id},#{name},#{age})")
public abstract Integer insert(Person per);
}
测试类
@Test
public void insert() throws Exception{
//加载核心配置文件
InputStream is = Resources.getResourceAsStream("MyBatisConfig.xml");
//获取SqlSession工厂对象
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
//通过个处对象获取SqlSession对象
SqlSession sqlSession = sqlSessionFactory.openSession(true);
//获取PersonMapper接口中的实现类对象
PersonMapper mapper = sqlSession.getMapper(PersonMapper.class);
//调用实现类对象中的方法,接受结果
Person per = new Person(4,"赵六",20);
Integer insert = mapper.insert(per);
//处理结果
System.out.println(insert);
//释放资源
sqlSession.close();
is.close();
}
/*
DEBUG [main] - Opening JDBC Connection
DEBUG [main] - Created connection 205721196.
DEBUG [main] - ==> Preparing: INSERT INTO person VALUES (?,?,?)
DEBUG [main] - ==> Parameters: 4(Integer), 赵六(String), 20(Integer)
DEBUG [main] - <== Updates: 1
1
DEBUG [main] - Closing JDBC Connection [com.mysql.jdbc.JDBC4Connection@c430e6c]
DEBUG [main] - Returned connection 205721196 to pool.
Process finished with exit code 0
*/
修改操作
- 创建修改方法(在接口当中创建)
- 编写测试类
//修改操作
@Update("UPDATE person SET name=#{name},age=#{age} WHERE id=#{id}")
public abstract Integer update(Person per);
@Test
public void update() throws Exception{
//加载核心配置文件
InputStream is = Resources.getResourceAsStream("MyBatisConfig.xml");
//获取SqlSession工厂对象
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
//通过个处对象获取SqlSession对象
SqlSession sqlSession = sqlSessionFactory.openSession(true);
//获取PersonMapper接口中的实现类对象
PersonMapper mapper = sqlSession.getMapper(PersonMapper.class);
//调用实现类对象中的方法,接受结果
Person per = new Person(4,"赵六",30);
Integer update = mapper.update(per);
//处理结果
System.out.println(update);
//释放资源
sqlSession.close();
is.close();
}
/*
DEBUG [main] - Opening JDBC Connection
DEBUG [main] - Created connection 438589491.
DEBUG [main] - ==> Preparing: UPDATE person SET name=?,age=? WHERE id=?
DEBUG [main] - ==> Parameters: 赵六(String), 30(Integer), 4(Integer)
DEBUG [main] - <== Updates: 1
1
DEBUG [main] - Closing JDBC Connection [com.mysql.jdbc.JDBC4Connection@1a245833]
*/
删除操作
- 创建删除方法(在接口当中创建)
- 编写测试类
//删除操作
@Delete("DELETE FROM person WHERE id=#{id}")
public abstract Integer delete(Integer id);
@Test
public void delete() throws Exception{
//加载核心配置文件
InputStream is = Resources.getResourceAsStream("MyBatisConfig.xml");
//获取SqlSession工厂对象
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
//通过个处对象获取SqlSession对象
SqlSession sqlSession = sqlSessionFactory.openSession(true);
//获取PersonMapper接口中的实现类对象
PersonMapper mapper = sqlSession.getMapper(PersonMapper.class);
//调用实现类对象中的方法,接受结果
Integer delete = mapper.delete(4);
//处理结果
System.out.println(delete);
//释放资源
sqlSession.close();
is.close();
}
/*
DEBUG [main] - Opening JDBC Connection
DEBUG [main] - Created connection 1250121181.
DEBUG [main] - ==> Preparing: DELETE FROM person WHERE id=?
DEBUG [main] - ==> Parameters: 4(Integer)
DEBUG [main] - <== Updates: 1
1
DEBUG [main] - Closing JDBC Connection [com.mysql.jdbc.JDBC4Connection@4a8355dd]
DEBUG [main] - Returned connection 1250121181 to pool.
Process finished with exit code 0
*/
小结
MyBatis注解实现多表操作
数据使用是进阶内容里面的多表操作数据
一对一
环境准备
@Results :封装映射关系的父注解。
Result[ value() :定义了Result数组
@Result :封装映射关系的子注解。
column属性:查询出的表中字段名称
property属性:实体对象中的属性名称
javaType属性:被包含对象的数据类型
one属性:一对一查询固定属性
@One :一对一查询的注解。
select属性:指定调用某个接口中的方法
MYBatisConfig.xml
就修改路径就可以
<?xml version="1.0" encoding="UTF-8" ?><!--XML文档说明-->
<!--MyBatis的DTD约束:对标签的约束以及相应的提示的功能-->
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
<!--configuration:核心根标签-->
<configuration>
<!-- 引入数据库连接的配置文件-->
<properties resource="jdbc.properties"/>
<!-- 配置LOG4J-->
<settings>
<setting name="logImpl" value="log4j"/>
</settings>
<!-- 起别名-->
<typeAliases>
<package name="com.yy.bEan"/>
</typeAliases>
<!-- environments 配置数据库环境 ,环境可以有多高 default属性指定使用的是哪一个 -->
<environments default="mysql"><!--default:指定是下面的哪一个数据库 -->
<!-- environment 配置数控环境 id属性代表唯一标识 -->
<environment id="mysql">
<!-- transactionManager代表事务的管理 type属性,采用JDBC默认的事务处理 -->
<transactionManager type="JDBC"></transactionManager>
<!-- dataSource 数据源的信息 type属性代表连接池-->
<dataSource type="POOLED">
<!-- property 获取数据库连接的信息 -->
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
</dataSource>
</environment>
</environments>
<!-- mappers 代表引入映射配置文件 -->
<!-- 配置映射关系-->
<mappers>
<package name="com.yy.one_to_one"/>
</mappers>
</configuration>
PersonMapper.java
public interface PersonMapper {
//根据id查询
@Select("SELECT * FROM person WHERE id=#{id}")
public abstract Person selectById(Integer id);
}
CardMapper.java
public interface CardMappper {
//查询全部
@Select("SELECT * FROM card")
//Results:通过他里面的属性来完成对象以及表中数据的赋值关系
@Results({
//Result:数组,封装数据
@Result(column = "id",property = "id"),
@Result(column = "number",property = "number"),
//为person类赋值
@Result(
property = "p",//被包含对象的名字
javaType = Person.class,//被包含对象的实际数据类型
//column:根据card表中查询的哪一个字段来去查询Person表
column = "pid",//根据查询出的card表中的pid字段来查询person表
/*
one、@One 一对一查询的固定写法
select属性:指定调用哪个接口中的哪个方法
*/
one = @One(select = "com.yy.one_to_one.PersonMapper.selectById")
)
})
public abstract List<Card> selectAll();
}
测试类
@Test
public void selectAll() throws Exception{
//加载核心配置文件
InputStream is = Resources.getResourceAsStream("MyBatisConfig.xml");
//获取SqlSession工厂对象
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
//通过个处对象获取SqlSession对象
SqlSession sqlSession = sqlSessionFactory.openSession(true);
//获取PersonMapper接口中的实现类对象
CardMappper mapper = sqlSession.getMapper(CardMappper.class);
//调用实现类对象中的方法,接受结果
List<Card> cards = mapper.selectAll();
//处理结果
for(Card c : cards){
System.out.println(c);
}
//释放资源
sqlSession.close();
is.close();
}
/*结果
DEBUG [main] - Opening JDBC Connection
DEBUG [main] - Created connection 1072377306.
DEBUG [main] - ==> Preparing: SELECT * FROM card
DEBUG [main] - ==> Parameters:
DEBUG [main] - ====> Preparing: SELECT * FROM person WHERE id=?
DEBUG [main] - ====> Parameters: 1(Integer)
DEBUG [main] - <==== Total: 1
DEBUG [main] - ====> Preparing: SELECT * FROM person WHERE id=?
DEBUG [main] - ====> Parameters: 2(Integer)
DEBUG [main] - <==== Total: 1
DEBUG [main] - ====> Preparing: SELECT * FROM person WHERE id=?
DEBUG [main] - ====> Parameters: 3(Integer)
DEBUG [main] - <==== Total: 1
DEBUG [main] - <== Total: 3
Card{id=1, number='12345', p=Person{id=1, name='张三', age=23}}
Card{id=2, number='12346', p=Person{id=2, name='李四', age=24}}
Card{id=3, number='12347', p=Person{id=3, name='王五', age=25}}
DEBUG [main] - Closing JDBC Connection [com.mysql.jdbc.JDBC4Connection@3feb2dda]
*/
一对多
环境准备
@Results :封装映射关系的父注解。
Result[ value() : 定义了Result数组
@Result :封装映射关系的子注解。
column属性:查询出的表中字段名称
property属性:实体对象中的属性名称
javaType属性:被包含对象的数据类型
many属性:一对多查询固定属性
@Many :一对多查询的注解。
select属性:指定调用某个接口中的方法
MyBatisConfig.xml
这样写的话,可以把yy下面的所有java文件都给配置上,相对于作用域扩大
<!-- 配置映射关系-->
<mappers>
<package name="com.yy"/>
</mappers>
StudentMapper.java
public interface StudentMapper {
//根据id查询
@Select("SELECT * FROM student1 WHERE id=#{id}")
public abstract List<Student> selectByCid(Integer cid);
}
ClassesMapper.java
public interface ClassesMapper {
//查询全部
@Select("SELECT * FROM classes")
@Results({
@Result(column = "id",property = "id"),
@Result(column = "name",property = "name"),
@Result(
property = "students",//被包含对象的变量名字
javaType = List.class,//被包含对象的实际的数据类型
column = "id", //根据查询出的classes表的id字段去查询student1表
/*
many、@Many 一对多查询的固定写法
select属性:指定调用哪个接口中的哪个查询方法
*/
many = @Many(select = "com.yy.one_to_many.StudentMapper.selectByCid")
)
})
public abstract List<Classes> selectAll();
}
测试类
@Test
public void selectAll() throws Exception{
//加载核心配置文件
InputStream is = Resources.getResourceAsStream("MyBatisConfig.xml");
//获取SqlSession工厂对象
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
//通过个处对象获取SqlSession对象
SqlSession sqlSession = sqlSessionFactory.openSession(true);
//获取PersonMapper接口中的实现类对象
ClassesMapper mapper = sqlSession.getMapper(ClassesMapper.class);
//调用实现类对象中的方法,接受结果
List<Classes> classes = mapper.selectAll();
//处理结果
for (Classes cls : classes){
System.out.println(cls.getId()+","+cls.getName());
List<Student> students = cls.getStudents();
for(Student student : students){
System.out.println("\t"+student);
}
}
//释放资源
sqlSession.close();
is.close();
}
/*
DEBUG [main] - Opening JDBC Connection
DEBUG [main] - Created connection 477376212.
DEBUG [main] - ==> Preparing: SELECT * FROM classes
DEBUG [main] - ==> Parameters:
DEBUG [main] - ====> Preparing: SELECT * FROM student1 WHERE id=?
DEBUG [main] - ====> Parameters: 1(Integer)
DEBUG [main] - <==== Total: 1
DEBUG [main] - ====> Preparing: SELECT * FROM student1 WHERE id=?
DEBUG [main] - ====> Parameters: 2(Integer)
DEBUG [main] - <==== Total: 1
DEBUG [main] - <== Total: 2
1,一班
Student{id=1, name='张三', age=23}
2,二班
Student{id=2, name='李四', age=24}
DEBUG [main] - Closing JDBC Connection [com.mysql.jdbc.JDBC4Connection@1c742ed4]
*/
多对多
和一对多差不多,只是在第一条sql语句时需要修改,注意sql语句的编写
环境准备
@Results :封装映射关系的父注解。
Result[ value() :定义了Result数组
@Result :封装映射关系的子注解。
column属性:查询出的表中字段名称
property属性:实体对象中的属性名称
javaType属性:被包含对象的数据类型
many属性:一对多查询固定属性
@Many :一对多查询的注解。
select属性:指定调用某个接口中的方法
MyBatisConfig.xml
因为上面的mapper设置为包的路径,所以现在不用再去修改路径了
CourseMapper.java
public interface CourseMapper {
//根据学生id查询所选课程
@Select("SELECT c.id,c.name FROM stu_cr sc,course c WHERE sc.cid =c.id AND sc.id=#{id}")
public abstract List<Course> selectBySid(Integer id);
}
StudentMapper.java
public interface StudentMapper {
//查询全部
@Select("SELECT * FROM student1")
@Results({
@Result(column = "id",property = "id"),
@Result(column = "name",property = "name"),
@Result(column = "age",property = "age"),
@Result(
property = "courses",//被包含对象的变量名
javaType = List.class,//被包含对象的实际数据类型
column = "id", //根据查询出student1表的id来作为关联条件,去查询中间表和课程表
/*
many、@Many 一对多查询的固定写法
select属性:指定调用哪个接口中的哪个查询方法
*/
many = @Many(select = "com.yy.many_to_many.CourseMapper.selectBySid")
)
})
public abstract List<Student1> selectAll();
}
测试类
@Test
public void selectAll() throws Exception{
//加载核心配置文件
InputStream is = Resources.getResourceAsStream("MyBatisConfig.xml");
//获取SqlSession工厂对象
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
//通过个处对象获取SqlSession对象
SqlSession sqlSession = sqlSessionFactory.openSession(true);
//获取PersonMapper接口中的实现类对象
StudentMapper mapper = sqlSession.getMapper(StudentMapper.class);
//调用实现类对象中的方法,接受结果
List<Student1> student1s = mapper.selectAll();
//处理结果
for (Student1 student1 : student1s){
System.out.println(student1.getId()+","+student1.getName()+","+student1.getAge());
List<Course> courses = student1.getCourses();
for(Course course : courses){
System.out.println("\t"+course);
}
}
//释放资源
sqlSession.close();
is.close();
}
/*
DEBUG [main] - Opening JDBC Connection
DEBUG [main] - Created connection 1649320501.
DEBUG [main] - ==> Preparing: SELECT * FROM student1
DEBUG [main] - ==> Parameters:
DEBUG [main] - ====> Preparing: SELECT c.id,c.name FROM stu_cr sc,course c WHERE sc.cid =c.id AND sc.id=?
DEBUG [main] - ====> Parameters: 1(Integer)
DEBUG [main] - <==== Total: 1
DEBUG [main] - ====> Preparing: SELECT c.id,c.name FROM stu_cr sc,course c WHERE sc.cid =c.id AND sc.id=?
DEBUG [main] - ====> Parameters: 2(Integer)
DEBUG [main] - <==== Total: 1
DEBUG [main] - ====> Preparing: SELECT c.id,c.name FROM stu_cr sc,course c WHERE sc.cid =c.id AND sc.id=?
DEBUG [main] - ====> Parameters: 3(Integer)
DEBUG [main] - <==== Total: 1
DEBUG [main] - ====> Preparing: SELECT c.id,c.name FROM stu_cr sc,course c WHERE sc.cid =c.id AND sc.id=?
DEBUG [main] - ====> Parameters: 4(Integer)
DEBUG [main] - <==== Total: 1
DEBUG [main] - <== Total: 4
1,张三,23
Course{id=1, name='语文'}
2,李四,24
Course{id=2, name='数学'}
3,王五,25
Course{id=1, name='语文'}
4,赵六,26
Course{id=2, name='数学'}
DEBUG [main] - Closing JDBC Connection [com.mysql.jdbc.JDBC4Connection@624ea235]
*/
优化
public interface StudentMapper {
//查询全部
@Select("SELECT DISTINCT s.id,s.name,s.age FROM student1 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", //根据查询出student1表的id来作为关联条件,去查询中间表和课程表
/*
many、@Many 一对多查询的固定写法
select属性:指定调用哪个接口中的哪个查询方法
*/
many = @Many(select = "com.yy.many_to_many.CourseMapper.selectBySid")
)
})
public abstract List<Student1> selectAll();
}
结果
/*
DEBUG [main] - Opening JDBC Connection
DEBUG [main] - Created connection 1293203138.
DEBUG [main] - ==> Preparing: SELECT DISTINCT s.id,s.name,s.age FROM student1 s,stu_cr sc WHERE sc.sid=s.id
DEBUG [main] - ==> Parameters:
DEBUG [main] - ====> Preparing: SELECT c.id,c.name FROM stu_cr sc,course c WHERE sc.cid =c.id AND sc.id=?
DEBUG [main] - ====> Parameters: 1(Integer)
DEBUG [main] - <==== Total: 1
DEBUG [main] - ====> Preparing: SELECT c.id,c.name FROM stu_cr sc,course c WHERE sc.cid =c.id AND sc.id=?
DEBUG [main] - ====> Parameters: 2(Integer)
DEBUG [main] - <==== Total: 1
DEBUG [main] - <== Total: 2
1,张三,23
Course{id=1, name='语文'}
2,李四,24
Course{id=2, name='数学'}
DEBUG [main] - Closing JDBC Connection [com.mysql.jdbc.JDBC4Connection@4d14b6c2]
小结
@Results :封装映射关系的父注解。
Result[ value0 :定义了Result数组
@Result :封装映射关系的子注解。
column属性:查询出的表中字段名称
property属性:实体对象中的属性名称;
javaType属性:被包含对象的数据类型
one属性:-对一 查询固定属性
many属性:一对多查询固定属性
@One :- 对一查询的注解。
select属性:指定调用某个接[中的方法
@Many :一对多查询的注解。
select属性:指定调用某个接口中的方法
MyBatis构建SQL语句
介绍
好处:降低出错率
package com.yy.sql;
import org.apache.ibatis.jdbc.SQL;
/**
* @author Marston
* @date 2021/8/19
*/
public class SqlTest {
public static void main(String[] args) {
String sql = getSql();
System.out.println(sql);//SELECT * FROM student"
}
//定义方法,获取查询student表的sql语句
// private static String getSql() {
// String sql = "SELECT * FROM student";
// return sql;
// }
private static String getSql() {
String sql = new SQL(){
{
SELECT("*");
FROM("student");
}
}.toString();
return sql;
}
}
/*
两个方法的返回值都一样
*/
查询操作
定义功能类并提供获取查询的SQL语句的方法。
@SelectProvider :生成查询用的SQL语句注解。
type属性:生成SQL语句功能类对象
method属性:指定调用方法
ReturnSql.java
public class ReturnSql {
//定义方法,返回查询的sql语句
public String getSelectAll(){
return new SQL(){
{
SELECT("*");
FROM("person");
}
}.toString();
}
}
PersonMapper.java
package com.yy.mapper;
import com.yy.bEan.Person;
import com.yy.sql.ReturnSql;
import org.apache.ibatis.annotations.*;
import java.util.List;
/**
* @author Marston
* @date 2021/8/19
*/
public interface PersonMapper {
/*
//查询全部
@Select("SELECT * FROM person")
public abstract List<Person> selectAll();
//新增操作
@Insert("INSERT INTO person VALUES (#{id},#{name},#{age})")
public abstract Integer insert(Person per);
//修改操作
@Update("UPDATE person SET name=#{name},age=#{age} WHERE id=#{id}")
public abstract Integer update(Person per);
//删除操作
@Delete("DELETE FROM person WHERE id=#{id}")
public abstract Integer delete(Integer id);
*/
//查询全部
//@Select("SELECT * FROM person")
@SelectProvider(type = ReturnSql.class,method = "getSelectAll")
public abstract List<Person> selectAll();
//新增操作
@Insert("INSERT INTO person VALUES (#{id},#{name},#{age})")
public abstract Integer insert(Person per);
//修改操作
@Update("UPDATE person SET name=#{name},age=#{age} WHERE id=#{id}")
public abstract Integer update(Person per);
//删除操作
@Delete("DELETE FROM person WHERE id=#{id}")
public abstract Integer delete(Integer id);
}
@Test
public void selectAll() throws Exception{
//加载核心配置文件
InputStream is = Resources.getResourceAsStream("MyBatisConfig.xml");
//获取SqlSession工厂对象
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
//通过个处对象获取SqlSession对象
SqlSession sqlSession = sqlSessionFactory.openSession(true);
//获取PersonMapper接口中的实现类对象
PersonMapper mapper = sqlSession.getMapper(PersonMapper.class);
//调用实现类对象中的方法,接受结果
List<Person> people = mapper.selectAll();
//处理结果
for(Person p : people){
System.out.println(p);
}
//释放资源
sqlSession.close();
is.close();
}
/*
DEBUG [main] - Opening JDBC Connection
DEBUG [main] - Created connection 93199773.
DEBUG [main] - ==> Preparing: SELECT * FROM person
DEBUG [main] - ==> Parameters:
DEBUG [main] - <== Total: 3
Person{id=1, name='张三', age=23}
Person{id=2, name='李四', age=24}
Person{id=3, name='王五', age=25}
DEBUG [main] - Closing JDBC Connection [com.mysql.jdbc.JDBC4Connection@58e1d9d]
*/
新增操作
定义功能类并提供获取新增的SQL语句的方法。
@InsertProvider :生成新增用的SQL语句注解。
type属性:生成SQL语句功能类对象
method属性:指定调用方法
ReturnSql.java
public class ReturnSql {
//定义方法,返回查询的sql语句
public String getSelectAll(){
return new SQL(){
{
SELECT("*");
FROM("person");
}
}.toString();
}
//定义方法,返回新增的sql语句
public String getInsert(Person per){
return new SQL(){
{
INSERT_INTO("person");
INTO_VALUES("#{id},#{name},#{age}");
}
}.toString();
}
}
PersonMapper.java
package com.yy.mapper;
import com.yy.bEan.Person;
import com.yy.sql.ReturnSql;
import org.apache.ibatis.annotations.*;
import java.util.List;
/**
* @author Marston
* @date 2021/8/19
*/
public interface PersonMapper {
/*
//查询全部
@Select("SELECT * FROM person")
public abstract List<Person> selectAll();
//新增操作
@Insert("INSERT INTO person VALUES (#{id},#{name},#{age})")
public abstract Integer insert(Person per);
//修改操作
@Update("UPDATE person SET name=#{name},age=#{age} WHERE id=#{id}")
public abstract Integer update(Person per);
//删除操作
@Delete("DELETE FROM person WHERE id=#{id}")
public abstract Integer delete(Integer id);
*/
//查询全部
//@Select("SELECT * FROM person")
@SelectProvider(type = ReturnSql.class,method = "getSelectAll")
public abstract List<Person> selectAll();
//新增操作
// @Insert("INSERT INTO person VALUES (#{id},#{name},#{age})")
@InsertProvider(type = ReturnSql.class,method = "getInsert")
public abstract Integer insert(Person per);
//修改操作
@Update("UPDATE person SET name=#{name},age=#{age} WHERE id=#{id}")
public abstract Integer update(Person per);
//删除操作
@Delete("DELETE FROM person WHERE id=#{id}")
public abstract Integer delete(Integer id);
}
测试类
@Test
public void insert() throws Exception{
//加载核心配置文件
InputStream is = Resources.getResourceAsStream("MyBatisConfig.xml");
//获取SqlSession工厂对象
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
//通过个处对象获取SqlSession对象
SqlSession sqlSession = sqlSessionFactory.openSession(true);
//获取PersonMapper接口中的实现类对象
PersonMapper mapper = sqlSession.getMapper(PersonMapper.class);
//调用实现类对象中的方法,接受结果
Person per = new Person(4,"赵六",20);
Integer insert = mapper.insert(per);
//处理结果
System.out.println(insert);
//释放资源
sqlSession.close();
is.close();
}
/*
EBUG [main] - Opening JDBC Connection
DEBUG [main] - Created connection 136393487.
DEBUG [main] - ==> Preparing: INSERT INTO person VALUES (?,?,?)
DEBUG [main] - ==> Parameters: 4(Integer), 赵六(String), 20(Integer)
DEBUG [main] - <== Updates: 1
1
DEBUG [main] - Closing JDBC Connection [com.mysql.jdbc.JDBC4Connection@821330f]
*/
修改操作
定义功能类并提供获取修改的SQL语句的方法。
@UpdateProvider :生成修改用的SQL语句注解。
type属性:生成SQL语句功能类对象
method属性:指定调用方法
ReturnSql.java
//定义方法,返回修改的sql语句
public String getUpdate(Person per){
return new SQL(){
{
UPDATE("person");
SET("name=#{name}","age=#{age}");
WHERE("id=#{id}");
}
}.toString();
}
//修改操作
//@Update("UPDATE person SET name=#{name},age=#{age} WHERE id=#{id}")
@UpdateProvider(type = ReturnSql.class,method = "getUpdate")
public abstract Integer update(Person per);
@Test
public void update() throws Exception{
//加载核心配置文件
InputStream is = Resources.getResourceAsStream("MyBatisConfig.xml");
//获取SqlSession工厂对象
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
//通过个处对象获取SqlSession对象
SqlSession sqlSession = sqlSessionFactory.openSession(true);
//获取PersonMapper接口中的实现类对象
PersonMapper mapper = sqlSession.getMapper(PersonMapper.class);
//调用实现类对象中的方法,接受结果
Person per = new Person(4,"赵六",30);
Integer update = mapper.update(per);
//处理结果
System.out.println(update);
//释放资源
sqlSession.close();
is.close();
}
/*
DEBUG [main] - Opening JDBC Connection
DEBUG [main] - Created connection 959629210.
DEBUG [main] - ==> Preparing: UPDATE person SET name=?, age=? WHERE (id=?)
DEBUG [main] - ==> Parameters: 赵六(String), 30(Integer), 4(Integer)
DEBUG [main] - <== Updates: 1
1
DEBUG [main] - Closing JDBC Connection [com.mysql.jdbc.JDBC4Connection@3932c79a]
DEBUG [main] - Returned connection 959629210 to pool.
Process finished with exit code 0
*/
删除操作
定义功能类并提供获取删除的SQL语句的方法。
@DeleteProvider :生成删除用的SQL语句注解。
type属性:生成SQL语句功能类对象
method属性:指定调用方法
//定义方法,返回删除的sql语句
public String getDelete(Integer id){
return new SQL(){
{
DELETE_FROM("person");
WHERE("id=#{id}");
}
}.toString();
}
//删除操作
//@Delete("DELETE FROM person WHERE id=#{id}")
@DeleteProvider(type = ReturnSql.class,method = "getDelete")
public abstract Integer delete(Integer id);
@Test
public void delete() throws Exception{
//加载核心配置文件
InputStream is = Resources.getResourceAsStream("MyBatisConfig.xml");
//获取SqlSession工厂对象
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
//通过个处对象获取SqlSession对象
SqlSession sqlSession = sqlSessionFactory.openSession(true);
//获取PersonMapper接口中的实现类对象
PersonMapper mapper = sqlSession.getMapper(PersonMapper.class);
//调用实现类对象中的方法,接受结果
Integer delete = mapper.delete(4);
//处理结果
System.out.println(delete);
//释放资源
sqlSession.close();
is.close();
}
/*
DEBUG [main] - Opening JDBC Connection
DEBUG [main] - Created connection 603305436.
DEBUG [main] - ==> Preparing: DELETE FROM person WHERE (id=?)
DEBUG [main] - ==> Parameters: 4(Integer)
DEBUG [main] - <== Updates: 1
1
DEBUG [main] - Closing JDBC Connection [com.mysql.jdbc.JDBC4Connection@23f5b5dc]
DEBUG [main] - Returned connection 603305436 to pool.
Process finished with exit code 0
*/
小结
org.apache.ibatis.jdbc.SQL :构建SQL语句的功能类。通过一些方法来代替 SQL语句的关键字。
SELECTO
FROMO
WHEREO
INSERT INTOO
VALUESO
UPDATE(
DELETE_ FROM0
@SelectProvider :成查询用的SQL语句注解。
@InsertProvider :生成新增用的SQL语句注解。
@UpdateProvider :生成修改用的SQL语句注解。
@DeleteProvider :生成删除用的SQL语句注解。
type属性:生成SQL语句功能类对象
method属性:指定调用方法