【MyBatis】MyBatis对Log4J的支持、MyBatis实现新增、删除、修改、查询

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/sinat_42483341/article/details/100177764

准备:数据库数据

  1. people表
    在这里插入图片描述
  2. people表数据
    在这里插入图片描述
  3. eclipse项目结构
    在这里插入图片描述

一.注解

  1. 注解存在的意义:简化xml 文件的开发.
  2. 注解在servlet 3.0 规范之后大力推广的.
  3. 注解前面的@XXX,表示引用一个@interface
    @interface 表示注解声明
  4. 注解可以有属性,因为注解其实就是一个接口(类)
    每次使用注解都需要导包
  5. 注解语法: @XXXX(属性名= 值)
  6. 值的分类
    如果值是基本数据类型或字符串: 属性名=值
    如果值是数组类型: 属性名={值,值}
    如果只有一个值可以省略大括号
    如果值是类类型,属性名=@名称
  7. 如果注解只需要给一个属性赋值,且这个属性是默认属性,可以省略
    属性名

二. 路径

  1. 编写路径为了告诉编译器如何找到其他资源.
  2. 路径分类
    相对路径: 从当前资源出发找到其他资源的过程
    绝对路径: 从根目录(服务器根目录或项目根目录)出发找到其他资源的过程
    标志: 只要以/开头的都是绝对路径
  3. 绝对路径
    如果是请求转发,/ 表示项目根目录(WebContent)
    其他重定向,<img/> <script/>,<style/>,location.href/都表示服务器根目录(tomcat/webapps 文件夹)
  4. 如果客户端请求的控制器,控制器转发到JSP 后,jsp 中如果使用相对路径,需要按照控制器的路径去找其他资源.
    保险办法:使用绝对路径,可以防止上面的问题.

三. Log4J

  1. 由apache 推出的开源免费日志处理的类库.
  2. 为什么需要日志:
    在项目中编写System.out.println();输出到控制台,当项目发布到tomcat 后,没有控制台(在命令行界面能看见.),不容易观察一些输出结果.
    log4j 作用,不仅能把内容输出到控制台,还能把内容输出到文件中.便于观察结果.
  3. 使用步骤:
    3.1 导入log4j-xxx.jar
    3.2 在src 下新建log4j.properties(路径和名称都不允许改变)
    3.2.1 ConversionPattern :写表达式
    3.2.2 log4j.appender.LOGFILE.File 文件位置及名称(日志文件扩展名.log)
log4j.rootCategory=ERROR, CONSOLE ,LOGFILE

log4j.logger.cn.hanquan.mapper=DEBUG

log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern=%C %p %m %n

log4j.appender.LOGFILE=org.apache.log4j.FileAppender
log4j.appender.LOGFILE.File=C:/picture/my.log
log4j.appender.LOGFILE.Append=true
log4j.appender.LOGFILE.layout=org.apache.log4j.PatternLayout
log4j.appender.LOGFILE.layout.ConversionPattern=%C %m %L %n
  1. log4j 输出级别
    4.1 fatal(致命错误) > error (错误) > warn (警告) > info(普通信息) > debug(调试信息)
    4.2 在log4j.properties 的第一行中控制输出级别:log4j.rootCategory=ERROR, CONSOLE ,LOGFILE

  2. log4j 输出目的地
    5.1 在一行控制输出目的地
    在这里插入图片描述

  3. Pattern 中常用几个表达式
    %C 包名+类名
    %d{YYYY-MM-dd HH:mm:ss} 时间
    %L 行号
    %m 信息
    %n 换行


四. <settings>标签

  1. mybatis 全局配置文件中通过<settings>标签控制mybatis全局开关
  2. mybatis.xml 中开启log4j
    2.1 必须保证有log4j.jar
    2.2 在src下有log4j.properties
    在这里插入图片描述
  3. log4j 中可以输出指定级别的日志(控制某个局部内容的日志级别)
    3.1命名级别(包级别): <mapper>namespace 属性中除了最后一个类名
    例如,namespace=”com.bjsxt.mapper.PeopleMapper” 其中包级别为com.bjsxt.mapper ,需要在log4j.propeties中:
    先在总体级别调成Error,不输出无用信息
    在设置某个指定位置级别为DEBUG
    在这里插入图片描述
    3.2 类级别
    3.2.1 namespace 属性值,namespace 类名
    3.3 方法级别
    3.3.2 使用namespace 属性值+标签id 属性值

