Mybatis之CRUD

一、学习Mybatis的原因

|---->前期使用JDBC对数据库进行CRUD,分为四步,1.加载驱动2.获取链接3.操作数据可4.关闭链接
|---->|---->使用JDBC进行数据的CRUD时,纯Java代码,在实际的项目中,Java编译为.class文件,不能修改,在Mybatis中将CRUD写在配置文件中,改写维护方便
|---->|---->执行sql语句时,如果抛异常,事务回滚,后期spring已经封装好,可以直接使用
|---->写sql语句比在JDBC中简便,尤其体现在占位符
|---->Mybatis的关联关系
|---->|---->一对一
|---->|---->一对多
|---->|---->多对多
|---->缓存:当访问量比较大的时候,可以重复使用查询的数据,尽量减少数据库的访问次数;

二、Mybatis的介绍

mybatis的在线下载
mybatis的在线手册

mybatis解压后的目录介绍
在这里插入图片描述

三、Mybatis的Helloworld

3.1 前期准备
3.1.1 数据库

在mybatis的练习中需要在数据库中准备2张表,示例准备的是朝代和皇上表

朝代、皇上表

3.1.2 Junit

导入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之前的时候运行此方法*/@Beforepublic void before(){System.out.println("====before====");}/*** 在运行@test之后的时候运行此方法*/@Afterpublic void after(){System.out.println("====after====");}/*** 第一个方法* 修饰符必须是public* 返回值不能有* 参数不能有* * 只需要在需要测试的方法上面加上@Test*/@Testpublic void testOne(){System.out.println("====testOne====");}@Testpublic void testTwo(){System.out.println("====testTwo====");}@Testpublic void testThree(){System.out.println("====testThree====");}
}
3.1.3 Log4j

java日志记录工具
Log4j下载地址
引入jar包:
----log4j-api-2.12.1.jar
----log4j-core-2.12.1.jar

配置文件(这个配置文件,配置一次以后,哪里使用粘哪里,注意配置文件是xml文件)
Log4j2.xml

<?xml version="1.0" encoding="UTF-8"?>
<!-- status=debug 可以查看log4j的装配过程 -->
<configuration status="off" monitorInterval="1800"><appenders><!-- 定义控制台输出 --><Console name="Console" target="SYSTEM_OUT" follow="true"><PatternLayoutpattern="%date{yyyy-MM-dd HH:mm:ss.SSS} %level [%thread][%file:%line] - %msg%n" /></Console><!-- 系统打印日志fileName:文件的名字filePattern:文件名字的格式; --><RollingRandomAccessFile name="System"fileName="logs/mvchain/system.log" filePattern="logs/mvchain/system_%d{yyyy-MM-dd}_%i.log"><PatternLayoutpattern="%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"><PatternLayoutpattern="%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"><PatternLayoutpattern="%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>
</configuration>

测试代码

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.junit.Test;/*** Log4j的测试类* @author TeaBig**/
public class Log4jTest
{/*** 第一个测试类*/@Testpublic void testOne(){/* 这个是日志的笔 */Logger logger = LogManager.getLogger() ; /* 记录信息* 从上到下是从低到高*  */logger.trace("====trace(跟踪)====");logger.debug("====debug(断点调试)====");logger.info("====info(信息)(蓝色)====");logger.warn("====warn(警告)(黄色)====");logger.error("====error(错误)(红色)====");}@Testpublic 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);} }
}
3.2 Mybatis的helloworld
3.2.1 mybatis的环境配置

------>1.导入mybatis解压后lib文件夹中所有的jar包
------>2.添加junit的jar包
------>3.添加log4j的jar包
------>4.添加Java链接Mysql的jar包
------>|------>mysql-connector-java-8.0.18.jar
------>4.拷贝配置文件
------>|------>Log4j2.xml
------>|------>Mybatis.cfg.xml mybatis的核心配置文件

Mybatis.cfg.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd">
<!-- xml是一个配置文件,标签三要素:标签名属性名开始标签和结束标签中间的内容这里面的标签随便写;mybatis要求标签不能随便写,得需要一个dtd,或者schema-->
<configuration><!-- 配置了一堆环境;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"/><property name="username" value="root"/><property name="password" value="123456"/></dataSource></environment></environments>
</configuration>

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四步走做了一个封装*/@Testpublic 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);}}}
}
3.2.2 pojo类(注意创建pojo时和数据库中的字段一定要一致)

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;**读写器自动生成**
}

