2.1.why要学习mybatis
jdbc有缺点:
四步走;加载驱动,获取链接,操作数据库(CUD:executeUpdate,R:executeQuery),关闭链接
封装:经常修改的内容放到配置文件中(xml,json,properties,yarn),不经常修改的放到java文件中(注解)
Jdbc:封装;第一步和第二步放到一个方法中,第四步放到一个方法中,整体用try/catch,如果抛异常要事务回滚
万恶的占位符(?);是占位符的位置;以及赋值的时候要注意序号
关联关系:
一对一:老公和老婆;a和b;一个a有一个b,一个b有一个a,这就是a和b:一对一;
一对多或者多对一:(父子)a和b;一个a有多个b,一个b有一个a,这就是a和b:一对多;b和a是多对一;
多对多:(男友和女友);老师和学生;a和b;一个a有多个b,一个b有多个a,这就是a和b:多对多
缓存:当访问量比较大的时候,可以重复使用查询的数据,尽量减少数据库的访问次数;
处处的把数据库里面的记录一一的转换成java对象(查询单条);java对象处处的转换成数据库的记录;(保存)
3.介绍
3.1.介绍
Mybatis:首先它是一个半自动的ORM框架;O(Object),R:(Relation),M(Mapping);Object:(java就是一个面向对象的编程语言),R(Relation)数据库;mysql:其实它是一个面向关系型的数据库;M:Mapping:映射的意思;ORM的口号是:不准在项目中写sql语句;
Mybatis原来是叫Ibatis,是由apache进行维护和开发,后来换到了google code上,后来又挪到了github上;最早的是Mybatis2
官网:https://github.com/mybatis/mybatis-3(gitHub)
在线手册:https://mybatis.org/mybatis-3/zh/index.html
目录介绍
Lib:Mybatis使用到的jar包
LICENSE:许可证
mybatis-3.5.3.jar:核心版本的jar包
mybatis-3.5.3.pdf:帮助文档;(英文)_离线的
4.实战
4.1.准备工作
整个学习Mybatis的过程中,准备两张表;
数据库的名字叫:mybatis
朝代表:
名称 类型 是否为空 注释
Id Int 否 主键(自动递增)
Name Varchar(255) 是 名字
Content Text 是 描述
stYear Int 是 开国时间
edYear Int 是 亡国时间
guoZuo Int 是 国祚
Capital Varchar(255) 是 首都
Status tinyInt 是 状态:0:禁用,1:启用
createTime Datetime 是 创建时间
updateTime dateTime 是 更新时间
pubTime dateTime 是 发布时间
皇上表:
名称 类型 是否为空 注释
Id Int 否 主键(自动递增)
dynastyId Int 是 朝代Id
Name Varchar(255) 是 名字
Content Text 是 描述
miaoHao Varchar(255) 是 庙号
nianHao Varchar(255) 是 年号
Age Int 是 年龄
Status tinyInt 是 状态:0:禁用,1:启用
createTime Datetime 是 创建时间
updateTime dateTime 是 更新时间
pubTime dateTime 是 发布时间
4.1.1.Junit
Java_unit:java unit(单元)
Main方法:
频繁的注释掉不需要测试的方法
Junit:
引入jar包;hamcrest-core-1.3.jar,junit-4.12.jar
操作示意图:
示例代码:
package com.jinghangzz.util.junit;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
/**
-
使用Junit的测试类
-
@author TeaBig
/
public class JUnitTest
{
/*- 在运行@test之前的时候运行此方法
*/
@Before
public void before()
{
System.out.println(“before”);
}
/**
- 在运行@test之后的时候运行此方法
*/
@After
public void after()
{
System.out.println(“after”);
}
/**
- 第一个方法
- 修饰符必须是public
- 返回值不能有
- 参数不能有
- 只需要在需要测试的方法上面加上@Test
*/
@Test
public void testOne()
{
System.out.println(“testOne”);
}
@Test
public void testTwo()
{
System.out.println(“testTwo”);
}@Test
public void testThree()
{
System.out.println(“testThree”);
}
}
4.1.2.Log4j
Log(日志)4(four–>for)J(java);java的日志;
日志:日记;
System.out.println()
木有日期
是哪个类打印的;第几行
级别:(为什么要有级别);天气预报:橙色,蓝色,黄色,红色
一天一个文件(本);
一天的文件会按照大小记录两个本;
官网:http://logging.apache.org/log4j/2.x/
引入jar包:
log4j-api-2.12.1.jar
log4j-core-2.12.1.jar - 在运行@test之前的时候运行此方法
配置文件
基本版本
高级版本
<?xml version="1.0" encoding="UTF-8"?> <!-- 系统打印日志
fileName:文件的名字
filePattern:文件名字的格式;
-->
<RollingRandomAccessFile name="System"
fileName="logs/mvchain/system.log" filePattern="logs/mvchain/system_%d{yyyy-MM-dd}_%i.log">
<PatternLayout
pattern="%date{yyyy-MM-dd HH:mm:ss.SSS} %level [%thread][%file:%line] - %msg%n" />
<Policies>
<!-- 多长时间生成一个文件;默认1天 -->
<TimeBasedTriggeringPolicy interval="1"
modulate="true" />
<!-- 多大的文件要切分 -->
<SizeBasedTriggeringPolicy size="5K" />
</Policies>
</RollingRandomAccessFile>
<!-- 外部打印日志 -->
<RollingRandomAccessFile name="Outer"
fileName="logs/mvchain/outer.log" filePattern="logs/mvchain/outer_%d{yyyy-MM-dd}_%i.log">
<PatternLayout
pattern="%date{yyyy-MM-dd HH:mm:ss.SSS} %level [%thread][%file:%line] - %msg%n" />
<Policies>
<TimeBasedTriggeringPolicy interval="1"
modulate="true" />
<SizeBasedTriggeringPolicy size="100M" />
</Policies>
</RollingRandomAccessFile>
<!-- 线程打印日志 -->
<RollingRandomAccessFile name="Timer"
fileName="logs/mvchain/timer.log" filePattern="logs/mvchain/timer_%d{yyyy-MM-dd}_%i.log">
<PatternLayout
pattern="%date{yyyy-MM-dd HH:mm:ss.SSS} %level [%thread][%file:%line] - %msg%n" />
<Policies>
<TimeBasedTriggeringPolicy interval="1"
modulate="true" />
<SizeBasedTriggeringPolicy size="100M" />
</Policies>
</RollingRandomAccessFile>
</appenders>
<loggers>
<!-- Root Logger(这个是整个配置文件的入口 -->
<root level="info">
<!-- 调用定义的log4j配置
console:指的是名字;(在这个标签中定义configuration==>appenders这下面标签的name属性 )
-->
<appender-ref ref="Console" />
<appender-ref ref="System" />
</root>
<!-- 外部日志,分开日志,name为getLogger()
console:指的是名字;(在这个标签中定义configuration==>appenders这下面标签的name属性 )
下面定义的多个组合,logger标签中任意组合
-->
<logger name="SystemLog" level="info" additivity="false">
<appender-ref ref="Console" />
<appender-ref ref="System" />
</logger>
<!-- 外部日志,分开日志,name为getLogger() -->
<logger name="OuterLog" level="info" additivity="false">
<!-- 日志文件要输出到三个地方,控制台,系统文件,外部文件 -->
<appender-ref ref="Console" />
<appender-ref ref="System" />
<appender-ref ref="Outer" />
</logger>
<!-- 线程日志,分开日志,name为getLogger() -->
<logger name="TimerLog" level="info" additivity="false">
<!-- 日志文件要输出到三个地方,控制台,系统文件,外部文件 -->
<appender-ref ref="Console" />
<appender-ref ref="System" />
<appender-ref ref="Outer" />
</logger>
</loggers>
输出效果:
示例代码:
package com.jinghangzz.util.junit;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.junit.Test;
/**
- Log4j的测试类
- @author TeaBig
/
public class Log4jTest
{
/*
* 第一个测试类
/
@Test
public void testOne()
{
/ 这个是日志的笔 */
Logger logger = LogManager.getLogger() ;
/* 记录信息
* 从上到下是从低到高
* */
logger.trace("====trace(跟踪)====");
logger.debug("====debug(断点调试)====");
logger.info("====info(信息)(蓝色)====");
logger.warn("====warn(警告)(黄色)====");
logger.error("====error(错误)(红色)====");
}
@Test
public void testTwo()
{
/* 这个是日志的笔 */
Logger logger = LogManager.getLogger() ;
/* 参数是:configuration==>loggers==>logger */
Logger logger = LogManager.getLogger(“OuterLog”);
String name = "张三" ;
double score = 100 ;
System.out.println(name + "是一个好同学,并且学习成绩:"+ score +"分");
name = "李四" ;
score = 99 ;
System.out.println(name + "是一个好同学,并且学习成绩:"+ score +"分");
logger.info(name + "是一个好同学,并且学习成绩:"+ score +"分");
/* 凡是想使用变量的时候,就用一个大括号:{};类似?占位符
* 赋值的时候:方法的第2+个参数是为第2+-1的{}赋值
* 赋值的时候:方法的第3个参数是为第2的{}赋值
* 赋值的时候:方法的第4个参数是为第3的{}赋值
* 如果方法的参数小于占位符的个数,则保留原样;
*
* */
logger.info("{}是一个好同学,并且学习成绩:{}分","王五",78);
logger.info("{}是一个好同学,并{}且学习{}成绩:{}分","王五",78);
logger.info("{}是一个好同学,并且学习成绩:{}分","王五",78,10,20,true,false);
try
{
String str = null ;
str.toString() ;
} catch (Exception e)
{
/* 如果报错了,使用的级别是error
* e:存储了报错信息,必须放到最后一个位置(参数)
* */
logger.error("报错了{},{},",name,score,e);
}
}
}
4.2.Mybatis-hw
4.2.1.搭建环境
参照手册:https://mybatis.org/mybatis-3/zh/getting-started.html
拷贝jar包
Mybatis的jar包;%mybatis_home%\mybatis-3.5.3.jar;%mybatis_home%\lib*.jar;
添加junit
添加log4j
java连接mysql数据库的jar包
去重:删除老版本,留下新版本;
拷贝配置文件
Log4j2.xml
Mybatis.cfg.xml:mybatis的核心配置文件
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;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.junit.Test;
/**
-
测试Mybatis的初始化操作
-
@author TeaBig
/
public class BaseTest
{
/ */
private Logger logger = LogManager.getLogger() ;/**
- Mybatis的初始化和JDBC的四步走一样;
- Mybatis对JDBC四步走做了一个封装
/
@Test
public void test()
{
/ 读取配置文件;位置是从classpath中读取 /
String resource = “mybatis.cfg.xml”;
InputStream is = null ;
try
{
/ 以流的形式读取 /
is = Resources.getResourceAsStream(resource);
/ 构建SqlsessionFactory;
* SqlsessionFactory=DriverManager
* /
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
this.logger.info(“sqlSessionFactory:{}”,sqlSessionFactory);
/ 获取链接
* SqlSession=Connection;
* /
SqlSession session = sqlSessionFactory.openSession() ;
this.logger.info(“session:{}”,session);
/=以上是加载驱动,获取链接======/
/=操作数据库======/
/========= 关闭链接============== */
session.close();
} catch (Exception e)
{
this.logger.error(“报错了”,e);
} finally
{
try
{
if(is != null)
{
is.close();
is = null ;
}
} catch (IOException e)
{
this.logger.error(“关闭出错了”,e);
}
}
}
}
4.2.2.查询所有的朝代记录
Pojo
package com.jinghangzz.mybatis.data.pojo;
import java.util.Date;
/**
- 朝代的POJO
- pojo的类名和表名一样(把_去掉,注意驼峰标识)
- pojo的属性名和表的类名一样
- pojo的对象和表的记录一样;
- @author TeaBig
*/
public class ADemoDynasty
{
private int id;
private String name;
private String content;
private int stYear;
private int edYear;
private int guoZuo;
private String capital;
private byte status;
private Date createTime;
private Date updateTime;
private Date pubTime;
Set/get方法
}
Mybatis.cfg.xml
<?xml version="1.0" encoding="UTF-8"?><!-- 一定一定一定要把映射文件包含起来 -->
<mappers>
<!-- 映射文件的路径,classpath -->
<mapper resource="com/jinghangzz/mybatis/data/pojo/ADynastyMapper.xml"/>
</mappers>
Mapper.xml
<?xml version="1.0" encoding="UTF-8"?>测试代码:
package com.jinghangzz.mybatis.data.test;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
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.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import com.jinghangzz.mybatis.data.pojo.ADemoDynasty;
/**
-
测试Mybatis的初始化操作
-
@author TeaBig
/
public class BaseTest
{
/ */
private Logger logger = LogManager.getLogger() ;/* sqlsessionFactory,让所有的类都能使用 */
private SqlSessionFactory sqlSessionFactory ;/**
- 初始化
/
@Before
public void init()
{
/ 读取配置文件;位置是从classpath中读取 /
String resource = “mybatis.cfg.xml”;
InputStream is = null ;
try
{
/ 以流的形式读取 /
is = Resources.getResourceAsStream(resource);
/ 构建SqlsessionFactory;
* SqlsessionFactory===DriverManager
* */
sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
this.logger.info(“sqlSessionFactory:{}”,sqlSessionFactory);
} catch (Exception e)
{
this.logger.error(“初始化报错了”,e);
}
}
/**
- 关闭链接
/
@After
public void close()
{
/========= 关闭链接============== */
this.logger.info(“关闭链接”);
}
/**
- 查询多条记录
/
@Test
public void selectList()
{
/ 获取链接- SqlSession===Connection;
- /
SqlSession session = sqlSessionFactory.openSession() ;
this.logger.info(“session:{}”,session);
/=以上是加载驱动,获取链接======/
/=操作数据库======/
/ - 查询多条:selectList
- 查询单条:selectOne
- 参数1:mapper文件中,namespace(如果sql语句的id在全局中是唯一的,那可以省略namespace)+sql语句的id
- /
// List dynastyList = session.selectList(“selectList”);
List dynastyList = session.selectList(“test.selectList”);
/ 如何循环 /
dynastyList.forEach( t -> System.out.println("==>" + t));
/ 关闭链接 */
session.close();
}
/**
-
Mybatis的初始化和JDBC的四步走一样;
-
Mybatis对JDBC四步走做了一个封装
/
@Test
public void test()
{
/ 读取配置文件;位置是从classpath中读取 /
String resource = “mybatis.cfg.xml”;
InputStream is = null ;
try
{
/ 以流的形式读取 /
is = Resources.getResourceAsStream(resource);
/ 构建SqlsessionFactory;
* SqlsessionFactory=DriverManager
* /
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
this.logger.info(“sqlSessionFactory:{}”,sqlSessionFactory);
/ 获取链接
* SqlSession=Connection;
* /
SqlSession session = sqlSessionFactory.openSession() ;
this.logger.info(“session:{}”,session);
/=以上是加载驱动,获取链接======/
/=操作数据库======/
/
* 查询多条:selectList
* 查询单条:selectOne
*
* 参数1:mapper文件中,namespace(如果sql语句的id在全局中是唯一的,那可以省略namespace)+sql语句的id
* /
List dynastyList = session.selectList(“selectList”);
/ 如何循环 */
dynastyList.forEach( t -> System.out.println("==>" + t));/*========= 关闭链接============== */ session.close();
} catch (Exception e)
{
this.logger.error(“报错了”,e);
} finally
{
try
{
if(is != null)
{
is.close();
is = null ;
}
} catch (IOException e)
{
this.logger.error(“关闭出错了”,e);
}
}
}
}
- 初始化
4.3.Crud
容器三要素(数组,集合,map,连接池,线程池,tomcat)
大小
容器里面放的是嘛
Crud
mapper文件
(‘大唐’, ‘大唐’, 618, 907, 289,‘长安’, 1, ‘2019-11-06 12:00:00’,‘2019-11-06 12:00:00’,‘2019-11-06 12:00:00’) ;
-->
</insert>
<!-- 返回主键的第二种写法 -->
<insert id="saveOneKey2" parameterType="com.jinghangzz.mybatis.data.pojo.ADemoDynasty">
<!-- 添加的sql语句,咋写 -->
insert into a_demo_dynasty(name, content, stYear, edYear, guoZuo, capital, status, createTime, updateTime, pubTime)
values
<!-- 如果parameterType是一个pojo,#{pojo的属性名} -->
(#{name}, #{content}, #{stYear}, #{edYear}, #{guoZuo}, #{capital}, #{status},#{createTime},#{updateTime},#{pubTime})
<!-- (#{name},#{content},#{stYear},#{edYear},#{guoZuo},#{capital},#{status},#{createTime},#{updateTime},#{pubTime}) -->
<!-- 获取主键的sql语句
order:获取主键的sql语句是在insert语句之前执行呢?还是之后执行呢?
如果数据库的主键是序列生成的(seqence);必须得使用此获取主键的sql语句;(postgresql,oracle);order必须是before
resultType:sql语句的返回值是int
-->
<selectKey keyColumn="id" keyProperty="id" order="AFTER" resultType="int">
select LAST_INSERT_ID() ;
<!-- select @@identity ; -->
</selectKey>
</insert>
<!-- 更新一条记录 -->
<update id="updateOne" parameterType="com.jinghangzz.mybatis.data.pojo.ADemoDynasty">
update a_demo_dynasty SET name = #{name}, content = #{content},
stYear = #{stYear}, edYear = #{edYear}, guoZuo = #{guoZuo}, capital = #{capital},
status = #{status}, createTime = #{createTime}, updateTime = #{updateTime},
pubTime = #{pubTime}
where id = #{id}
</update>
<!-- 删除一条记录
如果parameterType为int,#{中间随便写}
-->
<delete id="deleteOne" parameterType="int">
delete from a_demo_dynasty
where id = #{asdfasfdasfasf}
</delete>
测试代码:
package com.jinghangzz.mybatis.test;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;
import com.jinghangzz.mybatis.data.pojo.ADemoDynasty;
import com.jinghangzz.mybatis.data.test.BaseTest;
/**
-
朝代的CRUD
-
@author TeaBig
/
public class ADemoDynastyTest extends BaseTest
{
/*-
查询多条记录
/
@Test
public void selectList()
{
/ 获取链接 */
SqlSession session = this.sqlSessionFactory.openSession() ;/* 发送sql语句
- 参数1:mapper文件中namespace(可以忽略)+标签的id;
- */
List selectList = session.selectList(“selectList”);
/* 循环 */
selectList.forEach( e -> this.logger.info(“朝代🆔{},name:{},stYear:{},createTime:{}”,e.getId(),e.getName(),e.getStYear(),e.getCreateTime().toLocaleString()));/* 关闭链接 */
session.close();
}
/**
-
查询一条记录
/
@Test
public void selectOne()
{
/ 获取链接 /
SqlSession session = this.sqlSessionFactory.openSession() ;
Map<String, Object> condMap = new HashMap<String, Object>();
/ map的键一定要和sql标签中对应的#{键}一样 */
condMap.put(“id”, “2”);/* 发送sql语句
- 参数1:mapper文件中namespace(可以忽略)+标签的id;
- 参数2:就是mapper文件中sql标签中的parameterType(类型)
- */
ADemoDynasty demoDynasty = session.selectOne(“selectOne”,condMap);
/* 循环 */
this.logger.info(“朝代🆔{},name:{},stYear:{},createTime:{}”,demoDynasty.getId(),demoDynasty.getName(),demoDynasty.getStYear(),demoDynasty.getCreateTime().toLocaleString());/* 关闭链接 */
session.close();
}
/**
-
保存一条记录
/
@Test
public void saveOne()
{
/ 获取链接 /
SqlSession session = this.sqlSessionFactory.openSession() ;
try
{
/ Mybatis:CUD操作,是要开始事务的 /
/ 准备参数 /
ADemoDynasty demoDynasty = new ADemoDynasty();
/ 木有设置主键的 */
demoDynasty.setName(“大清”);
demoDynasty.setContent(“大清”);
demoDynasty.setCapital(“北平”);
demoDynasty.setStYear(1644);
demoDynasty.setEdYear(1912);
demoDynasty.setGuoZuo(268);
demoDynasty.setCreateTime(new Date());
demoDynasty.setUpdateTime(new Date());
demoDynasty.setPubTime(new Date());/* 调用sql语句 * 参数1:mapper文件中namespace(可以忽略)+sql标签的id * 参数2:parameterType指定的类型 * */
-
// int res = session.insert(“saveOne”,demoDynasty);
// int res = session.insert(“saveOneKey”,demoDynasty);
int res = session.insert(“saveOneKey2”,demoDynasty);
/* 瑕疵:
* res:为啥是1;此条sql语句执行的时候对数据库影响的条数
* id:主键,但是木有值;(如何在保存的时候获取主键)
* /
this.logger.info(“结果:{},id:{}”,res,demoDynasty.getId());
/ 提交事务 */
session.commit();
/* 关闭链接 */
if(session != null)
{
session.close();
session = null ;
}
} catch (Exception e)
{
if(session != null)
{
session.rollback();
}
this.logger.error("更新数据报错了",e);
}
}
/**
* 更新一条记录
*/
@Test
public void updateOne()
{
/* 获取链接 */
SqlSession session = this.sqlSessionFactory.openSession() ;
try
{
/* Mybatis:CUD操作,是要开始事务的 */
/* 准备参数 */
ADemoDynasty demoDynasty = new ADemoDynasty();
/* 木有设置主键的 */
demoDynasty.setId(14);
demoDynasty.setName("西汉");
demoDynasty.setContent("西汉");
demoDynasty.setCapital("长安");
demoDynasty.setStYear(202);
demoDynasty.setEdYear(8);
demoDynasty.setGuoZuo(268);
demoDynasty.setCreateTime(new Date());
demoDynasty.setUpdateTime(new Date());
demoDynasty.setPubTime(new Date());
/* 调用sql语句
* 参数1:mapper文件中namespace(可以忽略)+sql标签的id
* 参数2:parameterType指定的类型
* */
int res = session.insert("updateOne",demoDynasty);
/* 瑕疵:
* res:为啥是1;此条sql语句执行的时候对数据库影响的条数
* id:主键,但是木有值;(如何在保存的时候获取主键)
* */
this.logger.info("结果:{},id:{}",res,demoDynasty.getId());
/* 提交事务 */
session.commit();
/* 关闭链接 */
if(session != null)
{
session.close();
session = null ;
}
} catch (Exception e)
{
if(session != null)
{
session.rollback();
}
this.logger.error("更新数据报错了",e);
}
}
/**
* 删除一条记录
*/
@Test
public void deleteOne()
{
/* 获取链接 */
SqlSession session = this.sqlSessionFactory.openSession() ;
try
{
/* 调用sql语句
* 参数1:mapper文件中namespace(可以忽略)+sql标签的id
* 参数2:parameterType指定的类型
* */
int res = session.insert("deleteOne",11);
/* 瑕疵:
* res:为啥是1;此条sql语句执行的时候对数据库影响的条数
* id:主键,但是木有值;(如何在保存的时候获取主键)
* */
this.logger.info("结果:{}",res);
/* 提交事务 */
session.commit();
/* 关闭链接 */
if(session != null)
{
session.close();
session = null ;
}
} catch (Exception e)
{
if(session != null)
{
session.rollback();
}
this.logger.error("更新数据报错了",e);
}
}
}
4.4.配置
Mybatis.cfg.xml;
<!-- 全局的配置 -->
<settings>
<!--
参见:https://mybatis.org/mybatis-3/zh/configuration.html
设置(settings)部分
-->
<!-- name不能随便填写,得看官方的文档 -->
<setting name="logImpl" value="LOG4J2"/>
</settings>
<!-- 可以设置类的别名 -->
<typeAliases>
<!--
alias:别名
type:类型
-->
<typeAlias type="com.jinghangzz.mybatis.data.pojo.ADemoDynasty" alias="abc"/>
<!--
mybatis可以自动搜索指定包下面的类
这个是在注解的时候使用
也可以在mybatis.cfg.xml中定义,在Mapper文件使用,并且把包名忽略,
-->
<package name="com.jinghangzz.mybatis.data.pojo"/>
</typeAliases>
<!--
类型处理器(typeHandlers):
表里面的时间是dateTime类型,在POJO中,Date类型;
它为什么可以把dateTime类型直接转换Date类型
把数据库的类型变成java类型
使用内置的就可以
-->
<!-- 插件:(plugin)
Mybatis提供了一个接口,由第三方写实现,可以扩展Mybatis的功能;
插件:PageHelper:分页使用的
目前比较流行的确框架都会支持插件;
如(Jquery,Eclipse,FireFox,)
-->
<!-- 配置了一堆环境;jdbc的环境
default:默认的环境,配置environment的id
-->
<environments default="my">
<!-- 配置一个单数 -->
<environment id="my">
<!-- 事务管理器:专门用来管理事务的 -->
<transactionManager type="JDBC"/>
<!-- 数据源
pooled:连接池;放的是一个一个的Connection;
数据源包含了java连接数据库的各种信息
-->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<!-- <property name="url" value="jdbc:mysql://127.0.0.1:3306/mybatis?serverTimezone=UTC"/> -->
<!-- url取值;
使用属性
-->
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="123456"/>
</dataSource>
</environment>
</environments>
<!-- 一定一定一定要把映射文件包含起来 -->
<mappers>
<!-- 映射文件的路径,classpath -->
<!-- <mapper resource="com/jinghangzz/mybatis/data/pojo/ADynastyMapper.xml"/> -->
<!-- 映射路径:url:网络路径访问
本地;file:///
他人的计算机:http://,ftp://;共享文件夹:\\
-->
<!-- <mapper url="file:///E:/%E7%8F%AD%E7%BA%A7/javaee_20191101/20191105_mybatis_%E5%88%9D%E7%BA%A7/02_%E4%BB%A3%E7%A0%81/03-config/bin/com/jinghangzz/mybatis/data/pojo/ADynastyMapper.xml"/> -->
<mapper url="http://47.92.50.135:10000/file/soft/ADynastyMapper.xml"/>
</mappers>
Jdbc.properties # 此文件是属性文件;Properties:这个类就是一个map; # =左边的叫键,=右边的叫值 # 如果出现中文,需要使用native2ascii这个命令,进行转换(\u5cb3\u98de) # jdbc的url jdbc.url =jdbc:mysql://127.0.0.1:3306/mybatis?serverTimezone=UTC # jdbc的用户名 jdbc.username =root
5.总结
5.1.添加jar包
5.2.为jar包增加源码
5.3.木有网,xml提示
要把dtd文件找到(或者从网上下载,或者从jar包里面拖出来)
重新打开文件就可以
5.4.常见错误
木有找到@test,或者junit的方法不标准;
5.4.1.log4j1错误
看到以下红字,说明使用的是log4j1.x;需要一个配置文件叫:log4j.properties;我们已经使用的是log4j2了;把log4j1.x的jar包删除掉
Mybatis:自己可以指定日志;(log4j,slf4j;)删除所有的log4j,只留下log4j2;
删除的jar包有:
log4j-1.2.17.jar
slf4j-api-1.7.26.jar
slf4j-log4j12-1.7.26.jar
commons-logging-1.2.jar