五、parameterType 属性

  1. XXXMapper.xml<select><delete>等标签的parameterType 可以控制参数类型
  2. SqlSessionselectList()selectOne()的第二个参数和selectMap()的第三个参数都表示方法的参数.
    2.1 java示例
    在这里插入图片描述
    2.2 在Mapper.xml 中可以通过#{}获取参数
    在这里插入图片描述
    parameterType 控制参数类型
    #{}获取参数内容
    使用索引,从0 开始#{0}表示第一个参数
    也可以使用#{param1}第一个参数
    如果只有一个参数(基本数据类型或String),mybatis对#{}里面内容没有要求,只要写内容即可.
    如果参数是对象#{属性名}
    如果参数是map写成#{key}
  3. #{}${} 的区别
    3.1 #{} 获取参数的内容支持索引获取,param1 获取指定位置参数,并且SQL 使用?占位符
    3.2 ${} 字符串拼接不使用?,默认找${内容}内容的get/set 方法,如果写数字,就是一个数字
  4. 如果在xml 文件中出现< , > ,"等特殊字符时,可以使用XML文件转义标签(XML 自身的)
    4.1 <![CDATA[ 内容]]>
  5. mybatis 中实现mysql 分页写法
    5.1 ?不允许在关键字前后进行数学运算,需要在java中计算完成后,传递到mapper.xml 中
    5.2 在java 代码中计算
    在这里插入图片描述
    5.3 在mapper.xml 中代码
    在这里插入图片描述

六. typeAliases 别名

  1. 系统内置别名: 把类型全小写
  2. 给某个类起别名
    2.1 alias=”自定义别名”
    在这里插入图片描述
    2.2 在mapper.xml 中,使用别名pp 引用People
    在这里插入图片描述
  3. 直接给某个包下所有类起别名,别名为类名,不区分大小写
    3.1 mybatis.xml 中配置
    在这里插入图片描述
    3.2 mapper.xml 中通过类名引用
    在这里插入图片描述

七.MyBatis 实现新增

  1. 概念复习
    1.1 功能:从应用程序角度出发,软件具有哪些功能.
    1.2 业务:完成功能时的逻辑.对应Service 中一个方法
    1.3 事务:从数据库角度出发,完成业务时需要执行的SQL 集合,统称一个事务.
    1.3.1 事务回滚.如果在一个事务中某个SQL 执行事务,希望回归到事务的原点,保证数据库数据的完整性.
  2. 在mybatis 中默认是关闭了JDBC 的自动提交功能
    2.1 每一个SqlSession 默认都是不自动提交事务.
    2.2 session.commit()提交事务.
    2.3 openSession(true);自动提交.setAutoCommit(true);
  3. mybatis 底层是对JDBC 的封装.
    3.1 JDBC 中executeUpdate()执行新增,删除,修改的SQL.返回值int,表示受影响的行数.
    3.2 mybatis 中<insert> <delete> <update>标签没有resultType 属性,
    认为返回值都是int
  4. 在openSession() 时Mybatis 会创建SqlSession 时同时创建一个
    Transaction(事务对象),同时autoCommit 都为false
    4.1 如果出现异常,应该session.rollback()回滚事务.
  5. 实现新增的步骤
    5.1 在mapper.xml 中提供<insert>标签,标签没有返回值类型
    在这里插入图片描述
    5.2 通过session.insert()调用新增方法
    在这里插入图片描述

八.MyBatis 实现修改

  1. 在mapper.xml 中提供<update>标签
	<update id="upd" parameterType="People">
		update people set name = #{name} where id = #{id}
	</update>
  1. 编写Java代码
	People peo = new People();
	peo.setId(3);
	peo.setName("王五");
	
	int index = session.update("a.b.upd", peo);
	if(index>0){
		System.out.println("成功");
	}else{
		System.out.println("失败");
	}
	
	session.commit();

九.mybatis 实现删除

  1. 在mapper.xml 提供<delete>标签
	<delete id="del" parameterType="int">
		delete from people where id = #{0}
	</delete>
  1. 编写Java代码
	int del = session.delete("a.b.del",3);
	if(del>0){
		System.out.println("成功");
	}else{
		System.out.println("失败");
	}
	session.commit();

以上(增加、查询)示例代码

Test.java

package cn.hanquan.test;

import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

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 cn.hanquan.pojo.People;

public class Test {
	public static void main(String[] args) throws IOException {
		InputStream is = Resources.getResourceAsStream("mybatis.xml");
		// 工厂模式+构建者模式
		SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is);
		SqlSession session = factory.openSession();

