MyBatis_Day02
第一节、什么是MyBatis
myBatis是一个优秀的持久层框架,在操作数据库是几乎避免了所有的JDBC代码。我们操作数据库时通过对象操作(ORM框架),支持自定的SQL语句(半自动的ORM框架)。
第二节、三层模型(MVC模型)
注意:每一层代码应该严格分离
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;
编写对实体类对象操作的接口
//编写数据库操作的接口
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 标记在静态方法上
注意:如果想要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基本的执行流程
第四节、MyBatis的配置
MyBatis 的配置文件包含了会深深影响 MyBatis 行为
environments环境配置
MyBatis 可以配置成适应多种环境,不过要记住:尽管可以配置多个环境,但每个 SqlSessionFactory 实例只能选择一种环境。
在使用时通过environments default属性的与每一个不同environment中id属性进行匹配。
事务管理器(transactionManager)
在 MyBatis 中有两种类型的事务管理器(也就是 type="[JDBC|MANAGED]"):
- JDBC – 这个配置直接使用了 JDBC 的提交和回滚设施,它依赖从数据源获得的连接来管理事务作用域。( 最常用用)
- MANAGED – 这个配置几乎没做什么。
数据源(dataSource)
什么是数据源:其实可以理解为数据的源头,在这里的其实就是数据库的连接。
配置数据源的类型其实就是配置数据库连接的管理方式。
1.UNPOOLED 采用非数据库连接池的模型。每次操作数据库时都会去打开和关闭数据库连接。这种方式对于小的应用或者对数据库操作不频繁的程序比较。但是对于数据库频繁操作的程序不是一个好的选择
2.POOLED这种数据源的实现利用“池”的概念将 JDBC 连接对象组织起来,避免了创建新的连接实例时所必需的初始化和认证时间。 这种处理方式很流行,能使并发 Web 应用快速响应请求。
映射器(mappers)
作用:告诉myBatis去哪里读取SQL语句的映射(告诉myBatis去哪里读取mapper文件)
方式一、
直接告诉myBatis资源路径(注意:资源路径分隔符是/)
扫描XML文件
<mappers>
<mapper resource="com/wnxy/dao/UserMapper.xml"/>
<mapper resource="com/wnxy/dao/StudentMapper.xml"/>
</mappers>
方式二、
扫描Mapper接口
<mapper class="com.wnxy.dao.UserMapper"/>
<mapper class="com.wnxy.dao.StudentMapper"/>
方式三、
扫描包
<!-- 扫描包
通过package标签直接配置包名
-->
<package name="com.wnxy.dao"/>
类型别名(typeAliases)
注意:全局配置文件中每一个配置项之间是有顺序
作用:对JAVA类型起别名,可以降低冗余的全类名的写法,我们如果取了别名,以前使用全限定名的地方直接可以用别名
注意:如果用上述方式取别名,则应该对每一个类取别名。
属性(properties)
作用:读取外部properties文件
<!-- 引入外部的properties配置信息 默认都是去src类路径-->
<properties resource="db.properties"></properties>
#配置的是一对键值对
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/test63_3
uname=root
pass=123456
设置(settings)
是MyBatis中极为重要的一个设置项,它们会改变 MyBatis 的运行时行为
注意:每一个设置项
第五节、MyBatis日志
作用:生活中的日志是记录你生活的点点滴滴,让它把你内心的世界表露出来,更好的诠释自己的内心世界。
编程中日志:记录程序运行的状态
在MyBatis中开启框架自带日志:
<settings>
<!-- 开启日志 -->
<setting name="logImpl" value="STDOUT_LOGGING"/>
</settings>
开启LOG4J的日志
1、引入LOG4J的JAR包
log4j-1.2.14.jar
2、通过Settings中setting进行开启
<setting name="logImpl" value="LOG4J"/>
3、引入log4j的配置(放SRC下)
第六节、参数传递的问题
单参数:
Student getStudentById(int id);
多参传递
匿名传递
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);
传递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取值