01 初始MyBatis
mybatis
-
MyBatis 是支持定制化 SQL、存储过程以及高级映射的优秀的持久层框架。
-
MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。
-
MyBatis可以使用简单的XML或注解用于配置和原始映射,将接口和Java的POJO(Plain Old Java Objects,普通的Java对象)映射成数据库中的记录.
-
myBatis是一个半自动化的持久化层框架。
JDBC
– SQL夹在Java代码块里,耦合度高导致硬编码内伤
– 维护不易且实际开发需求中sql是有变化,频繁修改的情况多见 -
Hibernate和JPA
– 长难复杂SQL,对于Hibernate而言处理也不容易
– 内部自动生产的SQL,不容易做特殊优化。
– 基于全映射的全自动框架,大量字段的POJO进行部分映射时比较困难。导致数据库性能下降。 -
对开发人员而言,核心sql还是需要自己优化
-
sql和java编码分开,功能边界清晰,一个专注业务、一个专注数据。
https://github.com/mybatis/mybatis-3/
试试mybatis
创建一张测试表 Employee
– 创建对应的javaBean
– 创建mybatis配置文件,sql映射文件
– 测试
MyBatis操作数据库
-
创建MyBatis全局配置文件
– MyBatis 的全局配置文件包含了影响 MyBatis 行为甚深的设置(settings)和属性(properties)信息、如数据库连接池信息等。指导着MyBatis进行工作。我们可以参照官方文件的配置示例。 -
创建SQL映射文件
– 映射文件的作用就相当于是定义Dao接口的实现类如何工作。这也是我们使用MyBatis时编写的最多的文件。 -
导入log4j日志包之后还需要log4.xml和 全局配置文件放在resouces目录下
MyBatis全局配置文件 mybatis-config.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>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mybatis"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="EmployeeMapper.xml"/>
</mappers>
</configuration>
lo4j.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/xml/doc-files/log4j.dtd">
<log4j:configuration debug="true">
<appender name="STDOUT" class="org.apache.log4j.ConsoleAppender">
<param name="Encoding" value="UTF-8" />
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%-5p %d{MM-dd HH:mm:ss,SSS} %m (%F:%L) \n" />
</layout>
</appender>
<logger name="java.sql">
<level value="debug" />
</logger>
<logger name="org.apache.ibatis">
<level value="info" />
</logger>
<root>
<level value="debug" />
<appender-ref ref="STDOUT" />
</root>
</log4j:configuration>
SQL映射文件 EmployeeMapper.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">
<mapper namespace="com.atgui.mybatis.EmployeeMapper">
<!--
namespace:名称空间;指定为接口的全类名
id:唯一标识
resultType:返回值类型
#{id}:从传递过来的参数中取出id
-->
<select id="selectEmp" resultType="com.atgui.mybatis.bean.Employee">
select id,last_name lastName,email,gender from tbl_employee where id = #{id}
</select>
</mapper>
测试
@Test
public void test() throws IOException {
//根据全局配置文件,利用SqlSessionFactoryBuilder创建SqlSessionFactory
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//2. 获取 SqlSession 实例,能直接执行已经映射的sql语句 一个SqlSession对象代表和数据库的一次会话。
SqlSession openSession = sqlSessionFactory.openSession();
try {
//使用SqlSession根据方法id进行操作
Employee employee = openSession.selectOne("com.atgui.mybatis.EmployeeMapper.selectEmp", 1);
System.out.println(employee);
} finally {
openSession.clearCache();
}
}
接口式编程
– 创建一个Dao接口
– 修改Mapper文件
– 测试
public interface EmployeeMapper {
public Employee getEmpById(Integer id);
}
修改Mapper文件
<?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 namespace="com.atgui.mybatis.dao.EmployeeMapper">
<!--
namespace:名称空间;指定为接口的全类名
id:唯一标识
resultType:返回值类型
#{id}:从传递过来的参数中取出id
public Employee getEmpById(Integer id);
-->
<select id="getEmpById" resultType="com.atgui.mybatis.bean.Employee">
select id,last_name lastName,email,gender from tbl_employee where id = #{id}
</select>
</mapper>
@Test
public void test01() throws IOException {
//1.获取到 SqlSessionFactory 对象
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//2.获取 sqlSession 对象
SqlSession openSession = sqlSessionFactory.openSession();
try {
//3.获取接口的实现类对象
//会为接口自动的创建一个代理对象,代理对象去执行增删改查方法
EmployeeMapper mapper = openSession.getMapper(EmployeeMapper.class);
Employee employee = mapper.getEmpById(1);
System.out.println(employee);
} finally {
openSession.close();
}
/* 1.根据 xml 配置文件(全局配置文件) 创建一个SqlSession对象
* 有数据源一些运行环境信息
* 2.sql 映射文件,配置了每一个sql,以及sql的封装规则等
* 3.将sql映射文件注册在全配置文件中
*4.写代码:
* 1)、根据全局配置文件得到 SqlSessionFactory
* 2)、使用SqlSession 工厂 ,获取到使用SqlSession对象使用他来执行增删改查
* 3)、使用sql的唯一标识来告诉MyBatis执行哪个sql,sql都是保存在sql映射文件中的
* 将接口和xml进行绑定
* EmployeeMapper mapper = sqlSession.getMapper(EmployeeMapper.class);
*5.两个重要的配置文件:
* mybatis 的全局配置文件,包含数据库连接池信息,事务管理器信息等。。。系统运行环境信息
sql 映射文件,保存了每一个sql语句的映射信息
*/
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)