一、简介
1.什么是MyBatis
-
MyBatis 是一款优秀的 持久层框架
-
它支持自定义 SQL、存储过程以及高级映射。
-
MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。
-
MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。
-
MyBatis本是apache的一个开源项目iBatis,2010年这个项目由apache software foundation迁移到了google code,并且改名为MyBatis。
-
2013年11月迁移到Github。
(1)如何获得MyBatis
-
maven仓库
<dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.5.10</version> </dependency>
2.持久化
数据持久化
-
持久化就是将程序的数据在持久状态和瞬时状态转化的过程
-
内存:断电即失
-
数据库(jdbc),io文件持久化
为什么需要持久化
-
有一些对象,不能让它丢掉
-
内存太贵了
3.持久层
Dao层,Service层,Controller层 什么叫层
-
完成持久化工作的代码块
-
层是界限十分明显的
4.为什么需要Mybatis
-
帮助程序员将数据存入到数据库中
-
方便
-
传统的JDBC代码太复杂了,Mybatis对其进行了简化,
二、第一个Mybatis程序
思路:搭建环境-->导入Mybatis-->编写代码-->测试
1.搭建环境
搭建一个数据库
新建一个maven项目,并导入maven依赖,要注意导入mybatis时需要手动开启Tomcat的bin目录下startup.sh(只针对本机,Windows开启startup.bat)
<dependencies> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.28</version> </dependency> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.5.6</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.13.1</version> </dependency> </dependencies>
2.创建一个模块
编写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"> <!-- &在xml文件中与符号需要这样来转义--> <property name="driver" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/mybatis?serverTimezone=Asia/Shanghai&useSSL=true&useUnicode=true&characterEncoding=utf8"/> <property name="username" value="root"/> <property name="password" value="root123456"/> </dataSource> </environment> </environments> <!-- 每一个mapper.xml都需要在Mybatis核心配置文件中注册--> <mappers> <mapper resource="com/tang/dao/UserMapper.xml"/> </mappers> </configuration>
注意:这里如果没写加载驱动的话会报以下错误
org.apache.ibatis.exceptions.PersistenceException:
Error querying database. Cause: java.lang.NullPointerException: Cannot invoke "Object.hashCode()" because "key" is null
但是写了又会说会自动加载,加载多余,不过这并不是错误,因此还是写上安全
编写mybatis工具类
//sqlSessionFactory-->sqlSession public class MybatisUtils { private static SqlSessionFactory sqlSessionFactory; static{ try { //使用Mybatis第一步,获取sqlSessionFactory对象 //这三行代码是从mybatis中文文档中获取到的,规定这么写的 String resource = "mybatis-config.xml";//这里写上自己的mybatis配置文件的文件名即可 InputStream inputStream = Resources.getResourceAsStream(resource); sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); } catch (IOException e) { e.printStackTrace(); } } //既然有了 SqlSessionFactory,顾名思义,我们可以从中获得 SqlSession 的实例。 // SqlSession 提供了在数据库执行 SQL 命令所需的所有方法。 public static SqlSession getSqlSession(){ SqlSession sqlSession = sqlSessionFactory.openSession(); return sqlSession; } }
3.编写代码
实体类
字段名和数据里的字段一一对应
public class User { private int id; private String name; private String pwd; public User() { } public User(int id, String name, String pwd) { this.id = id; this.name = name; this.pwd = pwd; } public int getId() { return id; } public void setId(int 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接口
public interface UserDao { List<User> getUserList(); }
接口实现类由Impl转为一个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"> <!--namespace=绑定一个对应的Dao/Mapper接口,等价于以前去实现接口并重写方法--> <mapper namespace="com.tang.dao.UserDao"> <!-- select查询语句 --> <!--id等价于以前去实现接口并重写方法 resultType:执行sql返回的结果集,仅需要返回接口的方法中的泛型类型即可 --> <select id="getUserList" resultType="com.tang.pojo.User"> select * from mybatis.user </select> </mapper>
4.测试
注意点:
-
若在接口的配置文件中没有写以下代码则会报下面的错
<mappers> <mapper resource="com/tang/dao/UserMapper.xml"/> </mappers>
org.apache.ibatis.binding.BindingException: Type interface com.tang.dao.UserDao is not known to the MapperRegistry.
-
若在pom中没有以下代码则resources下的配置文件和java目录下的xml配置文件就不会被打包,也就是在target中并没有相应的class文件
<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>
*测试代码:
public class UserDaoTest { @Test public void test(){ //第一步:获得sqlSession对象 SqlSession sqlSession = MybatisUtils.getSqlSession(); //方式一:getMapper 执行SQL UserDao userDao = sqlSession.getMapper(UserDao.class); List<User> userList = userDao.getUserList(); for(User user: userList){ System.out.println(user); } //关闭SQLSession sqlSession.close(); } }
运行结果图
三、CRUD(增删改查)
1.Select
选择,查询语句
-
id:就是对应namespace中的方法名
-
resultType:Sql语句执行的返回值
-
parameterType:参数类型
编写接口
//查询指定id的用户 User getUserById(int id);
编写对应Dao中的sql语句
<select id="getUserById" parameterType="int" resultType="com.tang.pojo.User"> select * from mybatis.user where id= #{id} </select>
测试
//查询指定用户 @Test public void getUserByID(){ SqlSession sqlSession = MybatisUtils.getSqlSession(); UserDao mapper = sqlSession.getMapper(UserDao.class); User user = mapper.getUserById(1); System.out.println(user); sqlSession.close(); }
2.Insert
编写接口
//添加一个用户 int addUser(User user);
编写对应Dao中的sql语句
<insert id="addUser" parameterType="com.tang.pojo.User"> insert into mybatis.user(id,name,pwd) values(#{id},#{name},#{pwd}) </insert>
测试
//添加用户 @Test public void addUserTest(){ SqlSession sqlSession = MybatisUtils.getSqlSession(); UserDao mapper = sqlSession.getMapper(UserDao.class); mapper.addUser(new User(4,"twq","1233")); sqlSession.commit();//增删改必须要提交事务,否则在数据库中就无法查看增删改后的结果 sqlSession.close(); }
3.update
编写接口
//修改一个用户 int updateUser(User user);
编写对应Dao中的sql语句
<update id="updateUser" parameterType="com.tang.pojo.User"> update mybatis.user set name=#{name},pwd=#{pwd} where id=#{id}; </update>
测试
//修改用户 @Test public void updateUserTest(){ SqlSession sqlSession = MybatisUtils.getSqlSession(); UserDao mapper = sqlSession.getMapper(UserDao.class); mapper.updateUser(new User(1,"唐","1234")); sqlSession.commit(); sqlSession.close(); }
4.delete
编写接口
//删除一个用户 int deleteUser(int id);
编写对应Dao中的sql语句
<delete id="deleteUser" parameterType="int"> delete from mybatis.user where id=#{id};