MyBatis小结1
1.持久性框架:我们将数据存储在磁盘中的行为,被称为持久化:负责操作数据库的框架
2.mybatis、hibernate、
3.ORM框架:目前流行的持久性框架,都是ORM框架
4.ORM:object Relation Mapper(对象关系映射) 将咋们的java对象和关系型数据库建立映射关系
,本质上就是可以将记录和java对象进行互相转化
5.阻抗不匹配:将表中的记录和对象 模型不匹配行为;ORM主要解决阻抗不匹配的问题
6.完全ORM:使用者可以不用写sql语句,只要操作对象,就可以将对象持久化。例如:hibernate
7.半ORM框架:SQL自己写,记录和对象的转换工作,框架帮我们做
8.mybatis的配置文件:为mybatis做全局配置
9.mybatis的映射文件:定义sql语句的
- 接口作用:java的接口只是提供了一套对外开放的规范,接口本身并不能直接使用
(接口不能被实例化):功能实现主要靠实现类。在javaEE开发中,接口作用很重要,很多时候起到了
松耦合的作用。当具体的功能有变化时,我们只需要修改或改变实现类即可,对外还是使用原接口,此时使用者和功能的提供方,
都是通过接口对接的。使用者和提供者之间耦合度就会降低。
11.面向接口的编程:自己定义一个接口,让该接口和映射文件结合起来,通过动态代理,
在运行时,根据映射文件,动态的生成接口的实现类,我们对外表面使用的是接口,实际上使用的是动态生成的实现类
配置文件
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<!-- 所有的配置都需要写到该标签内部 -->
<configuration>
<!--环境配置:配置连接数据库的必须设置以及事务管理等等
我们可以配置多个环境,此处的default就是用来指定我们要用
的环境,default的值指定为那个id,就表明使用该环境
-->
<environments default="mysql">
<!--环境: id就是该环境的唯一标识 -->
<environment id="mysql">
<!--事务管理器
JDBC – 这个配置直接使用了 JDBC 的提交和回滚设施,
它依赖从数据源获得的连接来管理事务作用域。
MANAGED – 这个配置几乎没做什么。它从不提交或回滚一个连接,
而是让容器来管理事务的整个生命周期(比如 JEE 应用服务器的上下文)。
-->
<transactionManager type="JDBC"></transactionManager>
<!--数据源:连接数据库的配置
UNPOOLED– 这个数据源的实现会每次请求时打开和关闭连接。
POOLED– 这种数据源的实现利用“池”的概念将 JDBC 连接对象组织起来,
避免了创建新的连接实例时所必需的初始化和认证时间
自定义数据库连接池,type处可以填自己定义的全限定类名
例如要用c3p0数据库连接池
public class C3P0DataSourceFactory extends UnpooledDataSourceFactory {
public C3P0DataSourceFactory() {
this.dataSource = new ComboPooledDataSource();
}
}
<dataSource type="C3P0DataSourceFactory">
-->
<dataSource type="POOLED">
<!--连接数据库需要的配置 -->
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
<!-- 在xml文件中,属性值中的& 就是&符号 -->
<property name="url"
value="jdbc:mysql://localhost:3306/mybatis1?characterEncoding=UTF8&serverTimezone=UTC"/>
</dataSource>
</environment>
<!-- <environment id="oracle"></environment> -->
</environments>
<!--配置映射文件 -->
<mappers>
<mapper resource="com/kang3/mappers/StudentMapper.xml"/ >
</mappers>
</configuration>
</configuration>
mybatis的执行流程
package com.kang;
import java.io.IOException;
import java.io.InputStream;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
public class Test {
public static void main(String[] args) throws IOException {
//1.mybatis的执行流程
//1.加载配置文件
InputStream in = Resources.getResourceAsStream("mybatis-config.xml");
//2.创建工厂构建器对象:作用就是用来创建SqlSessionFactory
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
//3.通过工厂构建器对象加载配置文件 创建工厂对象
//工厂的作用就是用来创建SqkSession对象的
SqlSessionFactory factory = builder.build(in);
//4.通过工厂创建SqlSession对象
SqlSession sqlSession = factory.openSession();
//5.通过SqlSession对象中的api方法操作数据库
Student student = new Student();
student.setAge(20);
student.setName("张三");
student.setSex("男");
/*
* 第一个参数:要执行的sql语句的位置 映射文件的namespace.语句的id
* 第二个参数:sql中需要的数据,如果不需要数据。那么可以省略该形参
*/
// int row = sqlSession.insert("com.yd.student.addStudent", student);
// System.out.println(row);
//执行删除语句
int row=sqlSession.delete("com.yd.student.deletaAll");
System.out.println(row);
//更新的方法
//sqlSession.update(arg0)
//查询的方法
//sqlSession.select(arg0, arg1);
/*
* 在实际开发中,我们很少直接使用sqlSession的API方法操作数据库
* 都是使用面向接口的编程方式,也就是接口 + 映射文件
*
*/
//提交事务
sqlSession.commit();
}
在数据库中创建库并建表
SHOW DATABASES;
CREATE DATABASE mybatis1 CHARSET=utf8 COLLATE utf8_general_ci;
USE mybatis1;
CREATE TABLE student (id INTEGER PRIMARY KEY AUTO_INCREMENT,NAME VARCHAR(20),age INTEGER,sex VARCHAR(5))CHARSET=utf8;
实体类:映射数据库中的表
package com.kang.model;
//实体类:映射数据库中的表
public class Student {
//对应表中的四个字段,一般情况下,最好属性名和字段名保持一致
private Integer id;
private String name;
private Integer age;
private String sex;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
@Override
public String toString() {
return "Student [id=" + id + ", name=" + name + ", age=" + age + ", sex=" + sex + "]";
}
}
映射文件
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!-- 将来我们是通过namespace找到对应的mapper中的sql语句
可以认为namespace就是当前mapper的唯一标识
-->
<mapper namespace="com.yd.student">
<!-- 定义插入语句
id:就是当前语句的唯一标识,通过id找到当前语句
parameterType:参数类型(大部分时候,该属性可以省略)
默认情况下使用的statement是perparedStatement 防止SQL注入
#{对象的属性名}:获取指定对象的属性值 通过getter方法获取的
-->
<insert id="addStudent" parameterType="com.kang.model.Student">
insert into student (name,age,sex) values(#{name},#{age},#{sex})
</insert>
<delete id="deletaAll">
delete from student
</delete>
</mapper>