初始Mybatis框架
Posted 一宿君
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了初始Mybatis框架相关的知识,希望对你有一定的参考价值。
学习目标
- 理解数据持久化概念和ORM原理
- 理解MyBatis的概念一级有点特性
- 搭建MyBatis环境
- 了解MyBatis与JDBC的区别与联系
- 理解核心类的作用域和声明周期
- 掌握全局配置文件结构内容
框架技术
- 是一个应用程序的半成品
- 提供可重用的公共结构
- 按一定规则组织的一组组件
分析优势
- 不用考虑公共问题
- 专心在业务层实现
- 结构统一,易用学习、维护
Spring
- 依赖注入容器/AOP实现
- 声明式事务
- 简化JavaEE应用
- 粘合剂,将大家组装到一起
Spring MVC
- 结构最清晰的MVC Model2实现
- 高度可配置,支持多种视图技术
- 定制化开发
MyBatis
- 半自动化的ORM实现
- DAO层
- 动态SQL
- 小巧灵活、简单易学
1 持久化与ORM
- 持久化就是数据在瞬时状态和持久化状态间转换的过程。
- ORM(Object Relational Mapping)
- 编写程序的时候,以面向对象的方式处理数据
- 保存数据的时候,却以关系型数据库的方式存储
- ORM解决方案包含下面四个部分
- 在持久化对象上执行基本的增、删、改、查操作
- 对持久化对象提供一种查询语言或者API
- 对象映射工具
- 提供与事务对象交互、执行检查、延迟加载以及其他优化功能
2 MyBatis简介
-
MyBatis前身是IBatis,本身是Apache的一个开源项目
-
ORM框架
-
实体类和SQL语句之间建立映射关系
-
特点:
- 基于SQL语法,简单易学
- 能了解底层封装过程
- SQL语句封装在配置文件中,便于统一管理与维护,降低程序的耦合度
- 方便程序代码调试
-
MyBatis XML配置文件的结构(configuration配置)
properties(属性)
settings(设置)
typeAliases(类别别名)
typeHandlers(类型处理器)
objectFactory(对象工厂)
plugins(插件)
environments(环境配置)- environment(环境变量)
- transactionManager(事务管理器)
- dataSource(数据源)
databaseIdProvider(数据库厂商标识)
mappers(映射器)
3 使用MyBatis的开发步骤
1.首先创建maven工程,直接在pom文件中导入maven仓库的相关依赖即可,如果是web项目,下载mybatis-3.5.2.jar包导入工程lib文件夹下即可,(此处我们以maven工程为例):
mybatis 3.5.2 maven 仓库
<!--mybatis-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.2</version>
</dependency>
2.1准备数据库连接配置文件,以Oracle为例(database.properties)
driver=oracle.jdbc.driver.OracleDriver
url=jdbc:oracle:thin:localhost:1521:orcl
username=ebuy
password=123456
2.2准备控制台日志配置文件(可在控制台输出打印错误)(log4j.properties)
log4j.rootLogger=DEBUG,CONSOLE
#log4j.rootLogger=ERROR,ROLLING_FILE
log4j.logger.com.ebuy.dao=debug
log4j.logger.com.ibatis=debug
log4j.logger.com.ibatis.common.jdbc.SimpleDataSource=debug
log4j.logger.com.ibatis.common.jdbc.ScriptRunner=debug
log4j.logger.com.ibatis.sqlmap.engine.impl.SqlMapClientDelegate=debug
log4j.logger.java.sql.Connection=debug
log4j.logger.java.sql.Statement=debug
log4j.logger.java.sql.PreparedStatement=debug
log4j.logger.java.sql.ResultSet=debug
######################################################################################
# Console Appender \\u65e5\\u5fd7\\u5728\\u63a7\\u5236\\u8f93\\u51fa\\u914d\\u7f6e
######################################################################################
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.Threshold=error
log4j.appender.CONSOLE.Target=System.out
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern=[%p] %d %c - %m%n
3.编写MyBatis核心配置文件(mybatis-conf.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>
<!--导入数据库连接参数-->
<properties resource="database.properties"/>
<!--此处的优先级高于environments中的配置文件(一般不建议配置在此处)-->
<!--<properties resource="database.properties">
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
</properties>-->
<!--设置MyBatis控制台输出为log4j日志文件-->
<settings>
<setting name="logImpl" value="log4j"/>
</settings>
<!--为实体类设置别名-->
<typeAliases>
<!--也可以指定某个实体类为其设置别名,type为指定类路径,alias为设置的别名-->
<!--这样配置时,user可以用在任何使用com.ebuy.pojo.SystemUser的地方。-->
<!--<typeAlias type="com.ebuy.pojo.SystemUser" alias="user"/>-->
<!--也可以指定一个包名,MyBatis会在包名下面搜索所有需要的JavaBean,默认别名为其类名-->
<package name="com.ebuy.pojo"/>
</typeAliases>
<!--默认加载是Oracle数据库-->
<environments default="oracle">
<environment id="oracle">
<!--事务管理器,使用jdbc操作数据库-->
<transactionManager type="jdbc"/>
<!--允许使用数据库连接池(提高效率)-->
<dataSource type="POOLED">
<!--切记properties中oracle加载驱动字符串中的driver,d是小写-->
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
</dataSource>
</environment>
</environments>
<!--要将SystemUserMapper接口配置文件加入到此处运行环境中-->
<mappers>
<!--<mapper resource="com/ebuy/dao/SystemUserMapper.xml"/>
<mapper resource="com/ebuy/dao/SystemRoleMapper.xml"/>-->
<!--考虑到未来会有很多实体类映射配置文件,所以可以一步到位,直接将所在包引入即可-->
<package name="com.ebuy.dao"/>
</mappers>
</configuration>
4.创建实体类-pojo(注意要实现序列化)
- SystemUser
package com.ebuy.pojo; import java.io.Serializable; /** * 用户实体 */ public class SystemUser implements Serializable { /** * 用户ID */ private String userinfo_uid; /** * 登录名 */ private String userinfo_loginid; /** * 姓名 */ private String userinfo_name; /** * 密码 */ private String userinfo_password; /** * 性别 */ private String userinfo_sex; /** * 电子邮箱 */ private String userinfo_email; /** * 手机 */ private String userinfo_mobile; /** * 用户状态(1 正常 2 锁定 3注销) */ private int userinfo_status; @Override public String toString() { return "SystemUser{" + "userinfo_uid='" + userinfo_uid + '\\'' + ", userinfo_loginid='" + userinfo_loginid + '\\'' + ", userinfo_name='" + userinfo_name + '\\'' + ", userinfo_password='" + userinfo_password + '\\'' + ", userinfo_sex='" + userinfo_sex + '\\'' + ", userinfo_email='" + userinfo_email + '\\'' + ", userinfo_mobile='" + userinfo_mobile + '\\'' + ", userinfo_status=" + userinfo_status + '}'; } public SystemUser() { } public SystemUser(String userinfo_uid, String userinfo_loginid, String userinfo_name, String userinfo_password, String userinfo_sex, String userinfo_email, String userinfo_mobile, int userinfo_status) { this.userinfo_uid = userinfo_uid; this.userinfo_loginid = userinfo_loginid; this.userinfo_name = userinfo_name; this.userinfo_password = userinfo_password; this.userinfo_sex = userinfo_sex; this.userinfo_email = userinfo_email; this.userinfo_mobile = userinfo_mobile; this.userinfo_status = userinfo_status; } public String getUserinfo_uid() { return userinfo_uid; } public void setUserinfo_uid(String userinfo_uid) { this.userinfo_uid = userinfo_uid; } public String getUserinfo_loginid() { return userinfo_loginid; } public void setUserinfo_loginid(String userinfo_loginid) { this.userinfo_loginid = userinfo_loginid; } public String getUserinfo_name() { return userinfo_name; } public void setUserinfo_name(String userinfo_name) { this.userinfo_name = userinfo_name; } public String getUserinfo_password() { return userinfo_password; } public void setUserinfo_password(String userinfo_password) { this.userinfo_password = userinfo_password; } public String getUserinfo_sex() { return userinfo_sex; } public void setUserinfo_sex(String userinfo_sex) { this.userinfo_sex = userinfo_sex; } public String getUserinfo_email() { return userinfo_email; } public void setUserinfo_email(String userinfo_email) { this.userinfo_email = userinfo_email; } public String getUserinfo_mobile() { return userinfo_mobile; } public void setUserinfo_mobile(String userinfo_mobile) { this.userinfo_mobile = userinfo_mobile; } public int getUserinfo_status() { return userinfo_status; } public void setUserinfo_status(int userinfo_status) { this.userinfo_status = userinfo_status; } }
- SystemRole
package com.ebuy.pojo; import java.io.Serializable; /** * 角色实体 */ public class SystemRole implements Serializable { /** * 角色ID */ private String role_id; /** * 角色名称 */ private String role_name; /** * 角色编码 */ private String role_code; /** * 角色描述 */ private String role_description; @Override public String toString() { return "SystemRole{" + "role_id='" + role_id + '\\'' + ", role_name='" + role_name + '\\'' + ", role_code='" + role_code + '\\'' + ", role_description='" + role_description + '\\'' + '}'; } public SystemRole() { } public SystemRole(String role_id, String role_name, String role_code, String role_description) { this.role_id = role_id; this.role_name = role_name; this.role_code = role_code; this.role_description = role_description; } public String getRole_id() { return role_id; } public void setRole_id(String role_id) { this.role_id = role_id; } public String getRole_name() { return role_name; } public void setRole_name(String role_name) { this.role_name = role_name; } public String getRole_code() { return role_code; } public void setRole_code(String role_code) { this.role_code = role_code; } public String getRole_description() { return role_description; } public void setRole_description(String role_description) { this.role_description = role_description; } }
5.DAO层-SQL映射文件(mapper.xml)
- SystemUserMapper.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"> <!--namespace是命名空间,要与对应的接口的路径保持一致(如果没有创建该接口,MyBatis在内部编译时会自动创建)--> <mapper namespace="com.ebuy.dao.SystemUserMapper"> <!--查询数据库中system_userinfo 中数据记录数--> <select id="count" resultType="int"> select count(*) from system_userinfo </select> <!--查询system_userinfo中所有数据--> <select id="selectUserAll" resultType="com.ebuy.pojo.SystemUser"> select * from system_userinfo </select> </mapper>
- SystemRoleMapper.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"> <!--namespace是命名空间,要与对应的接口的路径保持一致(如果没有创建该接口,MyBatis在内部编译时会自动创建)--> <mapper namespace="com.ebuy.dao.SystemRoleMapper"> <!--查询数据库中system_role中数据记录数--> <select id="count" resultType="int"> select count(*) from system_role </select> <!--查询system_role中所有数据--> <select id="selectRoleAll" resultType="SystemRole"> select * from system_role </select> <!--根据role_id查询角色信息(参数是int类型的可以不用写)(一个参数的情况)--> <select id="getRoleById" parameterType="int" resultType="SystemRole"> select * from system_role where role_id = #{roleId} </select> <!--根据role_id和role_name查询角色信息(多个参数的情况,可以在接口中使用注解映射参数的方法)--> <select id="getRoleByIdAndName" resultType="SystemRole"> select * from system_role where role_id = #{roleId} and role_name = #{roleName} </select> <!--根据类对象中的某些参数查询角色信息(这时候参数是类对象,在接口中就不用使用注解映射了)--> <select id="getRoleByObject" parameterType="SystemRole" resultType="SystemRole"> select * from system_role where role_id = #{role_id} and role_name = #{role_name} </select> <!--插入角色数据--> <insert id="save" parameterType="SystemRole"> insert into system_role(role_id,role_name,role_code,role_description) values(SEQ_SYSTEM_ROLE_ID.nextval,#{role_name},#{role_code},#{role_description}) </insert> <!--根据roleId删除角色信息--> <delete id="deleteByRoleId" parameterType="String"> delete from system_role where role_id=#{role_id} </delete> <!--根据roleId更新角色信息--> <update id="updateByRoleId" parameterType="SystemRole"> update system_role set role_name=#{role_name},role_code=#{role_code}, role_description=#{role_description} where role_id=#{role_id} </update> </mapper>
6.创建测试类
- 步骤:
I/O流读取核心配置文件mybatis-conf.xml
创建SQLSessionFactory工厂对象,加载配置文件
创建SQLSession对象
调用mapper文件进行数据操作 - SystemUserMapperTest
package com.ebuy.test; import com.ebuy.dao.SystemUserMapper; import com.ebuy.pojo.SystemUser; import com.ebuy.util.MyBatisUtil; 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.junit.Test; import java.io.IOException; import java.io.InputStream; import java.util.List; /** * @author 一宿君(CSDN : qq_52596258) * @date 2021-06-23 19:30:22 */ public class SystemUserMapperTest { @Test public void count() throws IOException { String resource = "mybatis-conf.xml"; SqlSession sqlSession = null; 使用SSM框架开发企业级应用~Chapter01-初始MyBatis
Spring+SpringMVC+MyBatis+Maven框架整合