在mybatis.cfg.xml文件中配置映射文件

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd">
<!-- xml是一个配置文件,标签三要素:标签名属性名开始标签和结束标签中间的内容这里面的标签随便写;mybatis要求标签不能随便写,得需要一个dtd,或者schema-->
<configuration><!-- 配置了一堆环境;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"/><property name="username" value="root"/><property name="password" value="123456"/></dataSource></environment></environments><!-- 一定一定一定要把映射文件包含起来 --><mappers><!-- 映射文件的路径,classpath --><mapper resource="com/jinghangzz/mybatis/data/pojo/ADynastyMapper.xml"/></mappers>
</configuration>

映射文件,一个pojo对应一个mapper文件

mapper.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!-- namespace不能为空mapper:相当于java里面的类namespace:相当于java里面的包名-->
<mapper namespace="test"><!-- 查询所有的朝代记录select标签可以发送select语句id:唯一标识,当前的mapper文件中,id不能重复resultType:结果类型;如果查询的是单条,那返回值的类型就是resultType; 如果查询的是多条,那么返回值的类型是List,List里面放的是resultType--><select id="selectList" resultType="com.jinghangzz.mybatis.data.pojo.ADemoDynasty">select * from a_demo_dynasty  </select>
</mapper>

测试代码

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 ;/*** 初始化*/@Beforepublic 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);}}/*** 关闭链接*/@Afterpublic void close(){/*========= 关闭链接============== */this.logger.info("关闭链接");}/*** 查询多条记录*/@Testpublic 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<ADemoDynasty> dynastyList = session.selectList("test.selectList");/* 如何循环 */dynastyList.forEach( t -> System.out.println("==>" + t));/* 关闭链接 */session.close();}/*** Mybatis的初始化和JDBC的四步走一样;* Mybatis对JDBC四步走做了一个封装*/@Testpublic 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<ADemoDynasty> 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);}}}
}

以上为使用mybatis对数据库信息进行查询的的整体流程

3.2 Mybatis的CRUD

mybatis对数据库进行操作都是在mapper文件中进行的

mapper.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!-- namespace不能为空mapper:相当于java里面的类namespace:相当于java里面的包名-->
<mapper namespace="test"><!-- 查询所有的朝代记录select标签可以发送select语句id:唯一标识,当前的mapper文件中,id不能重复resultType:结果类型;如果查询的是单条,那返回值的类型就是resultType; 如果查询的是多条,那么返回值的类型是List,List里面放的是resultType--><select id="selectList" resultType="com.jinghangzz.mybatis.data.pojo.ADemoDynasty">select * from a_demo_dynasty  </select><!-- 查询一条记录parameterType:参数,--><select id="selectOne" parameterType="map" resultType="com.jinghangzz.mybatis.data.pojo.ADemoDynasty"><!-- #{id}:#{}在生成sql语句的时候会变成占位符;要赋值(调用此方法的时候赋值)#{id}:id指的是map的键 -->select * from a_demo_dynasty where id = #{id}</select><!-- 添加一条记录parameterType:是我指定的pojo的类型;当年在写dao层,保存一条记录的时候,的方法参数是什么?AUsersDaoImpl.saveOne(AUsers);--><insert id="saveOne" 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})  --></insert><!-- 返回主键useGeneratedKeys:自动生成主键,凡是碰到Column都是数据库那一方的配置凡是碰到Property都是pojo那一方的配置keyColumn:表里面表示主键的那一列keyProperty:要把主键的值,赋值给哪个属性--><insert id="saveOneKey" parameterType="com.jinghangzz.mybatis.data.pojo.ADemoDynasty" useGeneratedKeys="true" keyColumn="id" keyProperty="id"><!-- 添加的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})  --><!-- insert into a_demo_dynasty(name, content, stYear, edYear, guoZuo, capital, status, createTime, updateTime, pubTime) values 
('大唐', '大唐', 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必须是beforeresultType: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>
</mapper>

测试代码

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
{/*** 查询多条记录*/@Testpublic void selectList(){/* 获取链接 */SqlSession session = this.sqlSessionFactory.openSession() ; /* 发送sql语句 * 参数1:mapper文件中namespace(可以忽略)+标签的id;* */List<ADemoDynasty> selectList = session.selectList("selectList");/* 循环 */selectList.forEach( e -> this.logger.info("朝代:id:{},name:{},stYear:{},createTime:{}",e.getId(),e.getName(),e.getStYear(),e.getCreateTime().toLocaleString()));/* 关闭链接 */session.close();}/*** 查询一条记录*/@Testpublic 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("朝代:id:{},name:{},stYear:{},createTime:{}",demoDynasty.getId(),demoDynasty.getName(),demoDynasty.getStYear(),demoDynasty.getCreateTime().toLocaleString());/* 关闭链接 */session.close();}/*** 保存一条记录*/@Testpublic 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);}}/*** 更新一条记录*/@Testpublic 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);}}/*** 删除一条记录*/@Testpublic 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);}}
}

朝代的CRUD完成


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部