01-Mybatis
01-Mybatis
1、Mybatis简介
1.1、什么是Mybatis
- MyBatis 是一款优秀的持久层框架
- 它支持自定义 SQL、存储过程以及高级映射。
- MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。
- MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。
- MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了[google code](https://baike.baidu.com/item/google code/2346604),并且改名为MyBatis 。
- 2013年11月迁移到Github。
如何获取Mybatis?
-
maven仓库
<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis --> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.5.2</version> </dependency>
1.2、持久化
数据持久化
- 持久化就是将程序的数据在持久化状态和瞬间状态转换化的过程
- 内存:断电即失
- 数据库(JDBC)、IO文件持久化
- 生活:冷藏、罐头
为什么需要持久化?
- 有一些对象,不能让他丢失
- 内存太珍贵
1.3、持久层
DAO层、Service层、Controller层
- 完成持久化工作的代码块
- 层界限十分明显
1.4、为什么需要Mybatis?
- 帮助程序员将数据存入到数据库中
- 方便
- 传统的JDBC代码太复杂。简化。框架。自动化
- 不用Mybatis也可以。只不过更容易上手
- 优点
- 简单易学
- 灵活
- sql和代码的分离,提高了可维护性。
- 提供映射标签,支持对象与数据库的orm字段关系映射
- 提供对象关系映射标签,支持对象关系组建维护
- 提供xml标签,支持编写动态sql。
2、第一个Mybatis程序
思路:搭建环境 ---》导入Mybatis -- 》编写代码 --》 测试
2.1、搭建环境
搭建数据库
create databae mybatis charset='utf8';
use mybatis;
create user(
id int primary key auto_increment,
username varchar(32) default null,
password varchar(32) default null
);
insert into user(username,password) values
('jason','123'),
('tank','123'),
('eric','123');
新建项目
-
新建一个普通的Maven项目
-
删除src目录
-
导入maven依赖
<!--导入依赖--> <dependencies> <!--mysql驱动--> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.47</version> </dependency> <!--mybatis--> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.5.2</version> </dependency> <!--junit--> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> </dependency> </dependencies>
2.2、创建一个模块
-
编写Mybatis的核心配置文件
<?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核心配置文件--> <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=true=UTF-8"/> <property name="username" value="root"/> <property name="password" value="123456"/> </dataSource> </environment> </environments> </configuration>
-
编写Mybatis工具类
// SqlSessionFactory -- >sqlSession public class MybatisUtils { private static SqlSessionFactory sqlSessionFactory; static { try{ // 使用Mybatis第一步:获取sqlSessionFactory对象 String resource = "mybatis-config.xml"; InputStream inputStream = Resources.getResourceAsStream(resource); sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); }catch (IOException e){ e.printStackTrace(); } } // 既然有了 SqlSessionFactory,顾名思义,我们可以从中获得 SqlSession 的实例。 // SqlSession 提供了在数据库执行 SQL 命令所需的所有方法 public static SqlSession getSqlSession(){ return sqlSessionFactory.openSession(); } }
2.3、编写代码
-
实体类
package com.kuang.pojo; // 实体类 public class User { private int id; private String username; private String password; public User() { } public User(int id, String username, String password) { this.id = id; this.username = username; this.password = password; } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } @Override public String toString() { return "User{" + "id=" + id + ", username='" + username + '\'' + ", password='" + password + '\'' + '}'; } }
-
Dao接口
public interface UserDao{ List<User> getUserList(); }
-
接口实现类由原来的UserDaoImpl转变成一个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.kuang.dao.UserDao"> <!--select查询语句--> <select id="getUserList" resultType="com.kuang.pojo.User"> select * from mybatis.user </select> </mapper>
2.4、测试
注意点:
org.apache.ibatis.binding.BindingException: Type interface com.kuang.dao.UserDao is not known to the MapperRegistry。
MapperRegistry是什么?
核心配置文件中注册mapper
-
junit测试
@Test public void test(){ // 第一步:获得SqlSession对象 SqlSession sqlSession = MybatisUtils.getSqlSession(); // 方式一:getMapper UserDao userDao = sqlSession.getMapper(UserDao.class); List<User> userList = userDao.getUserList(); // 方式二:过时不用 // List<User> userList = sqlSession.selectList("com.kuang.dao.UserDao.getUserList"); for (User user : userList) { System.out.println(user); } // 关闭sqlSession sqlSession.close(); }
可能遇到的问题
-
配置文件没有注册
-
绑定接口错误
-
方法名不对
-
返回类型不对
-
Maven导出资源问题
3、CRUD增删改查
1. namespace
namespace中包名要和Dao/Mapper接口一致
2. select
选择、查询语句:
- id:就是对应的namespace中的方法名
- resultType:SQL语句执行的返回值
- parameterType:参数类型
使用步骤
-
编写接口
// 查询所有数据 List<User> getUserList(); // 查询一条数据,根据id号 User getUser(int id);
-
编写对应Mapper中的sql语句
<!--select查询语句--> <select id="getUserList" resultType="com.kuang.pojo.User"> select * from mybatis.user </select> <!--select查询一条--> <select id="getUser" resultType="com.kuang.pojo.User" parameterType="int"> select * from mybatis.user where id = #{id}; </select>
-
测试
@Test // 测试查询所有 public void getUsers(){ // 第一步:获得SqlSession对象 SqlSession sqlSession = MybatisUtils.getSqlSession(); // 方式一:getMapper UserMapper userDao = sqlSession.getMapper(UserMapper.class); List<User> userList = userDao.getUserList(); // 方式二:过时不用 // List<User> userList = sqlSession.selectList("com.kuang.dao.UserDao.getUserList"); for (User user : userList) { System.out.println(user); } // 关闭sqlSession sqlSession.close(); } @Test // 测试查询一条数据 public void getUser(){ // 第一步:获得sqlSession对象 SqlSession sqlSession = MybatisUtils.getSqlSession(); // 第二步:获得Mapper接口 UserMapper mapper = sqlSession.getMapper(UserMapper.class); // 第三步:调用Mapper中的方法 User user = mapper.getUser(2); // 第四步:获得结果 System.out.println(user); // 关闭sqlSessions sqlSession.close(); }
3. insert
插入语句:
- id:就是对应的namespace中的方法名
- parameterType:参数类型
使用步骤
-
编写接口
// 增添一条数据 int insertUser(User user);
-
便携而对应Mapper中的sql语句
<!--insert增添一条 对象中的属性,可以直接使用--> <insert id="insertUser" parameterType="com.kuang.pojo.User"> insert into mybatis.user(username,password) values(#{username},#{password}); </insert>
-
测试
@Test // 测试增添一条数据 public void insertUser(){ SqlSession sqlSession = MybatisUtils.getSqlSession(); UserMapper mapper = sqlSession.getMapper(UserMapper.class); int insert = mapper.insertUser(new User(4, "alex", "9999")); if(insert > 0){ System.out.println("增添成功"); } sqlSession.commit(); sqlSession.close(); }
4. update
修改语句:
- id:就是对应的namespace中的方法名
- parameterType:参数类型
使用步骤
-
编写接口
// 修改一条数据 int updateUser(User user);
-
便携而对应Mapper中的sql语句
<!--update修改一条--> <update id="updateUser" parameterType="com.kuang.pojo.User"> update mybatis.user set username = #{username},password = #{password} where id = #{id}; </update>
-
测试
@Test // 测试修改一条数据 public void updateUser(){ SqlSession sqlSession = MybatisUtils.getSqlSession(); UserMapper mapper = sqlSession.getMapper(UserMapper.class); int update = mapper.updateUser(new User(3, "egon", "666")); if(update > 0){ System.out.println("修改成功"); } sqlSession.commit(); sqlSession.close(); }
5. delete
删除语句:
- id:就是对应的namespace中的方法名
- parameterType:参数类型
使用步骤
-
编写接口
// 删除一条数据,根据id号 int deleteUser(int id);
-
便携而对应Mapper中的sql语句
<!--delete删除一条--> <delete id="deleteUser" parameterType="int"> delete from mybatis.user where id = #{id}; </delete>
-
测试
@Test // 测试删除一条数据 public void deleteUser(){ SqlSession sqlSession = MybatisUtils.getSqlSession(); UserMapper mapper = sqlSession.getMapper(UserMapper.class); int delete = mapper.deleteUser(3); if(delete > 0){ System.out.println("删除成功"); } sqlSession.commit(); sqlSession.close(); }
6、注意
增删改需要提交事务
7、分析错误
① 标签匹配错
② resource绑定Mapper路径
③ 程序配置文件必须符合规范
在mybatis.config.xml文件中,不能出现一丝一毫的错误
④ NullPointerException,没有注册到资源
⑤ mapper.xml文件中存在中文乱码问题
配置好了就行