mybatis学习第一天【跟着狂神说学习】
mybatis 9.28
一、环境配置
1、JDK 1.8
2、Mysql 5.7
3、maven 3.6.3
4、IDEA
二、回顾知识点:
1、JDBC
2、mysql
3、java基础
4、maven
5、junit
三、框架
配置文件,最好的方式,看官网文档
1、什么是mybatis
2、如何获得mybatis
2.1、maven仓库
2.2、github:https://github.com/mybatis/mybatis-3/releases
2.3、中文文档地址:https://mybatis.org/mybatis-3/zh/index.html
3、持久化
3.1数据持久化
- 持久化就是将程序r数据在持久状态和瞬时状态转化的过程
- 内存:断电即失
- 数据库(jdbc),IO文件持久化
- 生活中:冷藏食物
3.2 为什么要持久化?
- 有一些对象,不能让他丢掉
- 内存太贵了
3.3 持久层
- Dao 层、Service层、Controller层
- 完成对持久化工作的代码块
- 层界限十分明显
3.4 为什么需要mybatis
- 帮助程序员将数据存入到数据库中
- 方便
- 传统的JDBC代码太复杂了,简化代码,自动化
- 不用mybatis也可以的,更容易上手,技术没有高低之分
- 优点:简单易学\灵活、解除sql与程序代码的耦合、提供映射标签、提供xml标签,支持编写动态sql,最重要是使用的人多
3.5 第一个mybatis程序
1、创建一个数据库,并创建一个表,和写入几笔测试数据
CREATE DATABASE `mybatis`; use `mybatis`; create table `user`( `id` int(20) not null AUTO_INCREMENT PRIMARY KEY, `name` VARCHAR(255) DEFAULT null , `pwd` varchar(255) DEFAULT null )ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic; insert into `user`(name,pwd) VALUES ('张三','123456'), ('李四','123456'), ('王五','123456'), ('马六','123456');
2、创建一个普通的maven项目
3、删除src目录
4、导入maven依赖
<dependencies> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.21</version> </dependency> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.5.5</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.13</version> </dependency> </dependencies>
5、创建一个模块
编写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.cj.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="123456"/> </dataSource> </environment> </environments> <mappers> <mapper resource="com/fengfang/dao/IUserDao.xml"></mapper> #这部分一会再说明 </mappers> </configuration>
编写mybatis的工具类MybatisUtils.class
package com.fengfang.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.InputStream; /** * TODO * * @author liuxh * @date 2020/7/29 16:45 **/ //SqlSessionFactoy public class MybatisUtils { private static SqlSessionFactory factory; static { try{ //使用mybatis第一步获取SqlSessionFactory对象 String resource = "mybatis-config.xml"; InputStream stream = Resources.getResourceAsStream(resource); factory = new SqlSessionFactoryBuilder().build(stream); }catch (Exception e){ e.printStackTrace(); } } /** * 获取 一个SqlSession对象 * @return */ public static SqlSession getSqlSession(){ return factory.openSession(); } }
编写实体类
package com.fengfang.domain; import java.io.Serializable; /** * TODO * * @author liuxh * @date 2020/7/29 16:55 **/ public class User implements Serializable { private Integer id; private String name; private String pwd; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPwd() { return pwd; } public void setPwd(String pwd) { this.pwd = pwd; } @Override public String toString() { return "User{" + "id=" + id + ", name='" + name + '\'' + ", pwd='" + pwd + '\'' + '}'; } }
编写dao层操作类
package com.fengfang.dao; import com.fengfang.domain.User; import java.util.List; /** * TODO * * @author liuxh * @date 2020/7/29 16:57 **/ public interface IUserDao { /** * 查询所有用户数据 * @return */ List<User> findAll(); }
编写与dao层相对应的配置文件,IUserDao.xml,这个文件是放在src/resources/com/fengfang/dao/IUserDao.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.fengfang.dao.IUserDao"> <select id="findAll" resultType="com.fengfang.domain.User"> select * from user </select> </mapper>
将这个配置文件加入到mybatis-config.xml配置文件中,即下面这一段
<mappers> <mapper resource="com/fengfang/dao/IUserDao.xml"></mapper> </mappers>
编写测试代码来测试
package com.fengfang.test; import com.fengfang.dao.IUserDao; import com.fengfang.domain.User; import com.fengfang.utils.MybatisUtils; import org.apache.ibatis.session.SqlSession; import org.junit.Test; import java.util.List; /** * TODO * * @author liuxh * @date 2020/7/29 17:07 **/ public class MybatisTest1 { @Test public void testFindAll(){ SqlSession session = MybatisUtils.getSqlSession(); IUserDao dao = (IUserDao) session.getMapper(IUserDao.class); List<User> userList = dao.findAll(); for(User user :userList){ System.out.println(user); } session.close(); } }
运行测试类是可以成功的,如下图

可能的问题:
1、若这个文件,不是放在resources文件夹下,那需在pom.xml中添加以下代码
<!-- 在build中配置resources,来防止我们资源导出失败的问题-->
<build>
<resources>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>true</filtering>
</resource>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>true</filtering>
</resource>
</resources>
</build>
2、绑定接口错误
3、方法名错误
4、返回类型错误,即resultType 没有设置
5、配置文件没有注册,即没有在mybatis-config.xml中配置mapper
3.6、CRUD
1、namespace
namespace 中的包名要和Dao/IUserDao接口的包名一致
2、select
选择:查询语句
id:就是对应namespace中的方法名
resultType:Sql语句的返回值类型,class
parameteType:参数类型
编写接口
在mapper.xml编写SQL ,注意Id要和方法名相同,命名空间要和dao中类命名空间相同
测试接口,对于insert\update\delete需提交事务
在mybatis的mapper.xml文档中,遇到一个坑:在里面有中文注释会出错,这个后续要多注意,即以下这样,程序会报错,原因是这个配置文件不是utf-8格式的,需将这个配置文件更改为urf-8格式,然后在idea的setting->editor->file encoding中全部设置为utf-8,如下图2


3、insert
在实体类中,若表字段过多,而很多字段又可以为空,我们可以考虑使用Map,参照项目IUserDao类中的addUserMap方法
void addUserMap(Map<String,Object> map);
在mapper.xml的方法定义为这样:
<!--对象中的属性,可以直接取出来 传递Map的key 假设实体类 --> <insert id="addUserMap" parameterType="map"> insert into user(name,pwd)values(#{userName},#{userPwd}) </insert>
4、update
5、delete
6、模糊查询
List<User> getUserLike(String value);
<!-- 对于通配符,需在SQL文件中写在里面不建议当参数传入进来--> <select id="getUserLike" resultType="com.fengfang.domain.User" > select * from user where name like "%"#{value}"%" </select>
@Test public void testGetUserLike(){ SqlSession session = MybatisUtils.getSqlSession(); IUserDao userDao = session.getMapper(IUserDao.class); List<User> users = userDao.getUserLike("测试"); for (User user : users) { System.out.println(user); } session.close(); }

浙公网安备 33010602011771号