MyBatis框架
1.ORM框架介绍
1.1 什么是ORM?
对象关系映射(Object Relational Mapping,简称ORM),对象关系映射即数据库数据与对象的关系的映射
ORM阐述
[图片上传失败...(image-bb9e03-1565855698548)]
1.2 ORM框架有哪些?
Hibernate : 全自动的ORM框架,不用书写SQL语句,就可以对数据库进行增删改查. 跨平台 .Hibernate的代码可以适用于多种数据库.但是,配置比较复杂,第二点查询效率相对而言较低,且不灵活.
Mybatis : 半自动的ORM框架,需要书写SQL语句,就可以对数据库进行增删查改.
Spring Data : 类似于Hibernate,更多基于注解.
1.3 mybatis相对而言的优势以及不足?
优势: 轻便,依赖的jar很少,数据库操作灵活,程序员可操作空间相对较大.
不足 : 基本查询还需手写,开发效率较低
2.MyBatis概述
2.1 官网:https://blog.mybatis.org/
2.2 中文官网:http://www.mybatis.org/mybatis-3/zh/index.html
mybatis起源:
ibatis是mybatis早期的名字,在spring 3.0之前还可以使用,spring 3.0 之后不再支持ibatis,是apach早期的一个开源项目,后更名mybatis,是一个Java持久层的框架,持久化:将数据进行永久化的保存,一般指保存数据到文件中
3.MyBatis入门配置
3.1 Mybtias入门
3.1.1 导入相关jar包
mybatis-3.5.2.jar mybatis核心jar包
mysql-connector-java-5.1.47.jar 数据库连接驱动包
3.1.2 mybatis核心配置文件
3.1.3 mybatis数据库映射文件
映射配置文件
相关实体类
package com.sxt.bean;
public class User {
private int id;
private String name;
private String sex;
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 String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
@Override
public String toString() {
return "User [id=" + id + ", name=" + name + ", sex=" + sex + "]";
}
}
3.1.4 加载配置文件,创建数据库操作对象
package com.sxt.test;
import java.util.List;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import com.sxt.bean.User;
public class Test {
public static void main(String[] args) throws Exception {
String resource = "mybatis-config.xml";
//创建一个SqlSessionFactory构造对象
SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
//sqlSession工厂
SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(Test.class.getClassLoader().getResourceAsStream(resource));
//数据库SQL会话对象
SqlSession sqlSession = sqlSessionFactory.openSession();
//增删查改
System.out.println(sqlSession);
// sqlSession 在使用时,必须传一个sql语句,传SQL语句的唯一标识
List users = sqlSession.selectList("com.sxt.bean.User111111.selectList");
for (User user : users) {
System.out.println(user);
}
//关闭session
sqlSession.close();
}
}
4.MyBatis基本CRUD(增删查改)
方式一
4.1 SqlSession工具类
package com.sxt.util;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
/**
* 创建 SqlSession
* @author mrt
*
*/
public class MybatisUtil {
static SqlSessionFactory sqlSessionFactory = null;
static {
String source = "mybatis.cfg.xml";
//创建 SqlSessionFactory
SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
sqlSessionFactory = sqlSessionFactoryBuilder.build(MybatisUtil.class.getClassLoader().getResourceAsStream(source));
}
/**
* 获取SqlSession 对象
* @return
*/
public static SqlSession getSession() {
return sqlSessionFactory.openSession();
}
}
4.2 核心配置文件
4.3 数据库映射文件
insert into user value(0,#{name},#{sex})
delete from user where id = #{id}
update user set name = #{name},sex = #{sex} where id = #{id}
4.4 dao层
package com.sxt.dao;
import java.util.List;
import org.apache.ibatis.session.SqlSession;
import com.sxt.bean.User;
import com.sxt.util.MybatisUtil;
public class UserDao {
public User selectUser(int id) {
SqlSession session = MybatisUtil.getSession();
User u = session.selectOne("com.sxt.bean.User.selectUser", id);
session.close();
return u;
}
public List selectList() {
SqlSession session = MybatisUtil.getSession();
List users = session.selectList("com.sxt.bean.User.selectList");
session.close();
return users;
}
/**
* 新增用户
* @param u
*/
public void insertUser(User u) {
SqlSession session = MybatisUtil.getSession();
session.insert("com.sxt.bean.User.insertUser", u);
session.commit();
session.close();
}
public void deleteUser(int id) {
SqlSession session = MybatisUtil.getSession();
session.delete("com.sxt.bean.User.deleteUser", id);
session.commit();
session.close();
}
public void updateUser(User u) {
SqlSession session = MybatisUtil.getSession();
session.update("com.sxt.bean.User.updateUser",u);
session.commit();
session.close();
}
}
4.5 log4j.properties
# Global logging configuration
log4j.rootLogger=DEBUG, stdout
# MyBatis logging configuration...
log4j.logger.org.mybatis.example.BlogMapper=TRACE
# 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
注意:
1.在mybatis中,涉及到数据库更新操作,需要手动提交
2.namespace+id产生的字符串必须唯一
方式二:
注意点:
1.maper.xml文件中namespace的值,必须与接口的全路径一致
2.mapper.xml文件中,sql标签的id值,必须与接口的方法名一致
接口代码:
package com.sxt.dao;
import java.util.List;
import com.sxt.bean.User;
public interface IUserDao {
/**
* 根据ID 查询用户
* @param id
* @return
*/
public User selectUser(int id);
/**
* 查询所有
* @return
*/
public List selectList();
/**
* 新增用户
* @param u
*/
public void insertUser(User u);
/**
* 删除用户
* @param id
*/
public void deleteUser(int id);
/**
* 修改用户
* @param u
*/
public void updateUser(User u);
}
mapper.xml文件
insert into user value(0,#{name},#{sex})
delete from user where id = #{id}
update user set name = #{name},sex = #{sex} where id = #{id}
核心配置文件
测试类
package com.sxt.test;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import com.sxt.bean.User;
import com.sxt.dao.IUserDao;
public class Test {
public static void main(String[] args) {
String source = "mybatis.cfg.xml";
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
SqlSessionFactory sessionFactory = builder.build(Test.class.getClassLoader().getResourceAsStream(source));
//获取SqlSession
SqlSession session = sessionFactory.openSession();
// 使用Mapper 接口的形式
/**
* 使用接口的形式,和代理,使用mybatis操作数据库时:
* 1. maper.xml文件中的namespace值,必须与操作数据库数据的dao层接口名称全路径一致
* 2. 接口的中抽象方法名称必须与mapper.xml文件 sql语句标签的id值一致
*/
IUserDao userDao = session.getMapper(IUserDao.class);
User user = userDao.selectUser(2);
System.out.println(user);
User u = new User();
u.setName("Lucy");
u.setSex("女");
userDao.insertUser(u);
session.commit();
session.close();
}
}
5.核心配置文件
mybatis.cfg.xml
6.Mapper.xml配置文件
6.1 mapper.xml的基础配置
insert into user value (0,#{name},#{sex})
6.2 占位符 # 与 $
在Mybatis中,可以使用是字符串拼接
#号则使用PreparedStatement进行了SQL预编译,可以更好的防止SQL注入攻击
7.模糊查询
7.1重点:方式一: concat 字符串拼接函数
concat(str1,str2,str3,....) : 将多个字符串进行拼接
concat("%",关键字,"%")
7.2(知道):方式二: $符字符串拼接
7.3(掌握): 方式三:bind
8.原生分页查询
当存在多个基本类型的参数时,在sql中获取值,无法直接根据参数名称获取值.
8.1 关于参数的值的获取
8.1.1 方式一: @Param("别名")
在sql语句中,可以通过 #{别名}获取值
public List page(@Param("page")int page,@Param("limit")int limit);
8.1.2 方式二:arg0-------argn
8.1.3 方式三: param1----paramn
分页方式二:RowBounds(offset,limit)
RowBounds rowBounds = new RowBounds((3-1)*2, 2);
user = userDao.page2(rowBounds);
9.分页插件
9.1分页插件:pageHelper
PageHelper使用步骤:
1.下载相关jar : pagehelper-x.x.x.jar 和 jsqlparser-0.9.5.jar,导入项目中
2.心配置文件中,配置
3.在要进行分页查询的sql语句执行前,开启分页:
Page
10.属性名和字段名不一致
10.1方案一:
使用as 别名
10.2方案二: resultMap
11.SQL片段
在mybatis中,会出现部分sql内容重复出现,此时可以使用sql标签,将这部分抽离出来,然后在具体的sql标签中,使用includ 包裹,这样组装成新的sql语句
id,name,sex
作业: 单表增删查改,分页(PageHelper)(代理的形式)
12.DTD文件配置
https://blog.csdn.net/a15920804969/article/details/79107852
13.动态SQL
13.1 什么是动态sql?
根据传递的参数不同,产生的sql语句也不同,即根据传递的参数,动态的产生相应的sql语句
13.2 mybatis中对动态sql支持的语法:
13.2.1 if
id as id,
name as name,
age as age,
sex as sex,
phone as phone,
c_id as cId
13.2.2choose(when otherwise)
13.2.3where
当where标签中if语句成立, sql语句 后面会自动添加where ,且会去掉 紧跟的and
13.2.4 set
set标签自动新增set ,且去掉了最后的逗号
13.2.5 foreach
foreach一般用于批量操作.
13.2.6 trim
insert into student
name,
age,
sex,
phone,
c_id,
#{name},
#{age},
#{sex},
#{phone},
#{cId},
14.关联表的处理
多对一
方式一:使用连接查询
方式二: 使用mybatis中resultMap,进行结果封装处理
方式三: 遍历查询
StudentMapper.xml
ClassesMapper.xml
一对多
方式一:根据resultMap将查询结果进行封装处理
注意点: 每个实体类必须要有默认构造方法(无参构造方法)
Student.java
package com.sxt.bean;
import java.io.Serializable;
public class Student implements Serializable {
private static final long serialVersionUID = 1543743204388328403L;
private int id;
private String name;
private int age;
private String phone;
private int cId;
public Student() {}
public Student(int id, String name, int age, String sex, String phone, int cId) {
super();
this.id = id;
this.name = name;
this.age = age;
this.phone = phone;
this.cId = cId;
}
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 int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
public int getcId() {
return cId;
}
public void setcId(int cId) {
this.cId = cId;
}
@Override
public String toString() {
return "Student [id=" + id + ", name=" + name + ", age=" + age + ", phone=" + phone + ", cId=" + cId + "]";
}
}
Classes.java
package com.sxt.bean;
import java.util.List;
/**
* 班级
* @author mrt
*
*/
public class Classes {
private int id;
private String name;
private List students ;
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 List getStudents() {
return students;
}
public void setStudents(List students) {
this.students = students;
}
@Override
public String toString() {
return "Classes [id=" + id + ", name=" + name + ", students=" + students + "]";
}
}
方式二: 遍历查询
ClassMapper.xml
StudentMapper.xml
15.使用注解实现MyBatis
单表增删查改
public interface IUserDao {
@Select("select * from user")
public List selectAll();
@Insert("insert into user value(0,#{name},#{sex})")
public void insert(@Param("name")String name,@Param("sex")String sex);
@Delete("delete from user where id=#{id}")
public void delete(int id);
@Update("update user set name=#{name} ,sex=#{sex} where id=#{id}")
public void update(@Param("id")int id,@Param("name")String name,@Param("sex")String sex);
/**
* 动态sql
* @param map
* @return
*/
@Select("")
public List selectList(Map map);
}
16.缓存
在mybatis中,缓存分为2种,一级缓存和二级缓存.一级是默认开启的缓存, 作用范围是指同一个session.
一级缓存: 默认缓存
在同一个SqlSession, 若在不关闭SqlSession的情况下,此时若执行一样的sql语句,只会执行一次.会执行缓存,这种就是一级缓存.
二级缓存:SqlSessionFactory 使用同一个SqlSessionFactory时,若执行一样的sql,则会走二级缓存.
虽然二级缓存默认是开启的,但是需要配置.
1.在核心配置文件中:
2.在相关mapper文件中
17.MyBatis逆向工程
需要下载:mybatis-generator-core-1.3.2.jar
Generator.java
package com.generator;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import org.mybatis.generator.api.MyBatisGenerator;
import org.mybatis.generator.config.Configuration;
import org.mybatis.generator.config.xml.ConfigurationParser;
import org.mybatis.generator.internal.DefaultShellCallback;
public class Generator {
public static void main(String[] args) throws Exception {
List warnings = new ArrayList();
boolean overwrite = true;
// 指定 逆向工程配置文件
File configFile = new File("config.xml");
ConfigurationParser cp = new ConfigurationParser(warnings);
Configuration config = cp.parseConfiguration(configFile);
DefaultShellCallback callback = new DefaultShellCallback(overwrite);
MyBatisGenerator myBatisGenerator = new MyBatisGenerator(config,callback, warnings);
myBatisGenerator.generate(null);
}
}
config.xml