mybatis介绍
持久层框架(其实所有数据库的框架都是持久层框架)
orm框架 → Object relationship mapping 对象关系映射
对象 → javabean
关系 → 关系表
映射 → 一个javabean对象就可以对应一条关系表中的记录
定制Sql:手写sql语句 → 灵活的框架
高级映射:输入映射和输出映射
输入映射:对象 → 关系表 → 为预编译的sql提供参数
输出映射:关系表 → 对象 → 查询结果的封装
动态sql:根据你的参数的不同可以动态的更改执行的sql语句
将sql语句和java代码做一个解耦 → sql集中管理起来 → 映射文件 → 不同模块的sql放到不同的映射文件下。
比如user相关的模块就映射到user对应的映射文件下。
mybatis入门案例一
将sql语句集中管理到映射文件中,然后去调用映射文件中的sql
a. 获得SqlSession
sqlSession和JDBC的Connection很类似,sqlSession其实就是在底层封装了connection。
sqlSession要通过sqlSessionFactory来获取。
sqlSessionFactory又是通过SqlSessionFactoryBuilder创建出来的。
build中传入mybatis.xml的inputStream,来加载mybatis.xml。
获取mybatis.xml的inputStream:Resources.getResourceAsStream(“mybatis.xml”);
b. 获取sqlId
c. sqlsession执行对应sql
d. 映射文件中的sql语句写法
全部代码:
对代码的提取:
(sqlSession不是线程安全的,就得每次使用的时候都去获取一个新的sqlSession)
其他的crud操作:sqlSession来调用对应的sql
1. 查询list
sqlSession.selectList
业务场景:将所有的username都查询出来
小结
使用sqlSession的方法,找到对应要执行的sql语句 → namespace.id
1、做查询一定要写resultType,而增删改不需要也写不了
2、调用sqlSession的方法的两个参数
字符串:namespace.id
object:为sql语句提供参数,决定了sql语句中#{}中的值要怎样写
基本类型、String、包装类:#{}中任意写
javabean或map:#{}中写javabean的成员变量名或map的key
入门案例2
mybatis配置文件相关
入门案例1中只做了 datasource和mappers的配置(必需的配置)→ 青春版(丐版)
一、properties(参数)
给mybatis中的配置项提供参,也就收给mybatis.xml中的某些值提供参数。
db.driver方便区分我们做的事情是什么(数据库相关操作),同时又可以避免我们引用到系统变量。
3. settings(后面讲)
张松 → 松哥
李艮隶 → 小白龙 → 隶哥
张帅 → 帅哥
lanzhao→ 钊哥
有个类 com.cskaoyan.bean.User → user,在resultType 中就可以直接使用别名user
有个类 com.cskaoyan.bean.Order → order
业务:根据id查询user信息
a. 逐个配置
b. 批量配置
c. mybatis也提供了一些别名
基本类型、包装类、java.lang目录下的类
批量配置package(非常重要)
批量配置是和上面的class这种配置是相关
配置的是接口所在的包目录,也就是加载该包目录下的全部接口
mybatis的代码中已经写了输出日志的代码,但是需要一个机会(log4j)输出。
Log4j
mybatis本身支持了log4j,可以直接使用
开始使用
控制台中输出了一些日志
mybatis代码中就是写了这些输出内容的代码,log4j依赖和配置引进的时候, 输出内容的代码就执行到了,就输出出来了
主要看这些内容
日志log4j配置文件的介绍
pattern-layout中的格式
%d:日期信息
%d{ABSOLUTE}:ABSOLUTE代表的是日期的格式
%5p:p日志级别 5代表占用5字符
%c: category类 → 输出日志的代码是属于哪一个类的
%c{1}: 数字代表类输出几个层级,从后先前数的,表示几级目录
%L:输入日志的代码的行号
%m:message 日志中输出的消息
%n: 换行
日志级别
debug → info → warn → error → fatal
由低到高输出的内容量是递减:输出当前级别以及更高级别的内容
debug级别下, info、warn、error、fatal这些级别的内容都会输出。
info级别下,info、warn、error、fatal这些级别的内容会输出。
作业1:执行查询
创建一张用户表和user类
通过sqlSession直接调用api的形式
1、selectOne查询:根据用户名和密码查询对应的user(列名和成员变量名一致)
2、通过insert新增单条用户记录
UserMapper.xml:
<mapper namespace="userMapper">
<select id="selectUserByUsernameAndPassword" resultType="com.cskaoyan.bean.User">
select id, username, password, age, gender from j22_user_t where username = #{username} and password = #{password}
select>
<insert id="insertUser">
insert into j22_user_t (id,username,password,age,gender) value
(#{id},#{username},#{password},#{age},#{gender})
insert>
mapper>
测试类:
package com.cskaoyan;
import com.cskaoyan.bean.User;
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.After;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class MyBatisTest {
static SqlSessionFactory sqlSessionFactory;
SqlSession sqlSession = null;
@BeforeClass
//在单元测试类最开始的时候执行一次
//不需要每次都去初始化sqlSessionFactory
public static void beforeClass() throws IOException {
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
InputStream inputStream = Resources.getResourceAsStream("mybatis.xml");
sqlSessionFactory = builder.build(inputStream);
}
@Before//每一个@Test方法执行之前都会执行的方法
public void init() {
sqlSession = sqlSessionFactory.openSession();
}
@After //每一个@Test方法执行之前都会执行的方法
//手动提交sqlSession
//也可以在新建的时候传入参数true:sqlSession = sqlSessionFactory.openSession(true);
public void commit() {
if (sqlSession != null) {
sqlSession.commit();
sqlSession.close();
}
}
@Test
public void mytest1() {
String sqlId = "userMapper" + "." + "selectUserByUsernameAndPassword";
User user = new User("shihao", "lsh1998");
User u = sqlSession.selectOne(sqlId, user);
}
/**
* insert
*/
@Test
public void mytest2() throws IOException {
User user = new User(4, "shuaige", "shuai", 20, "male");
int insert = sqlSession.insert("userMapper.insertUser", user);
System.out.println("insert = " + insert);
}
}
作业2: 使用delete删除数据
使用或者在下配置这种配置;
定义一个接口,并在接口中定义一个delete方法,能够根据id删除一条数据库中的数据;
并且测试你写的代码