学习内容

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

配置文件
基本版本

<?xml version="1.0" encoding="UTF-8"?>

高级版本

<?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的核心配置文件

<?xml version="1.0" encoding="UTF-8"?> 测试代码 package com.jinghangzz.mybatis.data.test;

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文件

<?xml version="1.0" encoding="UTF-8"?>

(‘大唐’, ‘大唐’, 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;

<?xml version="1.0" encoding="UTF-8"?>
<!-- 全局的配置 -->
<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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值