Mybatis学习笔记
Posted Vodka~
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Mybatis学习笔记相关的知识,希望对你有一定的参考价值。
1.持久化:
*持久化就是将程序的数据在持久状态和瞬时状态转化的过程。
*内存(某些):断电即失
*数据库(jdbc),io文件持久化
*生活:冷藏食物
2.持久化的原因:
*有些对象,不能丢失
*内存珍贵
3.持久层:
*Data access object层, service层,controller层。。。
特点:*完成持久化工作的代码块
*层界限十分明显
4.为什么需要Mybatis?
*将数据存入到数据库中。
*方便,简化了传统jdbc代码,框架,自动化。
*不用mybatis也可以,技术没有高低之分。
优点:
*灵活,sql语句和代码分离,提高了可维护性。
*提供映射标签,支持对象与数据库的orm字段关系映射。
*提供对象关系映射标签,支持对象关系组件维护
*提供xml标签,支持编写动态sql。
5.Mybatis程序:
- 创建数据库表时数据存储引擎 engine两种:engine=innodb和engine=myisam。
一, myisam是isam的新版本,默认类型。是存储记录和文件的标准类型,支持全文搜索,可以被压缩,与其他引擎相比,有检查和修复表格 的大部分工具,不支持事务,不支持外键。强调的是性能,执行速度比较快,可以在不同的系统中迁移。ISAM是一个数据表格管理方法,它在设计之时就考虑到数据库被查询的次数要远大于更新的次数。因此,ISAM执行读取操作的速度很快,而且不占用大量的内存和存储资源。两个主要不足之处在于,它不支持事务处理,也不能够容错:如果硬盘崩溃了,那么数据文件就无法恢复了。如果你正在把ISAM用在关键任务应用程序里,那就必须经常备份你所有的实时数据,通过其复制特性,mysql能够支持这样的备份应用程序
二,innodb,支持事务处理等高级处理,命令执行错误时,可以回滚数据,支持外键,如果执行大量的select和update语句,出于性能考虑,使用innodb是最好的选择。
三,修改表的引擎类型:ALTER TABLE tablename ENGINE = MyISAM
6.搭建环境:
-创建数据库,表,并输入数据
-新建项目:
-新建一个普通的maven项目
-删除掉父工程的src目录,子工程里面再创建新的src目录
-导入maven依赖
<!--导入依赖-->
<dependencies>
<!-- mysql驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.25</version>
</dependency>
<!-- mybatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.7</version>
</dependency>
<!-- junit -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
</dependencies>
-创建一个模块:
1.编写mybatis的核心配置文件(去官网找):XML 配置文件中包含了对 MyBatis 系统的核心设置,包括获取数据库连接实例的数据源
(DataSource)以及决定事务作用域和控制方式的事务管理器(TransactionManager)。
2.编写mybatis工具类
3.实体类
4.Dao接口
5.接口实现类
<?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.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/databaseName?useSSL=true&useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC"/>
<property name="username" value="vodka"/>
<property name="password" value="xxxxxx"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="org/mybatis/example/BlogMapper.xml"/>
</mappers>
</configuration>
//utils.MybatisUtil
package vodka.utils;
import jdk.internal.loader.Resource;
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 java.io.IOException;
import java.io.InputStream;
/**
* @author Vodka
* @date 2021/08//17:27
*/
public class MybatisUtils
private static SqlSessionFactory ssf; //定义全局工厂变量
//SqlSessionFactory --> SqlSession ,该工厂对象只创建一次就就够了,所以用static
static
try
//使用配置好的Mybatis文件获取SqlSessionFactory对象
String resource = "mybatis-config-xml.tld";
InputStream is = Resources.getResourceAsStream(resource);
ssf = new SqlSessionFactoryBuilder().build(is);
catch (Exception e)
e.printStackTrace();
//有了SqlSessionFactory之后,就可以创建SqlSession实例,该实例包含了所有面向数据库执行sql命令的方法
private static SqlSession HaveSqlSession()
return ssf.openSession();
//entity.UserInfo
package vodka.entity;
/**
* @author Vodka
* @date 2021/08//17:47
*/
public class UserInfo
private String UserName;
private String UserAge;
private String Password;
private String UserAccount;
public String getUserName()
return UserName;
public void setUserName(String userName)
UserName = userName;
public String getUserAge()
return UserAge;
public void setUserAge(String userAge)
UserAge = userAge;
public String getPassword()
return Password;
public void setPassword(String password)
Password = password;
public String getUserAccount()
return UserAccount;
public void setUserAccount(String userAccount)
UserAccount = userAccount;
@Override
public String toString()
return "UserInfo" +
"UserName='" + UserName + '\\'' +
", UserAge='" + UserAge + '\\'' +
", Password='" + Password + '\\'' +
", UserAccount='" + UserAccount + '\\'' +
'';
//Dao接口
public interface UserMapper
//接口包含各种数据库相应操作的方法
List<UserInfo> getUserlist();
//由原来的接口实现类,变为Mapper配置文件
<?xml version="1.0" encoding="UTF8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--namespace=绑定一个对应的Dao/Mapper接口-->
<mapper namespace="vodka.mapper.UserMapper">
<!-- id指向Dao接口相应的方法,并且在这里重写 -->
<select id="getUserList" resultType="vodka.entity.UserInfo">
select * from Userinfo
</select>
</mapper>
!!!!!!注意点:
一. maven由于约定大于配置,当自己写配置文件时,会遇到无法被导出或生效的问题(因为maven只会执行src/main/java/中的java代码,而xml等资源只会在resoures目录下找,这时就需要自行配置),解决方案,在pom配置文件中添加代码:
<build>
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.xml</include>
<include>**/*.properties</include>
</includes>
<filtering>true</filtering>
</resource>
</resources>
</build>
二:org.apache.ibatis.binding.BindingException: Type interface vodka.mapper.UserMapper is not known to the MapperRegistry.
解决方案:
在mybatis-config.xml文件加相应的映射文件路径
<!-- 三种映射方式:
1.<mapper resource="com/xxx/mapper/UserMapper.xml"/>
2.<mapper class="com.xxx.mapper.UserMapper.xml"/>
-->
<!-- 3.自动扫描包内的Mapper接口与配置文件 -->
<package name="com.xxx.mapper"/>
//UserMapperTest.java
public void test()
try
//从SqlSessionFactory中获取数据库的Session连接
ss = MybatisUtils.HaveSqlSession();
// 方式一:getMapper
UserMapper UM = ss.getMapper(UserMapper.class);
List<UserInfo> UI = UM.getUserlist();
for(UserInfo item: UI)
System.out.println(item);
catch (Exception e)
e.printStackTrace();
finally
// 用完关闭
ss.close();
三:方法名不对,接口名不对应,返回类型不对
!!!!关于遇到Cause: org.xml.sax.SAXParseException; lineNumber: 6; columnNumber: 5; 1 字节的 UTF-8 序列的字节 1 无效。的问题
解决方案:在实现接口类的Mapper.xml文件中,把下面这个改一改
<?xml version="1.0" encoding="UTF-8"?>
改为:
<?xml version="1.0" encoding="UTF8"?>
7.CRUD:
*namespace:
-namespace中的包名要与Dao/mapper接口的包名一致
*select:
-选择查询语句:
id: 就是对应命名空间(Dao接口实现类,或者说mapper) 中相应的方法名
resultType: Sql语句执行的返回值
parameter:Dao方法的参数类型
<--!UserMapper.xml -->
<?xml version="1.0" encoding="UTF8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="vodka.mapper.UserMapper">
<!-- 查询全部用户-->
<select id="getUserList" resultType="vodka.entity.UserInfo">
select * from userinfo;
</select>
<!-- 根据账号查询一个用户-->
<select id="getOneUser" parameterType="string" resultType="vodka.entity.UserInfo">
select * from userinfo
where userAccount = #id;
</select>
<!-- 添加用户-->
<insert id="AddUserInfo" parameterType="vodka.entity.UserInfo">
insert into userinfo (UserAccount,UserName,UserAge,UserPassword)values(#UserAccount,#UserName,#UserAge,#UserPassword);
</insert>
<!-- 删除用户-->
<delete id="DeleteUserInfo" parameterType="string">
delete from userinfo where
UserAccount = #Account;
</delete>
<!-- 修改用户信息-->
<update id="UpdateUserInfo" parameterType="vodka.entity.UserInfo">
update userinfo
set UserAge = UserAge + #UserAge,UserName = #UserName,UserPassword = #UserPassword
where UserAccount = #UserAccount
</update>
</mapper>
//UserDao interface
public interface UserMapper
//接口包含各种数据库相应操作的方法
// 查询全部用户数据
List<UserInfo> getUserList();
// 根据账号查询用户
UserInfo getOneUser(String id);
// 添加用户
int AddUserInfo(UserInfo user);
// 删除用户
int DeleteUserInfo(String Account);
// 修改用户
int UpdateUserInfo(UserInfo UI);
public class UserMapperTest
//从SqlSessionFactory中获取数据库的Session连接
SqlSession ss = MybatisUtils.HaveSqlSession();
@Test
public void test()
try
// 方式一:getMapper
UserMapper UM = ss.getMapper(UserMapper.class);
// 测试获取全部用户的数据
List<UserInfo> UI = UM.getUserList();
for(UserInfo item: UI)
System.out.println(item);
catch (Exception e)
e.printStackTrace();
@Test
public void getUserByAccount()
UserMapper UM = ss.getMapper(UserMapper.class);
// 测试获取单个用户数据
UserInfo oneUser = UM.getOneUser("458");
System.out.println("单个用户数据: " + oneUser);
ss.close();
@Test
public void TestAdd()
UserMapper UM = ss.getMapper(UserMapper.class);
int res = UM.AddUserInfo(new UserInfo("4697","李袁冲",29,"1579645"));
if(res > 0)
System.out.println("用户信息插入成功");
ss.commit(); //插入成功后,提交到数据库管理系统
ss.close();
// 测试修改用户信息
@Test
public void TestUpdate()
UserMapper UM = ss.getMapper(UserMapper.class);
int res = UM.UpdateUserInfo(new UserInfo("4697","李袁冲",1,"1579645"));
if(res > 0)
System.out.println("用户信息修改成功");
ss.commit(); //修改成功后,提交到数据库管理系统
ss.close();
// 测试删除用户信息
@Test
public void TestDelete()
UserMapper UM = ss.getMapper(UserMapper.class);
int res = UM.DeleteUserInfo("546");
if(res > 0)
System.out.println("用户信息删除成功");
ss.commit(); //删除成功后,提交到数据库管理系统
ss.close();
以上是关于Mybatis学习笔记的主要内容,如果未能解决你的问题,请参考以下文章