- 框架概述
- Mybatis框架
- 1.概述:
- 2.入门使用:
- 3.认识实战:(通过mybatis对数据库进行增删改查)
- (1).环境搭建:
- (2).使用步骤:(readme.txt文件)
- (3).项目结构:
- (4).源码展示:
- 4.Mybatis框架的相关类解释:
- (1).Resources类:
- (2).SqlSessionFactoryBuilder类:
- (3).SqlSessionFactory接口:
- (4).SqlSession接口:
- 5.※mybatis的动态代理:
- (1).封装获取SqlSession的工具类:
- (2).※Mybatis的动态代理:
- 6.传入参数和输出结果
- (1).传入参数
- a.``parameterType``标签
- b.多参传值的四种方法:
- c.占位符:#与$:
- (2).封装输出结果三种方式:
- (3).模糊查询:
- a.在java代码中指定like的内容(预编译):
- b.在mapper文件中拼接like的内容(字符串拼接):
- 7.动态SQL:
- (1).if标签:
- (2).where标签:
- (3).foreach标签:
- (4).补充:sql标签:
- 8.mybais的补充:
- (1).可设置量:
1.1.框架的特点:
①框架是一个软件;
②框架是不完整的,也是不全能的;
③.框架针对某一个领域有效且擅长。
1.2.框架的三层架构:
Ⅰ.【界面层】:接收参数信息,显示处理结果等(jsp,servlet,html…)
界面层对应着项目中的controller包。
Ⅱ.【业务逻辑层】:接收界面层数据,调用数据库,获取数据
业务逻辑层对应着项目中的service包。
Ⅲ.【数据访问层】:访问数据库,执行 增删改查 操作(持久层)
数据访问层对应着项目中的dao包。
三层架构彼此的交互:
源码位置:
mybatis源码是开源的,在github上。
概念:
【mybatis】全称MyBatis SQL Mapper framework for Java
意为SQL映射框架。
【映射】:将一行数据映射成一个java对象
【DAOs】:全称Data Access Object,负责数据访问,增删改查。
功能:
(1).创建Connection,Statement,ResultSet。
(2).执行sql语句。
(3).循环sql,将sql结果转换为java对象,封装到list集合中。
(4).关闭资源。
开发人员使用过程:
提供sql语句—>mybatis处理sql—>拿到结果集或java对象。
访问网址:https://github.com/mybatis/mybatis-3/releases下载相关资源。
3.认识实战:(通过mybatis对数据库进行增删改查) (1).环境搭建:
Ⅰ.创建一个空工程,添加新的模块,模块使用Maven中的quickstart模板进行创建。
Ⅱ.补充Maven的项目结构,使其结构完整。
src & pom.xml
main test
[java resources] [java resources]
Ⅲ.整理pom.xml文件,删除不必要的插件,添加必要的依赖,比如mysql,mybatis依赖。
(2).使用步骤:(readme.txt文件)Ⅰ.新建数据库student,数据库中建立一张表student。
Ⅱ.创建实体类Student,书写必要的属性和方法。(domain包下)
Ⅲ.创建持久层的StudentDao接口,定义操作数据库的方法。(dao包下)
Ⅳ.创建一个mybatis使用的配置文件(sql映射文件):
· 文件格式应为xml文件。
· 用于写sql语句,一张表对应一个sql映射文件。
· 写在接口所在目录中,命名应与接口保持一致。
Ⅴ.创建mybatis的主配置文件:
· 用于连接数据库。
· 指定mapper文件的位置。
· 一个项目对应一个主配置文件。
· 主配置文件提供给数据库连接信息以及sql映射文件的位置信息。
· 写在src/main/resources下。
Ⅵ.使用mybatis访问数据库进行操作即可。
(3).项目结构: (4).源码展示:
数据库student数据:
配置核心文件pom.xml:
4.0.0 com.shawn ch01-hello-mybatis 1.0-SNAPSHOT jar UTF-8 1.7 1.7 junit junit 4.11 test org.mybatis mybatis 3.5.1 mysql mysql-connector-java 5.1.9 src/main/java ***.xml false src/main/resources ***.xml false
实体类Student:
public class Student{
private Integer id;
private String name;
private String email;
private Integer age;
//构造方法省略
//set/get方法省略
//toString方法重写省略
}
数据库操作接口StudentDao:
package com.shawn.dao;
import com.shawn.domain.Student;
import java.util.List;
public interface StudentDao {
//接口操作Student表
public List selectStudents();
//插入操作
public int insertStudent(Student student);
//删除操作
public int deleteStudent(Student student);
//修改操作
public int updateStudent(Student student);
}
sql映射文件(StudentDao.xml):
mybatis主配置文件(mybatis.xml)
查询数据测试方法:
package com.shawn;
import com.shawn.domain.Student;
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 org.junit.Test;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
public class selectStdents {
@Test
public static void main(String[] args) throws IOException {
//访问mybatis读取student数据
//1.定义mybatis主配置文件的名称,从类路径的跟开始target/classes
String config = "mybatis.xml";
//2.读取这个config表示的文件
InputStream in = Resources.getResourceAsStream(config);
//3.创建了SqlSessionFactoryBuilder对象
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
//4.创建SqlSessionFactory对象
SqlSessionFactory factory = builder.build(in);
//5.获取SqlSession对象,从SqlSessionFactory获取SqlSession
SqlSession sqlSession = factory.openSession();
//6.指定要执行的sql语句的标识 sql映射文件中的namespace+"."+标签的id值
String sqlId = "com.shawn.dao.StudentDao.selectStudents";
//7.执行sql语句,通过sqlId找到语句
List studentList = sqlSession.selectList(sqlId);
//8.输出结果
for (Student stu:studentList){
System.out.println("查询到学生:"+stu);
}
sqlSession.close();
}
}
插入操作测试方法:
package com.shawn;
import com.shawn.domain.Student;
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 org.junit.Test;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
public class TestInsert {
@Test
public static void main(String[] args) throws IOException {
//访问mybatis读取student数据
//1.定义mybatis主配置文件的名称,从类路径的跟开始target/classes
String config = "mybatis.xml";
//2.读取这个config表示的文件
InputStream in = Resources.getResourceAsStream(config);
//3.创建了SqlSessionFactoryBuilder对象
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
//4.创建SqlSessionFactory对象
SqlSessionFactory factory = builder.build(in);
//5.获取SqlSession对象,从SqlSessionFactory获取SqlSession
SqlSession sqlSession = factory.openSession();
//6.指定要执行的sql语句的标识 sql映射文件中的namespace+"."+标签的id值
String sqlId = "com.shawn.dao.StudentDao.insertStudent";
//7.执行sql语句,通过sqlId找到语句
Student student = new Student(1003,"zhangfei","zhangfei@163.com",20);
int flag = sqlSession.insert(sqlId,student);
//8.输出结果
System.out.println(flag);
//提交事务
sqlSession.commit();
sqlSession.close();
}
}
删除操作测试方法:
package com.shawn;
import com.shawn.domain.Student;
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 org.junit.Test;
import java.io.IOException;
import java.io.InputStream;
public class TestDelete {
@Test
public static void main(String[] args) throws IOException {
//访问mybatis读取student数据
//1.定义mybatis主配置文件的名称,从类路径的跟开始target/classes
String config = "mybatis.xml";
//2.读取这个config表示的文件
InputStream in = Resources.getResourceAsStream(config);
//3.创建了SqlSessionFactoryBuilder对象
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
//4.创建SqlSessionFactory对象
SqlSessionFactory factory = builder.build(in);
//5.获取SqlSession对象,从SqlSessionFactory获取SqlSession
SqlSession sqlSession = factory.openSession();
//6.指定要执行的sql语句的标识 sql映射文件中的namespace+"."+标签的id值
String sqlId = "com.shawn.dao.StudentDao.deleteStudent";
//7.执行sql语句,通过sqlId找到语句
Student student = new Student(1003,"张飞","zhangfei@163.com",20);
int flag = sqlSession.delete(sqlId,student);
//8.输出结果
System.out.println(flag);
//提交事务
sqlSession.commit();
sqlSession.close();
}
}
修改操作测试方法:
package com.shawn;
import com.shawn.domain.Student;
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 org.junit.Test;
import java.io.IOException;
import java.io.InputStream;
public class TestUpdate {
@Test
public static void main(String[] args) throws IOException {
//访问mybatis读取student数据
//1.定义mybatis主配置文件的名称,从类路径的跟开始target/classes
String config = "mybatis.xml";
//2.读取这个config表示的文件
InputStream in = Resources.getResourceAsStream(config);
//3.创建了SqlSessionFactoryBuilder对象
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
//4.创建SqlSessionFactory对象
SqlSessionFactory factory = builder.build(in);
//5.获取SqlSession对象,从SqlSessionFactory获取SqlSession
SqlSession sqlSession = factory.openSession();
//6.指定要执行的sql语句的标识 sql映射文件中的namespace+"."+标签的id值
String sqlId = "com.shawn.dao.StudentDao.updateStudent";
//7.执行sql语句,通过sqlId找到语句
Student student = new Student(1003,"James","zhangfei@163.com",20);
int flag = sqlSession.insert(sqlId,student);
//8.输出结果
System.out.println(flag);
//提交事务
sqlSession.commit();
sqlSession.close();
}
}
4.Mybatis框架的相关类解释:
(1).Resources类:
作用:
用于读取主配置文件 mybatis.xml。
用法实例:
Tips:从类路径的跟开始target/classes。
//以流的方式获取主配置文件
InputStream in = Resources.getResourceAsStream("mybatis.xml");
(2).SqlSessionFactoryBuilder类:
作用:
通过其引用获取到SqlSessionFactory接口。
用法实例:
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder(); SqlSessionFactory factory = builder.build(in);(3).SqlSessionFactory接口:
简介:
①是一个接口,其实现类是DefaultSqlSessionFactory。
②该接口是重量级接口,在项目中仅需要一个。
作用:
获取SqlSession对象。
用法示例:
SqlSession sqlSession = factory.openSession(); //带上布尔类型参数为“是否自动提交事务”。 SqlSession sqlSession = factory.openSession(boolean var1);(4).SqlSession接口:
简介:
①该接口中定义了操作数据库的方法。
②该接口的实现类是DefaultSqlSession。
③非线程安全,故需手动获取(openSession())与手动关闭(close())。
①创建一个util包存储工具类。
②创建一个类(MybatisUtil)作为获取SqlSession的工具类。
③封装工具类:
源码展示:
public class MybatisUtil {
private static SqlSessionFactory factory = null;
static{
//定义主配置文件的文件名
String config = "mybatis.xml";
InputStream in = null;
try {
in = Resources.getResourceAsStream(config);
} catch (IOException e) {
e.printStackTrace();
}
factory = new SqlSessionFactoryBuilder().build(in);
}
//该方法可直接获取到操作数据库的SqlSession
public static SqlSession getSqlSession(){
SqlSession sqlSession = null;
if (factory != null){
sqlSession = factory.openSession();
}
return sqlSession;
}
}
(2).※Mybatis的动态代理:
简介:
mybatis根据dao接口,创建处一个dao接口的实现类,并创建其对象,完成SqlSession调用方法,从而访问数据库。
使用步骤:
以上例作为模板:
//通过工具类获取SqlSession: SqlSession sqlSession = MybatisUtil.getSqlSession(); //利用反射拿到sql映射文件 StudentDao dao = sqlSession.getMapper(StudentDao.class); //通过拿到的dao对象调用操作数据库方法即可 ...6.传入参数和输出结果 (1).传入参数
a.parameterType标签
①parameterType:Dao接口中方法的参数类型
②其值为java数据类型的全限定名称或者是mybatis定义的别名。
③parameterType不是强制存在的,mybatis通过反射机制能够发现接口参数的类型。
实例:通过id值查询学生:
步骤一:Dao接口添加方法(StudentDao下):
//通过id值查询学生 public Student selectStudentById(Integer id);
步骤二:Sql映射文件下添加语句(StudentDao.xml下):
步骤三:添加测试方法:
public void TestSelectStudentById(){
//核心代码块(后续例子中直接引用该通用代码)
SqlSession sqlSession = MybatisUtil.getSqlSession();
StudentDao dao = sqlSession.getMapper(StudentDao.class);
//核心代码块
Student student = dao.selectStudentById(1001);
(处理结果集)
}
b.多参传值的四种方法:
①利用@param(自定义参数名称)
实例:通过姓名和年龄查找学生
第一步:接口中添加方法(StudentDao中)
public ListselectMultiParam(@Param("myname") String name, @Param("myage") Integer age);
第二步:mapper映射文件中添加语句:
第三步:书写测试方法:
public void TestSelectMultiParam(){
(核心代码部分省略)
List students = dao.selectMultiParam("zhangsan",20);
(处理结果集)
}
②利用java对象作为参数
实例:自定义一个对象作为参数查询学生
第一步:创建一个类QueryParam
public class QueryParam{
private String paramName;
private Integer paramAge;
(set get方法省略)
}
第二步:添加方法StudentDao中:
ListselectMultiObject(QueryParam qp);
第三步:补充映射文件:
第四步:书写测试程序:
public void TestSelectMultiObject(){
(核心代码省略)
QueryParam qp = new QueryParam();
qp.setParamName("zhangsan");
qp.setParamAge(20);
List students = dao.selectMultiObject(qp);
(处理结果集)
}
③通过位置传值
mybatis 3.4之前:#{0},#{1}
mybatis 3.4之后:#{arg0},#{arg1}
ListselectMultiPosition(String name,Integer age);
④通过Map传值:
ListselectMultiByMap(Map map);
Mapc.占位符:#与$:map = new TreeMap <>(); map.put("myname","lisi"); map.put("age",20); List students = dao.selectMultiByMap(map);
①#{...}形式:
执行的sql语句参数位置使用“?”替代,表明其底层调jdbc的preparedStatement操作对象,使用预编译,有效防止SQL注入现象。
②${...}形式:
执行的sql语句参数位置已被赋值,表明其底层调jdbc的Statement操作对象,使用字符串拼接,有可能发生SQL注入。
$可用于替换列名或者表名。(排序,换表查询等等)
(2).封装输出结果三种方式:①resultType结果对象类型,sql语句执行后,数据转换为java对象(任意的)。
Tips:
mybatis执行完sql语句,调用类的无参构造,创建对象。
mybatis将resultSet指定列值赋值给同名属性。
第一步:创建一个ViewStudent类(vo包下):
public class ViewStudent{
private Integer id;
private String name;
(set get方法省略)
}
第二步:在dao接口中添加方法:
ViewStudent selectStudentReturnViewStudent(@Param("sid") Integer id);
第三步:配置Sql映射文件
第四步:书写测试类
(核心代码省略) ViewStudent student = dao.selectStudentReturnViewStudent(1001); (处理结果集省略)
②返回简单类int…
实例:计数数据库有多少学生
第一步:在dao接口中添加方法
int countStudent();
第二步:补充映射文件:
第三步:测试文件
int count = dao.countStudent();
③返回一个Map
列名是map的key部分
列值是map的value部分
实例:通过id值查找学生
第一步:dao接口中创建方法
Map
第二步:补充映射文件
第三步:测试文件:
Map
④结果映射:
使用条件:
自定义列值赋值对应关系 或者 当列名和属性名不一样时。
实例:查询所有学生信息
第一步:dao接口中添加方法
ListselectAllStudents();
第二步:补充映射文件:
(3).模糊查询:
a.在java代码中指定like的内容(预编译):
实例:查询名字中有“is”的学生信息
ListselectLikeOne(String name);
b.在mapper文件中拼接like的内容(字符串拼接):
实例:查询名字在有“is”的学生信息
List7.动态SQL:selectLikeTwo(String name);
动态sql,即sql的内容是变化的,可根据不同条件获取不同sql语句。
(1).if标签:语法:
(部分sql语句)
实例:使用java对象作为参数,查询名字和年龄符合规定的学生信息。
ListselectStudentIf(Student student);
(2).where标签:
实例同上:
ListselectStudentWhere(Student student);
(3).foreach标签:
主要用于sql的in语句。
实例:通过一存储学号的数组或集合查找多个学生信息。
//foreach用法1:(存储整型)
List selectForeachOne(List idList);
二:存储对象:
//foreach用法2:(存储对象)
List selectForeachTwo(List stuList);
(4).补充:sql标签:
代码片段的复用:
语法规则:
定义复用语句:
(sql语句,表名,字段)
调用复用语句:
8.mybais的补充: (1).可设置量:
①日志设置:
②环境设置:
③指定多个mapper:
④属性配置文件:
可利用属性配置文件存储数据库连接信息,和主配置文件(mybatis.xml)分离,以便于修改多个数据库信息。
使用步骤:
a.在``resources目录中定义一个xxx.propertis。
b.补充properties文件,尽量key与value做多级目录。
c.主配置文件指定properties位置:



