38.MyBatisMVC模型、环境搭建、配置、日志、参数传递

这篇博客详细介绍了MyBatis的MVC模型、环境搭建步骤,包括引入JAR包、配置实体类和数据库表、编写接口和Mapper.xml文件。还讲解了全局配置文件的各个部分,如environments、typeAliases、properties和settings。此外,讨论了MyBatis的日志配置,以及参数传递的不同方式,包括单参数、多参数、匿名传递和Map传递。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

MyBatis_Day02

第一节、什么是MyBatis

myBatis是一个优秀的持久层框架,在操作数据库是几乎避免了所有的JDBC代码。我们操作数据库时通过对象操作(ORM框架),支持自定的SQL语句(半自动的ORM框架)。

第二节、三层模型(MVC模型)

image-20210902095531588

注意:每一层代码应该严格分离

controller代码—controller包

service代码–service包

持久层代码–dao包

第三节、MyBatis环境搭建

引入相关JAR包

mybatis-3.4.5.jar myBatis核心包

mysql-connector-java-5.1.37.jar 数据库连接包

编写实体类及新建数据库表
private int id;
private String name;
private String pass;

image-20210902100206749

编写对实体类对象操作的接口
//编写数据库操作的接口
public interface UserMapper {
	//查询所有用户
	List<User> getAllUser();
}

注意:接口本身不具备业务处理能力,要让接口能具有操作数据库的能力,必须对接口进行实现。我们可以通过XML的配置将接口的实现交给MyBaits

问题:怎么交给MyBatis

解决:每一个DAO接口都必须有一个对应的XXXMapper.xml配置文件

编写对应接口Mapper.xml

问题:我不知道怎么写

解决:去官网 https://mybatis.org/mybatis-3/zh/getting-started.html

<?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">
  <!-- mapper 声明该文件为一个mapper映射文件 
      1 每一个mapper有且只能有一个Mapper标签
      问题:我怎么映射接口
      解决:每一个mapper标签有一个属性 namespace
        namespace指向需要映射接口 通过接口的全类名
        注意:全类名不要写错  检测:ctrl+鼠标  必须能够跳转
  -->
<mapper namespace="com.wnxy.dao.UserMapper">
	<!-- mapper中写数据库的操作 
	    注意:myBaits不同的数据库操作有不同的标签
	      select   查询
	      delete   删除
	      insert   插入
	      update   更新
	    根据不同的数据库操作,需要选择不同的标签
	-->
	<!--由于List<User> getAllUser();是一个查询,所有我们用
	   select
	    问题:每一个标签上有一id属性  作用:指向特定的方法
	    问题:MyBatis肯定会将结果集转为对象- 反射-告诉封装规则
	    解决:resultType 告诉MyBatis
	    
	  -->
	<select id="getAllUser" resultType="com.wnxy.entity.User">
		<!-- 需要执行的SQL -->
		SELECT * FROM t_user;
	</select>
</mapper>
全局配置文件

每个基于 MyBatis 的应用都是以一个 SqlSessionFactory 的实例为核心的SqlSessionFactory 的实例可以通过 SqlSessionFactoryBuilder 获得。而 SqlSessionFactoryBuilder 则可以从 XML 配置文件或一个预先配置的 Configuration 实例来构建出 SqlSessionFactory 实例。

注意:全局配置文件没有特定的命名,但是我们一般命名为mybatis-config.xml(官网推荐的)

问题:全局配置文件怎么写

解决:找DTD

<?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">
通过xml文件获得SqlFactory
public class SqlSessionFactoryUtil {
	private static SqlSessionFactory sqlSessionFactory;
	
	static {
		String resource = "config/mybatis-config.xml";
		InputStream inputStream = null;
		try {
			inputStream = Resources.getResourceAsStream(resource);
		} catch (IOException e) {
			e.printStackTrace();
		}
		 sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
	}
	
	/**
	 * 返回SqlSession
	 * @return
	 */
	public static SqlSession getSqlSession() {
		return sqlSessionFactory.openSession();
	}
}
SqlSession是SQL执行器
测试DAO接口

用junit单元测试框架

Junit测试是程序员测试,即所谓白盒测试,因为程序员知道被测试的软件如何(How)完成功能和完成什么样(What)的功能。

junit基本的应用:

1.环境搭建 引入相应的JAR包 junit-4.12.jar

2.基本使用

几个基本的注解:

@Test 标记该方法为一个测试单元

@Before 在测试单元之前运行

@After 在测试单元执行完后执行

@ClassBefore 标记在静态方法上

image-20210902111453283

注意:如果想要Junit帮你测试代码,方法必须是public void 打头

测试代码
//获取SqlSession
SqlSession sqlSession = SqlSessionFactoryUtil.getSqlSession();
//获取mapper--接口的实现
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
//调用接口方法
List<User> allUser = mapper.getAllUser();
System.out.println(allUser);
//关闭sqlSession
sqlSession.close();
通过MyBatis做增删查改

总结:首先在接口定义不同的操作接口

​ 每一个接口方法是在对应的mapper.xml文件有一个执行的标签

myBatis对不同的操作定义了哪些标签

INSERT 插入

DELETE 删除

UPDATE 更新

