学习视频链接
学习文档链接
官方文档链接
表述层 servlet
业务逻辑层 javabean
数据持久层 JDBC
大量时间用于搭建项目。开发效率比较低。其实对于开发人员来说,重要的是业务,更应该关注业务。
连接数据库时四个关键参数的使用有硬编码。即用户名、密码、数据库地址、数据库驱动被写死,怎么解决?使用xml文件配置
statement使用中存在硬编码。
频繁的建立和关闭连接。(数据源、连接池)
传统框架的不足,使得Mybatis框架应运而生。
MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。
MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生类型、接口和 Java 的 POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。
在框架里面写代码不多,但需要大量配置。
MyBatis 是一个优秀的ORM框架。
ORM:Object Relationship Mapping(对象关系映射)
将对象通过一定的方式插入数据库。
Mybatis不需要开发人员更多的关注数据库的连接和关闭以继statement对象的创建,着重关注SQL语句。
即:关注映射,输入参数和输出参数。
Mybatis更像一个黑匣子。
org.mybatis
mybatis
x.x.x
配置核心配置文件(xml)
注意:此处配置的并不是pom.xml文件哈~此处取名为MybatisDemo.xml
XML 配置文件中包含了对 MyBatis 系统的核心设置,包含获取数据库连接实例的数据源(DataSource)和决定事务作用域和控制方式的事务管理器(TransactionManager)。
environment 元素体中包含了事务管理和连接池的配置。mappers 元素则是包含一组映射器(mapper),这些映射器的 XML 映射文件包含了 SQL 代码和映射定义信息。
传统的JDBC需要频繁建立和释放连接。使用连接池后,java向连接池申请连接,用完后归还至连接池即可。
连接池:
4.0.0
com.mybatis
MybatisDemo
1.0-SNAPSHOT
1.8
1.8
src/main/resources
**/*.xml
org.mybatis
mybatis
3.3.0
mysql
mysql-connector-java
8.0.17
package entity;
public class Data {
private int id;
private String name;
private int age;
public void setId(int id) {
this.id = id;
}
public void setName(String name) {
this.name = name;
}
public void setAge(int age) {
this.age = age;
}
public int getId() {
return id;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
}
import entity.Data;
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.InputStream;
public class Test {
public static void main(String[] args) throws Exception{
//加载配置文件为流
InputStream is=Resources.getResourceAsStream("MybatisDemo.xml");
//创建SqlSessionFactory工厂
SqlSessionFactory ssf=new SqlSessionFactoryBuilder().build(is);
//核心接口(发送SQL语句)
SqlSession session=ssf.openSession();
Data data=session.selectOne("com.selectData",2);
System.out.println("ID:"+data.getId()+"\n"+"姓名:"+data.getName()+"\n"+"年龄:"+data.getAge());
//释放资源
session.close();
}
}
至此,一个简单的Mybatis的入门项目就已经完成了。
类型别名(typeAliases)
类型处理器(typeHandlers)
无论是 MyBatis 在预处理语句(PreparedStatement)中设置一个参数时,还是从结果集中取出一个值时, 都会用类型处理器将获取的值以合适的方式转换成 Java 类型。下表描述了一些默认的类型处理器。
对象工厂(objectFactory)
MyBatis 每次创建结果对象的新实例时,它都会使用一个对象工厂(ObjectFactory)实例来完成。 默认的对象工厂需要做的仅仅是实例化目标类,要么通过默认构造方法,要么在参数映射存在的时候通过参数构造方法来实例化。 如果想覆盖对象工厂的默认行为,则可以通过创建自己的对象工厂来实现。
ObjectFactory 接口很简单,它包含两个创建用的方法,一个是处理默认构造方法的,另外一个是处理带参数的构造方法的。 最后,setProperties 方法可以被用来配置 ObjectFactory,在初始化你的 ObjectFactory 实例后, objectFactory 元素体中定义的属性会被传递给 setProperties 方法。
插件(plugins)
MyBatis 允许你在已映射语句执行过程中的某一点进行拦截调用。
环境配置(environments)
MyBatis 可以配置成适应多种环境,这种机制有助于将 SQL 映射应用于多种数据库之中, 现实情况下有多种理由需要这么做。例如,开发、测试和生产环境需要有不同的配置;或者想在具有相同 Schema 的多个生产数据库中 使用相同的 SQL 映射。有许多类似的使用场景。
不过要记住:尽管可以配置多个环境,但每个 SqlSessionFactory 实例只能选择一种环境。
事务管理器:
JDBC:和JDBC使用同样的提交和回滚策略
MANAGED:依赖于应用服务器上下文(context)的配置(必须在服务器上运行)
数据源
UNPOOLED:请求时连接,完毕时关闭
POOLED:连接池
JNDI:依赖于应用服务器,即在上下文配置数据源,然后再java获取上下文的引用从而获取数据源
既然 MyBatis 的行为已经由上述元素配置完了,我们现在就要定义 SQL 映射语句了。 但是首先我们需要告诉 MyBatis 到哪里去找到这些语句。 Java 在自动查找这方面没有提供一个很好的方法,所以最佳的方式是告诉 MyBatis 到哪里去找映射文件。 你可以使用相对于类路径的资源引用, 或完全限定资源定位符(包括 file:/// 的 URL),或类名和包名等。
id:唯一标识
#{}: 代表占位符
parameterType:输入参数类型(输入参数的映射)(可省略)
输入参数的映射:
简单类型:int,string 可以随意写
对象类型:#{}值为属性名称
map:#{}值为key值
包装类:属性导航
resultType:结果类型 (输出结果的映射)(可省略)
简单类型:int,string 可以随意写
对象类型:字段与属性之间一一对应
注意:字段名称,即结果集中的名字和属性名称必须一致
resultMap:写外部resultMap的id
映射文件----DataMapper.xml
Test.java
ata data=session.selectOne("com.selectData",2);
System.out.println("ID:"+data.getId()+"\n"+"姓名:"+data.getName()+"\n"+"年龄:"+data.getAge());
映射文件----DataMapper.xml
Test.java
//查询所有
List list = session.selectList("com.selectAll");
for(int i = 0; i < list.size(); i++){
System.out.println(list.get(i).toString());
}
注意:一定要在Data.java中重写toString方法!!!
@Override
public String toString() {
return "Data{" +
"id=" + id +
", name='" + name + '\'' +
", age=" + age +
'}';
}
运行结果:
映射文件----DataMapper.xml
Test.java
//模糊查询
List list1 = session.selectList("com.selectLike","t");
System.out.println(list1);
模糊查询:有SQL注入的风险
//分页查询
Map map=new HashMap<>();
map.put("start",0);
map.put("length",2);
List list2 = session.selectList("com.selectPage",map);
System.out.println(list2);
//分页查询
RowBounds bunds=new RowBounds(0,1);
List list3= session.selectList("com.selectPage1",null,bunds);
System.out.println(list3);
insert into yangtingting(name,age) values(#{name},#{age})
Test.java
Data data1 = new Data("杨婷婷",24);
int rows=session.insert("com.insertData", data1);
session.commit();
System.out.println(rows);
注意:应该在Data.java中增加构造方法
public Data(String name, int age) {
this.name = name;
this.age = age;
}
注意事项
insert into yangtingting(name,age) values(#{name},#{age})
Data data1 = new Data("杨婷婷",24);
int rows=session.insert("com.insertData", data1);
session.commit();
System.out.println(rows);
System.out.println(data1.getId());
delete from Author where id = #{id}
update Author set
username = #{username},
password = #{password},
email = #{email},
bio = #{bio}
where id = #{id}
Data data1 = new Data();
data1.setId(2);
data1.setAge(24);
data1.setName("tyyyy");
session.insert("com.updateData", data1);
session.commit();
session.close();