		// 查询语句
		// 1、查询语句无参数
		List<People> list1 = session.selectList("cn.hanquan.mapper.PeopleMapper.selAll");
		System.out.println(list1 + "\n");

		// 2、查询语句含一个参数
		People p2 = session.selectOne("cn.hanquan.mapper.PeopleMapper.selOne", 2);
		System.out.println(p2 + "\n");

		// 3、查询语句含多个参数:使用Map
		Map<String, Object> m3 = new HashMap<String, Object>();
		m3.put("name", "张三");
		m3.put("age", 25);
		People p3 = (People) session.selectOne("cn.hanquan.mapper.PeopleMapper.selList", m3);
		System.out.println(p3 + "\n");

		// 4、查询语句在xml文件中出现< , > ,双引号等特殊字符
		List<People> list4 = session.selectList("cn.hanquan.mapper.PeopleMapper.selSpecial", 3);
		System.out.println(list4 + "\n");

		// 5、实现分页
		int pgSize = 2;
		int pgNum = 3;
		Map<String, Object> m5 = new HashMap<String, Object>();
		m5.put("pgSize", pgSize);
		m5.put("pgStart", pgSize * (pgNum - 1));
		List<People> list5 = session.selectList("cn.hanquan.mapper.PeopleMapper.selPage", m5);
		System.out.println(list5 + "\n");

		// 6、在mybatis.xml中给类起别名
		List<People> list6 = session.selectList("cn.hanquan.mapper.PeopleMapper.selAlias");
		System.out.println(list6 + "\n");

		// 7、在mybatis.xml中通过类名引用
		List<People> list7 = session.selectList("cn.hanquan.mapper.PeopleMapper.selAliasPkg");
		System.out.println(list7 + "\n");

		// 插入语句
		People p8 = new People();
		p8.setName("小李");
		p8.setAge(30);
		int line8 = session.insert("cn.hanquan.mapper.PeopleMapper.ins", p8);
		System.out.println(line8);

		session.commit();// mybatis默认关闭了JDBC的自动提交功能。增删改的时候,需要手动提交事务
		// session.rollback();//在try..catch中使用rollback回滚事务
		session.close();
	}
}

mybatis.xml

<?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>
	<settings>
		<setting name="logImpl" value="LOG4J"/>
	</settings>
	
	<!-- 给类起别名 -->
	<typeAliases>
		<typeAlias type="cn.hanquan.pojo.People" alias="pp"/>
		<package name="cn.hanquan.pojo"/>
	</typeAliases>
	
	<environments default="default">
	 <environment id="default">
	 	<transactionManager type="JDBC"></transactionManager>
	 	<dataSource type="POOLED">
	 		<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
	 		<property name="url" value="jdbc:mysql://localhost:3306/people?serverTimezone=UTC"/>
	 		<property name="username" value="root"/>
			<property name="password" value="g67108864"/>
	 	</dataSource>
	 </environment>
	</environments>
	<mappers>
		<mapper resource="cn/hanquan/mapper/PeopleMapper.xml"/>
	</mappers>
</configuration>

PeopleMapper.xml

<?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">
<!-- 填写实例化的包名+类名,在java代码中调用语句的时候使用 -->
<mapper namespace="cn.hanquan.mapper.PeopleMapper">

