MyBatis的相关的概念
1、MyBatis是什么?
MyBatis 是一款一流的支持自定义 SQL、存储过程和高级映射的持久化框架。MyBatis 几乎消
除了所有的 JDBC 代码,也基本不需要手工去设置参数和获取检索结果。MyBatis 能够使用简单的
XML 格式或者注解进行来配置,能够映射基本数据元素、Map 接口和 POJOs(普通 java 对象)到
数据库中的记录。
2、持久化框架是什么?
传统的jdbc进行操作,它代码都是套路代码,很多时候有重复的代码,虽然我们可以写工具类简化编码,但是毕竟不方便。所以就开始流行框架。
框架是什么?实际上框架就是一个编码的半成品,它自动的搭建好了我们要进行操作的大部分设置。对于用户来讲,只是去填充必要的设置或者编码。
3、什么是持久化?
就是把对象转成表中的记录;反正把表中的记录转成对象。这样下次的时候我们可以到表中找到记录,反正可以把记录加载到内存的对象中。我们做这样的操作的框架就是所谓的持久化框架。
对象和表有如何的关系?
1)对象 vs 记录
2)属性 vs 字段
3)数据类型 vs 数据库的字段的类型
4、常见的持久化框架有哪些,它们的区别是什么?
1)Hibernate:全自动的对象关系映射(ORM)的框架,操作的时候操作对象,框架自动映射程表中的记录。操作简单,但是配置很有技巧,它表现在性能优化的时候需要深入了解,很不容易掌握。它是一个重量级的ORM框架,非常耗费资源。它不需要写SQL语句,语句由框架自动的生成,你自己看不到语句。非常方便移植,只要改它的方言即可(方言就是指定#数据库的类型的)
2)MyBatis:半自动的ORM框架,通过操作SQL语句来映射表中的记录。它方便时候,但是写SQL需要有基础知识。不方便移植,比如针对mysql数据库和oracle数据库的时候,可能语句需要修改。
3、MyBatis进行操作需要做什么准备工作?
1)核心配置文件:SqlMapConfig.xml
2) 每个表写一个映射配置文件 BookDao.xml和BookTypeDao.xml
3) 核心API进行操作
a、构建工程,导入jar,我们采用Maven工程,所以不必须到jar
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.sina.supermark</groupId>
<artifactId>user</artifactId>
<version>1.0-SNAPSHOT</version>
<name>user</name>
<!-- FIXME change it to the project's website -->
<url>http://www.example.com</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.7</maven.compiler.source>
<maven.compiler.target>1.7</maven.compiler.target>
<mybatis.version>3.2.8</mybatis.version>
</properties>
<dependencies>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>${mybatis.version}</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
<plugins>
<!-- clean lifecycle, see https://maven.apache.org/ref/current/maven-core/lifecycles.html#clean_Lifecycle -->
<plugin>
<artifactId>maven-clean-plugin</artifactId>
<version>3.1.0</version>
</plugin>
<!-- default lifecycle, jar packaging: see https://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_jar_packaging -->
<plugin>
<artifactId>maven-resources-plugin</artifactId>
<version>3.0.2</version>
</plugin>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.0</version>
</plugin>
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.22.1</version>
</plugin>
<plugin>
<artifactId>maven-jar-plugin</artifactId>
<version>3.0.2</version>
</plugin>
<plugin>
<artifactId>maven-install-plugin</artifactId>
<version>2.5.2</version>
</plugin>
<plugin>
<artifactId>maven-deploy-plugin</artifactId>
<version>2.8.2</version>
</plugin>
<!-- site lifecycle, see https://maven.apache.org/ref/current/maven-core/lifecycles.html#site_Lifecycle -->
<plugin>
<artifactId>maven-site-plugin</artifactId>
<version>3.7.1</version>
</plugin>
<plugin>
<artifactId>maven-project-info-reports-plugin</artifactId>
<version>3.0.0</version>
</plugin>
</plugins>
</pluginManagement>
</build>
</project>
4、核心配置文件
<?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>
<properties resource="db.properties"></properties>
<!-- <properties>
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/exam?characterEncoding=utf-8"/>
<property name="username" value="root"/>
<property name="password" value="1234"/>
</properties>-->
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="{driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="com/sina/supermark/mapper/BookMapper.xml"/>
<mapper resource="com/sina/supermark/mapper/BookTypeMapper.xml"></mapper>
</mappers>
</configuration>
5、映射配置文件
<?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" >
<mapper namespace="com.sina.supermark.mapper.BookMapper">
<select id="getBookById" resultType="Book">
SELECT *
FROM book
WHERE bookid=#{bookid}
</select>
</mapper>
6、核心API
1)SqlSessionFactoryBuilder:创建SqlSessionFactory的工场。它是用过就丢失,它最好是写在方法体里面,作为局部变量使用。
//1、创建SqlSessionFactoryBuilder对象
String configFile="mybatis-config.xml";
Reader reader=Resources.getResourceAsReader(configFile);
SqlSessionFactoryBuilder builder=new SqlSessionFactoryBuilder();
2)SqlSessionFactory:是创建SqlSession的工场。改对象一旦创建,会在整个项目运行的时候始终存在。所以我们建议大家只创建1次,单例模式。它是重量级的对象,销毁内存大。
SqlSessionFactory sessionFactory = builder.build(reader);
3)SqlSession:进行crud用改对象进行操作
SqlSession sqlSession = sessionFactory.openSession();
任务:查询bookid为3的Book
package com.sina.supermark;
import com.sina.supermark.entity.Book;
import com.sina.supermark.mapper.BookMapper;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.Configuration;
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.Reader;
/**
* 问题:为什么我们使用SqlSession去调用方法的时候能够完成功能?
* 1)创建SqlSessionFactory的时候读取了mybatis的核心配置文件
* 2)核心配置文件中由mapper节点,它和映射配置文件关联
* 3)映射配置文件的mapper的namespace属性它和接口又进行了关联
* 4)调用的方法和select、update等节点的id属性进行了关联
* 这样我们在使用的时候可以通过反射去构建相关的对象
*/
public class BookTest {
@Test
public void getBookByIdTest() throws Exception{
//1、创建SqlSessionFactoryBuilder对象
String configFile="mybatis-config.xml";
Reader reader=Resources.getResourceAsReader(configFile);
SqlSessionFactoryBuilder builder=new SqlSessionFactoryBuilder();
//2、创建SqlSessionFactory
SqlSessionFactory sessionFactory = builder.build(reader);
//3、创建SqlSession
SqlSession sqlSession = sessionFactory.openSession();
//4、获得BookMapper的实现类,它实际上是BookMapper的代理对象
BookMapper mapper = sqlSession.getMapper(BookMapper.class);
System.out.println("代理对象:"+mapper);
Book book = mapper.getBookById(3);
System.out.println(book.getBookid()+" "+book.getBookname());
//5、关闭对象
sqlSession.close();
}
}
7、工具的编写,解决重复代码的问题
package com.sina.supermark.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.Reader;
public class MyBatisUtil {
private static SqlSessionFactory sqlSessionFactory;
static {
try{
String configFile="mybatis-config.xml";
Reader reader= Resources.getResourceAsReader(configFile);
SqlSessionFactoryBuilder builder=new SqlSessionFactoryBuilder();
//2、创建SqlSessionFactory
sqlSessionFactory = builder.build(reader);
}catch (Exception e){
e.printStackTrace();
}
}
public static SqlSession getSqlSession(){
//true:自动提交事务 false:手工提交事务
return sqlSessionFactory.openSession(false);
}
public static void closeSqlSession(SqlSession sqlSession){
if(null!=sqlSession){
sqlSession.close();
}
}
}
8、添加操作
1、添加数据后,如果要获得添加记录的主键值(前提是自动增长)useGeneratedKeys=“true”,keyProperty=“bookid”
<insert id="addBook" parameterType="Book" keyProperty="bookid" useGeneratedKeys="true">
INSERT
INTO book(bookid, bookname, price, pubtime, author, typeid)
VALUES (null,#{bookname},#{price},now(),#{author},#{typeid})
</insert>
2、编码
@Test
public void addBookTest(){
SqlSession sqlSession = MyBatisUtil.getSqlSession();
Book book=new Book();
book.setAuthor("老王");
book.setBookname("MyBatis实战");
book.setPrice(23d);
book.setTypeid(1);
int result = sqlSession.getMapper(BookMapper.class).addBook(book);
System.out.println(result);
sqlSession.commit();
MyBatisUtil.closeSqlSession(sqlSession);
}
9、传统方式进行操作
@Test
public void addBookTest1(){
SqlSession sqlSession = MyBatisUtil.getSqlSession();
Book book=new Book();
book.setAuthor("老王他爹");
book.setBookname("MyBatis实战-1");
book.setPrice(23d);
book.setTypeid(1);
//第1个参数是:执行的方法全名,第2个参数是:对象
int result = sqlSession.insert("com.sina.supermark.mapper.BookMapper.addBook", book);
System.out.println(result);
sqlSession.commit();
MyBatisUtil.closeSqlSession(sqlSession);
}