目录
如何获取mybatis?
maven仓库【这是使用maven的方式】
<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.6</version>
</dependency>
这是github上面的仓库地址:
github:https://github.com/mybatis/mybatis-3/releases?after=mybatis-3.4.4
maven仓库的地址
https://mvnrepository.com/artifact/org.mybatis/mybatis
什么叫持久层,就是就是把数据保存到数据库的那一层
-
数据持久化
-
持久化就是程序数据在持久状态和瞬间状态转化的过程
-
内存:断电即失
-
数据库,io文件持久化
为什么要持久化?
- 有一些对象,不能让它丢掉
- 内存太贵了,存在内存里面浪费
持久层?
-
就是完成持久化工作的代码块
-
层界限非常明显
为什么需要mybaits?
- 帮助程序员把数据存进数据库
- 方便
- 传统的jdbc太复杂了,简化。框架。自动化
- 学了mybatis也可以。更容易上手,技术没有高低之分
优点:
- 使用的人多
- 简单易学
- sql和代码分离
- 提供xml标签
- 还需要学习spring,sprigmvc,springboot
第一个mybatis程序
思路:搭建环境 --》导入mybatis–》编写代码–》测试
2.1 搭建环境
- 搭建数据库
2.2 新建一个项目
- 新建一个maven项目
- 删除src目录
- 导入maven依赖
创建一个模块
- 编写mybatis的核心配置文件(连接数据库的配置文件)
<?xml version="1.0" encoding="UTF8" ?>
<!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?useSSl=true&useUnicode=true&characterEncoding=UTF-8"/>
<property name="username" value="root"/>
<property name="password" value="abcde"/>
</dataSource>
</environment>
</environments>
<!--注册 定义sql映射语句-->
<!-- <mappers>-->
<!-- <mapper resource="com/quan/dao/UserMapper.xml"/>-->
<!-- </mappers>-->
<!--这是包扫描的方式去找mapper -->
<mappers>
<package name="com.quan.dao"/>
</mappers>
</configuration>
2,编写mybatis工具类(建立一个工厂,然后工厂生成SqlSession 实例来直接执行已映射的 SQL 语句)
这是一个工具类,就是建立工厂,然后getsqlsession得到实例,也就是得到一个顾客,顾客可以实现sql语句。
package com.quan.utils;
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;
//第三步就是配置工具类,获取能解析sql语句的sqlSession对象,然后这个对象是存放在sqlSessionFactory工厂里面的
//sqlSessionFactory--->>sqlSession
public class mybatisUtils {
private static SqlSessionFactory sqlSessionFactory;
//静态代码块,也就是不能修改的,存进房子里面的
static {
try {
//第一步
// 获取sqlSessionFactory对象 使用mybatis第一步
//获取连接数据库的配置文件
String resource = "mybatis-config.xml";
//把数据库配置信息放进输入流
InputStream inputStream = Resources.getResourceAsStream(resource);
//然后工厂建造者Builder根据输入流的数据库信息建立一个数据库工厂
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession sqlSession = sqlSessionFactory.openSession();
} catch (IOException e) {
e.printStackTrace();
}
}
// 从 SqlSessionFactory 中获取 SqlSession 也就是工人
// 既然有了 SqlSessionFactory,顾名思义,我们可以从中获得 SqlSession 的实例。
// SqlSession 提供了在数据库执行 SQL 命令所需的所有方法。你可以通过 SqlSession 实例来直接执行已映射的 SQL 语句。例如:
public static SqlSession getSqlSession() {
//有了数据库工厂,就要找工人,sqlSession就是工人
return sqlSessionFactory.openSession();
}
}
3、编写代码
-
实体类
-
dao接口 / mapper接口 (我们要实现的接口方法,会存放在这个mapper里面)
package com.quan.dao;
import com.quan.pojo.User;
import java.util.List;
import java.util.Map;
public interface UserMapper {
//查询所有用户
List<User> getUserList();
//根据id查询用户
User getUserById(int id);
//添加一个用户
int addUser(User user);
//修改用户
int updateUser(User user);
//根据id刪除用戶
int deleteUser(int id);
//使用万能的map插入一个用户
int addUser2(Map<String, Object> map);
//模糊查询
List<User> getUserLike(String s);
}
接口实现类
由原来的UserDaoImpl转变为一个Mapper配置文件。
这个配置文件就是实现接口的方法,由类变成了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">
<!-- 命名空间 绑定对应的Dao/Mapper接口 -->
<mapper namespace="com.quan.dao.UserMapper">
<!-- 插入-->
<insert id="addUser" parameterType="com.quan.pojo.User">
insert into mybatis.user(id, name, pwd)
values (#{id}, #{name}, #{pwd});
</insert>
<!-- 使用万能的map方法进行插入数据-->
<insert id="addUser2" parameterType="map">
insert into mybatis.user(id, name, pwd)
values (#{id}, #{name}, #{pwd});
</insert>
<!-- 更新-->
<update id="updateUser" parameterType="com.quan.pojo.User">
update mybatis.user
set name=#{name},
pwd=#{pwd}
where id = #{id};
</update>
<!--删除-->
<delete id="deleteUser" parameterType="int">
delete
from mybatis.user
where id = #{id}
</delete>
<!-- 查询所有-->
<select id="getUserList" resultType="com.quan.pojo.User">
select *
from mybatis.user
</select>
<!--根据id查询-->
<select id="getUserById" resultType="com.quan.pojo.User">
select *
from mybatis.user
where id = #{id}
</select>
<!-- 模糊查詢-->
<select id="getUserLike" resultType="com.quan.pojo.User">
select *
from mybatis.user
where name like #{value}
</select>
</mapper>
4、测试
(测试先得到getsqlsession,也就是在工厂里面得到一个实例,通过这个实例去得到我们的mapper,去实现已经映射的sql语句,用完这个实例后,要进行关闭)
package com.quan.dao;
import com.quan.pojo.User;
import com.quan.utils.mybatisUtils;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;
import java.util.HashMap;
import java.util.List;
public class UserDaoTest {
@Test
public void test() {
//1获得sqlSession对象 得到一个工人
SqlSession sqlsession = mybatisUtils.getSqlSession();
// 方式1:执行sql
UserMapper mapper = sqlsession.getMapper(UserMapper.class);
List<User> userList = mapper.getUserList();
for (User user : userList) {
System.out.println(user);
}
// 关闭sqlSession
sqlsession.close();
}
//根据id获取信息
@Test
public void test1() {
//1获得sqlSession对象
SqlSession sqlsession = mybatisUtils.getSqlSession();
// 方式1:执行sql
UserMapper mapper = sqlsession.getMapper(UserMapper.class);
User userById = mapper.getUserById(1);
System.out.println(userById);
// 关闭sqlSession
sqlsession.close();
}
@Test
//插入数据
public void testAdd() {
SqlSession sqlSession = mybatisUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
int addUser = mapper.addUser(new User(10, "tom", "124"));
System.out.println("改变" + addUser);
//提交事务 (这很重要,不能遗漏)
sqlSession.commit();
sqlSession.close();
}
@Test
//更新数据
public void updateUser() {
SqlSession sqlSession = mybatisUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
int updateUser = mapper.updateUser(new User(3, "靓仔", "14541561156"));
System.out.println("修改" + updateUser + "条数据");
sqlSession.commit();
sqlSession.close();
}
@Test
//刪除用戶
public void deleteUser() {
SqlSession sqlSession = mybatisUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
int deleteUser = mapper.deleteUser(1);
System.out.println("deleteUser" + deleteUser + "个");
sqlSession.commit();
sqlSession.close();
}
@Test
//使用万能map方法进行插入数据
public void addUser2() {
SqlSession sqlSession = mybatisUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
HashMap<String, Object> map = new HashMap<>();
map.put("id", 6);
map.put("name", "hello");
map.put("pwd", "24321");
mapper.addUser2(map);
sqlSession.commit();
sqlSession.close();
}
@Test
//模糊查詢
public void getUserLike() {
SqlSession sqlSession = mybatisUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
List<User> userLike = mapper.getUserLike("%l%");
for (User user : userLike) {
System.out.println(user);
}
sqlSession.commit();
sqlSession.close();
}
}
可能会遇到的问题:
- 配置文件没有注册
- 绑定接口错误
- 方法名不对
- 返回类型不对
- maven导出资源问题【就要静态资源】
报错大部分是这两个错误:
1、xml文件放在src路径下,无法识别。pom.xml添加:
<!--静态资源导出问题-->
<build>
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>false</filtering>
</resource>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>false</filtering>
</resource>
</resources>
</build>
或者映射路径,在核心配置文件xml中添加指向xml所在位置,注意斜杠不要写成点. 搞半天才发现的!!
//注册 在mybatis里面注册
<mappers>
<mapper resource="com/meng/dao/UserMapper.xml"/>
</mappers>
我就是报这个错误,这个是数据库不支持安全链接,mysql8.0要设置为ture,我是mysql5.17设置为false
环境搭建顺序:
写完这个程序后,其他文件基本不用改了,只需要修改usermapper类,usermapper.xml文件和测试类。
例如:增删改操作,需要修改的只有mapper文件和mapper.xml文件
分析错误
标签不要匹配错
<mapper resource="com/quan/dao/UserMapper.xml"/>绑定mapper需要使用路径 后期可以使用包扫描的方式注册
配置文件必须符合规范
空指针异常
输出的xml文件中存在乱码问题
资源导出问题