<!-- 查询语句 -->
	<!-- 不含参数 -->
	<select id="selAll" resultType="cn.hanquan.pojo.People">
		select * from people
	</select>

	<!-- 一个参数 -->
	<select id="selOne" resultType="cn.hanquan.pojo.People" parameterType="int">
		select * from people where id=#{0}
	</select>

	<!-- 多个参数 -->
	<select id="selList" resultType="cn.hanquan.pojo.People" parameterType="map">
		select * from people where name=#{name} and age=#{age}
	</select>
	
	<!-- 语句中含有<>等特殊符号 -->
	<select id="selSpecial" resultType="cn.hanquan.pojo.People"	parameterType="int">
		<![CDATA[select * from people where id>#{0}]]>
	</select>
	
	<!-- limit分页查询 -->
	<select id="selPage" resultType="cn.hanquan.pojo.People" parameterType="map">
		select * from people limit #{pgStart}, #{pgSize}
	</select>
	
	<!-- 在mybatis.xml中给类起别名 -->
	<select id="selAlias" resultType="pp">
		select * from people
	</select>
	
	<!-- 在mybatis.xml中通过类名引用 -->
	<select id="selAliasPkg" resultType="People">
		select * from people
	</select>

<!-- 插入语句 -->
	<insert id="ins" parameterType="People">
		insert into people values(default, #{name}, #{age})
	</insert>
	
</mapper>

输出

org.apache.ibatis.logging.jdbc.BaseJdbcLogger DEBUG ==>  Preparing: select * from people  
org.apache.ibatis.logging.jdbc.BaseJdbcLogger DEBUG ==> Parameters:  
org.apache.ibatis.logging.jdbc.BaseJdbcLogger DEBUG <==      Total: 9 
[People [id=1, name=小明, age=25], People [id=2, name=张三, age=23], People [id=3, name=张三, age=24], People [id=4, name=张三, age=25], People [id=5, name=张三, age=26], People [id=6, name=张六, age=26], People [id=7, name=张七, age=0], People [id=8, name=张八, age=28], People [id=9, name=张九, age=29]]

org.apache.ibatis.logging.jdbc.BaseJdbcLogger DEBUG ==>  Preparing: select * from people where id=?  
org.apache.ibatis.logging.jdbc.BaseJdbcLogger DEBUG ==> Parameters: 2(Integer) 
org.apache.ibatis.logging.jdbc.BaseJdbcLogger DEBUG <==      Total: 1 
People [id=2, name=张三, age=23]

org.apache.ibatis.logging.jdbc.BaseJdbcLogger DEBUG ==>  Preparing: select * from people where name=? and age=?  
org.apache.ibatis.logging.jdbc.BaseJdbcLogger DEBUG ==> Parameters: 张三(String), 25(Integer) 
org.apache.ibatis.logging.jdbc.BaseJdbcLogger DEBUG <==      Total: 1 
People [id=4, name=张三, age=25]

org.apache.ibatis.logging.jdbc.BaseJdbcLogger DEBUG ==>  Preparing: select * from people where id>?  
org.apache.ibatis.logging.jdbc.BaseJdbcLogger DEBUG ==> Parameters: 3(Integer) 
org.apache.ibatis.logging.jdbc.BaseJdbcLogger DEBUG <==      Total: 6 
[People [id=4, name=张三, age=25], People [id=5, name=张三, age=26], People [id=6, name=张六, age=26], People [id=7, name=张七, age=0], People [id=8, name=张八, age=28], People [id=9, name=张九, age=29]]

org.apache.ibatis.logging.jdbc.BaseJdbcLogger DEBUG ==>  Preparing: select * from people limit ?, ?  
org.apache.ibatis.logging.jdbc.BaseJdbcLogger DEBUG ==> Parameters: 4(Integer), 2(Integer) 
org.apache.ibatis.logging.jdbc.BaseJdbcLogger DEBUG <==      Total: 2 
[People [id=5, name=张三, age=26], People [id=6, name=张六, age=26]]

org.apache.ibatis.logging.jdbc.BaseJdbcLogger DEBUG ==>  Preparing: select * from people  
org.apache.ibatis.logging.jdbc.BaseJdbcLogger DEBUG ==> Parameters:  
org.apache.ibatis.logging.jdbc.BaseJdbcLogger DEBUG <==      Total: 9 
[People [id=1, name=小明, age=25], People [id=2, name=张三, age=23], People [id=3, name=张三, age=24], People [id=4, name=张三, age=25], People [id=5, name=张三, age=26], People [id=6, name=张六, age=26], People [id=7, name=张七, age=0], People [id=8, name=张八, age=28], People [id=9, name=张九, age=29]]

org.apache.ibatis.logging.jdbc.BaseJdbcLogger DEBUG ==>  Preparing: select * from people  
org.apache.ibatis.logging.jdbc.BaseJdbcLogger DEBUG ==> Parameters:  
org.apache.ibatis.logging.jdbc.BaseJdbcLogger DEBUG <==      Total: 9 
[People [id=1, name=小明, age=25], People [id=2, name=张三, age=23], People [id=3, name=张三, age=24], People [id=4, name=张三, age=25], People [id=5, name=张三, age=26], People [id=6, name=张六, age=26], People [id=7, name=张七, age=0], People [id=8, name=张八, age=28], People [id=9, name=张九, age=29]]

org.apache.ibatis.logging.jdbc.BaseJdbcLogger DEBUG ==>  Preparing: insert into people values(default, ?, ?)  
org.apache.ibatis.logging.jdbc.BaseJdbcLogger DEBUG ==> Parameters: 小李(String), 30(Integer) 
org.apache.ibatis.logging.jdbc.BaseJdbcLogger DEBUG <==    Updates: 1 
1

猜你喜欢

转载自blog.csdn.net/sinat_42483341/article/details/100177764