SELECT 查询

	<select id="getAllUser" resultType="com.wnxy.entity.User">
		<!-- 需要执行的SQL -->
		SELECT * FROM t_user;
	</select>
	
	<!-- 根据id查询 -->
	<select id="getByID" resultType="com.wnxy.entity.User" >
		SELECT * FROM t_user WHERE id=#{id}
	</select>
	
	<!-- 根据主键更新 -->
	<update id="updateUser" parameterType="com.wnxy.entity.User">
		UPDATE t_user SET name=#{name},pass=#{pass} WHERE id=#{id}
	</update>
	
	<delete id="deleteUser" parameterType="com.wnxy.entity.User">
		DELETE FROM t_user WHERE id=#{id}
	</delete>
	
	<insert id="insertUser" parameterType="com.wnxy.entity.User">
		INSERT INTO t_user VALUES(#{id},#{name},#{pass});
	</insert>

如果需要传参:如果是参数是复杂类型,同时是单参。我们需要再标签上通过parameterType指定类型 ,在XML文件中怎么取 #{属性名/参数名}

myBatis基本的执行流程

image-20210902121738377

第四节、MyBatis的配置

MyBatis 的配置文件包含了会深深影响 MyBatis 行为

environments环境配置

MyBatis 可以配置成适应多种环境,不过要记住:尽管可以配置多个环境,但每个 SqlSessionFactory 实例只能选择一种环境。

image-20210902142109323

在使用时通过environments default属性的与每一个不同environment中id属性进行匹配。

事务管理器(transactionManager)

在 MyBatis 中有两种类型的事务管理器(也就是 type="[JDBC|MANAGED]"):

  • JDBC – 这个配置直接使用了 JDBC 的提交和回滚设施,它依赖从数据源获得的连接来管理事务作用域。( 最常用用)
  • MANAGED – 这个配置几乎没做什么。

数据源(dataSource)

什么是数据源:其实可以理解为数据的源头,在这里的其实就是数据库的连接。

配置数据源的类型其实就是配置数据库连接的管理方式。

1.UNPOOLED 采用非数据库连接池的模型。每次操作数据库时都会去打开和关闭数据库连接。这种方式对于小的应用或者对数据库操作不频繁的程序比较。但是对于数据库频繁操作的程序不是一个好的选择

2.POOLED这种数据源的实现利用“池”的概念将 JDBC 连接对象组织起来,避免了创建新的连接实例时所必需的初始化和认证时间。 这种处理方式很流行,能使并发 Web 应用快速响应请求。

image-20210902144025376

映射器(mappers)

作用:告诉myBatis去哪里读取SQL语句的映射(告诉myBatis去哪里读取mapper文件)

方式一、

直接告诉myBatis资源路径(注意:资源路径分隔符是/)

扫描XML文件

  <mappers>
  	<mapper resource="com/wnxy/dao/UserMapper.xml"/>
  	<mapper resource="com/wnxy/dao/StudentMapper.xml"/>
  </mappers>

方式二、

扫描Mapper接口

image-20210902145546193

<mapper class="com.wnxy.dao.UserMapper"/>
<mapper class="com.wnxy.dao.StudentMapper"/> 

方式三、

扫描包

image-20210902150106738

  	<!-- 扫描包 
  	通过package标签直接配置包名
  	-->
  	<package name="com.wnxy.dao"/>
类型别名(typeAliases)

image-20210902151429268

注意:全局配置文件中每一个配置项之间是有顺序

作用:对JAVA类型起别名,可以降低冗余的全类名的写法,我们如果取了别名,以前使用全限定名的地方直接可以用别名

image-20210902150916534

image-20210902150937253

注意:如果用上述方式取别名,则应该对每一个类取别名。

image-20210902151351941

属性(properties)

作用:读取外部properties文件

<!-- 引入外部的properties配置信息   默认都是去src类路径-->
<properties resource="db.properties"></properties>

image-20210902154800351

image-20210902154825847

image-20210902155327459

#配置的是一对键值对
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/test63_3
uname=root
pass=123456
设置(settings)

是MyBatis中极为重要的一个设置项,它们会改变 MyBatis 的运行时行为

注意:每一个设置项

image-20210902160058852

image-20210902160243313

image-20210902160302612

image-20210902160329383

image-20210902160426446

第五节、MyBatis日志

作用:生活中的日志是记录你生活点点滴滴,让它把你内心的世界表露出来,更好的诠释自己的内心世界。

编程中日志:记录程序运行的状态

在MyBatis中开启框架自带日志:

<settings>
    <!-- 开启日志 -->
    <setting name="logImpl" value="STDOUT_LOGGING"/>
</settings>

image-20210902162922839

开启LOG4J的日志

1、引入LOG4J的JAR包

log4j-1.2.14.jar

2、通过Settings中setting进行开启

<setting name="logImpl" value="LOG4J"/>

3、引入log4j的配置(放SRC下)

第六节、参数传递的问题

单参数:

Student getStudentById(int id);

image-20210902171122708

多参传递

匿名传递

Student getStudentByNameAndId(String name,int id);
<select id="getStudentByNameAndId" resultType="student">
    SELECT * FROM student WHERE id=#{param1} AND name =#{param2}
</select>

问题:严格按照参数的顺序取

通过@Param对参数取名字

Student getStudentByNameAndId(@Param("name")String name,@Param("id")int id);
	<select id="getStudentByNameAndId" resultType="student">
		SELECT * FROM student WHERE id=#{name} AND name =#{id}
	</select>

传递对象

int getSt(@Param("stu")Student stu,@Param("user")User user);

image-20210902172603557

传递Map

int getSt2(Map map);
	<select id="getSt2" resultType="int">
		SELECT * FROM student WHERE age=#{age} AND name=#{name}
	</select>
hashMap.put("name", "test");
hashMap.put("age", 12);

mapper.getSt2(hashMap);
//关闭sqlSession
sqlSession.close();

通过map传递 通过key取值

int getSt(@Param("stu")Student stu,@Param("user")User user);

[外链图片转存中…(img-Px0fICkC-1631707039749)]

传递Map

int getSt2(Map map);
	<select id="getSt2" resultType="int">
		SELECT * FROM student WHERE age=#{age} AND name=#{name}
	</select>
hashMap.put("name", "test");
hashMap.put("age", 12);

mapper.getSt2(hashMap);
//关闭sqlSession
sqlSession.close();

通过map传递 通过key取值

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值