【MyBatis|Mybatis基本使用总括(单表/多表/动态sql)】其实就是持久层的数据控制框架
1 基本工具包
(1)导入包的 方式! 准备:jar包,自己找,mybatis的包和mysql的驱动
maven网址:https://mvnrepository.com/artifact/org.mybatis/mybatis/3.5.6,简言之,自己准备包,根据需求选择!
文章图片
(2)maven依赖管理方式(根据需求选择合适包)!
org.mybatis
mybatis
3.5.5
mysql
mysql-connector-java
5.1.48
com.github.pagehelper
pagehelper
5.1.4
com.github.jsqlparser
jsqlparser
1.1
junit
junit
4.12
log4j
log4j
1.2.17
org.slf4j
slf4j-log4j12
1.7.20
2基本文件 (1)mybatis的主配置文件(MyBatis.xml):
(2)数据库配置文件(jdbc.properties)
driver=com.mysql.jdbc.Driver
url=jdbc:mysql:///mybatismussary
username=root
password=root
(3)日志配置文件(log4j.properties)
# 日志格式设置
# Global logging configuration
# ERROR WARN INFO DEBUG
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
3 配置文件的加载方式(作为参考):
package utils;
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 java.io.IOException;
import java.io.InputStream;
/**
*2021.9.19
*/
public class MybatisUtils {
private static SqlSessionFactory build;
static {
try {
InputStream resourceAsStream = Resources.getResourceAsStream("MyBatis.xml");
build = new SqlSessionFactoryBuilder().build(resourceAsStream);
} catch (IOException e) {
e.printStackTrace();
}
}/**
* @param b 传递进来的参数的值,true自动提交事务,默认的不会自动提交事务
*/
public static SqlSession getSqlSession(boolean b) {
return build.openSession(b);
}/**
* 默认的不会自动提交事务
*/
public static SqlSession getSqlSession() {
return build.openSession();
}}
4 使用方法: (1)基于xml的使用的用法1: xml映射文件(注意sql的写法,配置文件中已经做了说明):
SELECT * FROM userSELECT * FROM user WHERE id = #{id}SELECT * FROM user WHERE name = #{name}INSERT INTO user VALUES (#{id},#{name},#{area},#{age})
UPDATE user SET name = #{name},age = #{age} ,area=#{area} WHERE id = #{id}
DELETE FROM user where name=#{name}
(接口省略),在持久层mapper完成这一步,其他层级依次调用即可:
package Mapper;
import bean.User;
import org.apache.ibatis.session.SqlSession;
import utils.MybatisUtils;
import java.util.List;
public class UserMapperImp implements UserMapper {
//开启自动提交事务的方式
SqlSession sqlSession = MybatisUtils.getSqlSession(true);
@Override
public List selectAll() {
//这块指明映射文件中的方法即可
List objects = sqlSession.selectList("mapper.selectAll");
sqlSession.close();
return objects;
}@Override
public User selectOneByCondition(int id) {
User user = sqlSession.selectOne("mapper.selectOneById", id);
sqlSession.close();
return user;
}@Override
public User selectOneByCondition(String name) {
User user = sqlSession.selectOne("mapper.selectOneByName", name);
sqlSession.close();
return user;
}@Override
public void insertUser(User user) {
int insert = sqlSession.insert("mapper.insert", user);
sqlSession.close();
System.out.println(insert);
}@Override
public void deleteUser(User user) {
int delete = sqlSession.delete("mapper.delete", user);
sqlSession.close();
System.out.println(delete);
}
}
(2)基于xml的用法2 xml映射文件(注意sql的写法,配置文件中已经做了说明):
SELECT * FROM peopleSELECT * FROM people WHERE id = #{id}SELECT * FROM people WHERE name = #{name}INSERT INTO people VALUES (#{id},#{name},#{age},#{area},#{hobby},#{grade},#{number})
UPDATE people SET name = #{name},age = #{age} ,area=#{area},hobby=#{hobby},grade=#{grade},number=#{number} WHERE id = #{id}
DELETE FROM people where name=#{name}
select * from people
#{id}
select * from people
id = #{id}
AND name = #{name}
AND age = #{age}
dao层,增删改的sql的执行结果是数字,代表改变几行数据发生改变,但是mybatis将执行的结果转化成Boolean类型了,下面的例子没有进行增删改的结果回收,其实boolean结果类型是可以回收到的,这块了解一下即可!
package mapper;
import bean.People;
import java.util.List;
public interface PeopleMapper {
List selectAll();
People selectOneById(int id);
People selectOneByName(String name);
void insert(People people);
void delete(People people);
void update(People people);
//动态sql
List selectByIds(List list);
List selectByCondition(People people);
}
业务层做如下逻辑处理,持久层只写接口,完成配置文件的映射即可
package service;
import bean.People;
import com.github.pagehelper.PageHelper;
import mapper.PeopleMapper;
import org.apache.ibatis.session.SqlSession;
import utils.MybatisUtils;
import java.util.List;
public class ServiceImp implements PeoplerService {
private SqlSession session;
private PeopleMapper mapper;
public ServiceImp() {
session = MybatisUtils.getSqlSession(true);
mapper = session.getMapper(PeopleMapper.class);
}@Override
public List selectAll(int index,int pageSize ) {
//分页插件必须先做初始化操作
PageHelper.startPage(index,pageSize);
List peoples = mapper.selectAll();
session.close();
return peoples;
}/**
* 动态sql.参数是集合示例:
* @param list
* @return
*/
@Override
public List selectByIds(List list) {
List lists = mapper.selectByIds(list);
session.close();
return lists;
}
/**
* 动态sql.参数是不定向条件:
* @param people
* @return
*/
@Override
public List selectByCondition(People people) {
List list = mapper.selectByCondition(people);
session.close();
return list;
}/************** 下面的未做实现,只作为举例*********************/
@Override
public People selectOneByCondition(int id) {
return null;
}@Override
public People selectOneByCondition(String name) {
return null;
}@Override
public void insertUser(People people) {}
@Override
public void deleteUser(People people) {}
}
补充:
注意:以上xml映射文件是使用的单表的形式,下面举例一对多,一对一,多对多关系,作为写法参考,sql基础还是需要有的:
select
s.id id,s.name name,s.age age,s.grade grade,s.mainteacher mainteacher,s.sex sex,c.id cid,c.name cname
from student s,card c
where s.id=c.sid
select
s.id id,s.name name,s.age age,s.grade grade,s.mainteacher mainteacher,s.sex sex,t.id tid,t.name tname,t.coures coures
from student s,teacher t
where t.name = s.mainteacher
select
s.id id,s.name name,s.age age,s.grade grade,s.mainteacher mainteacher,s.sex sex,c.cid cid,c.cname cname
from student s,mid m,course c
where m.sid=s.id and m.cid=c.cid
mapper文件
package mapper;
import bean.Student;
import bean.Teacher;
import java.util.List;
public interface Mapper {
//one to one
List selectAllStudent();
//one to many
List selectAllTeacher();
List selectAllStudentClasses();
}
(3)纯注解的使用方式:作为参考样例:唯一变只是在映射文件是否使用xml文件 主配置文件:
单表使用示例(主要还是在mapper映射接口上做操作):
说明:通过注解@select@dealte@insertt@update进行标注方法写sql的形式
package mapper;
import bean.Student;
import org.apache.ibatis.annotations.Select;
import java.util.List;
public interface Mappers {
/**
* 简单的单表查询示例示例
* @return
*/
@Select("select * from student")
List selectAll();
/**
* 多表查询,用到看资料就行,太烦!
* @return
*/
@Select("")
List selectAllCard();
}
多表示例(很少用到,用到来查):
一对一:
import org.apache.ibatis.annotations.One;
import org.apache.ibatis.annotations.Result;
import org.apache.ibatis.annotations.Results;
import org.apache.ibatis.annotations.Select;
import java.util.List;
public interface CardMapper {
//查询全部
@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 = "com.itheima.one_to_one.PersonMapper.selectById")
)
})
public abstract List selectAll();
}
public interface PersonMapper {
//根据id查询
@Select("SELECT * FROM person WHERE id=#{id}")
public abstract Person selectById(Integer id);
}
一对多:
import org.apache.ibatis.annotations.Many;
import org.apache.ibatis.annotations.Result;
import org.apache.ibatis.annotations.Results;
import org.apache.ibatis.annotations.Select;
import java.util.List;
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字段来查询student表
/*
many、@Many 一对多查询的固定写法
select属性:指定调用哪个接口中的哪个查询方法
*/many = @Many(select = "com.itheima.one_to_many.StudentMapper.selectByCid")
)
})
public abstract List selectAll();
}
import org.apache.ibatis.annotations.Select;
import java.util.List;
public interface StudentMapper {
//根据cid查询student表
@Select("SELECT * FROM student WHERE cid=#{cid}")
public abstract List selectByCid(Integer cid);
}
多对多:
import org.apache.ibatis.annotations.Many;
import org.apache.ibatis.annotations.Result;
import org.apache.ibatis.annotations.Results;
import org.apache.ibatis.annotations.Select;
import java.util.List;
public interface StudentMapper {
//查询全部
@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",// 根据查询出student表的id来作为关联条件,去查询中间表和课程表
/*
many、@Many 一对多查询的固定写法
select属性:指定调用哪个接口中的哪个查询方法
*/
many = @Many(select = "com.itheima.many_to_many.CourseMapper.selectBySid")
)
})
public abstract List selectAll();
}
import org.apache.ibatis.annotations.Select;
import java.util.List;
public interface CourseMapper {
//根据学生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 selectBySid(Integer id);
}
最后最后一种纯注解用法,用到再说,很烦的那种:在我的资料中有样例,用到再参考
参数获取方式补充:
文章图片
推荐阅读
- mybatis|mybatis中的动态sql语句和多表查询
- sql|MyBatis框架----多表查询与动态sql
- mysql|SQL(面试实战05)
- MySQL|MySQL的JDBC编程及增删改查
- 数据库|MySQL 事务四大特性和事务隔离级别
- mysql|SQL(面试实战03)
- spring+mybatis启动NoClassDefFoundError异常分析三部曲之二(定位错误)
- 算法|工程详细记录(超准确人脸检测(带关键点)YOLO5Face C++)
- JAVA|2022M6学习笔记