Mybatis第一天
一、什么是mybatis?
Mybatis是一个支持普通sql查询、存储过程和高级映射的优秀持久层框架。Mybatis几乎省略了所有的jdbc代码和参数的手动设计以及对结果集的检索封装。Mybatis可以使用简单的XML和注解用于配置和原始映射,将接口和Java的pojo映射成数据库中的记录。
二、mybatis和jdbc的区别
mybatis作为一个框架,肯定是方便了大家的使用。我们先回顾jdbc的使用过程,我们要自己加载驱动,创建连接,写sql,调用setObject()方法对sql传参,对于查询语句,最最要的是对查询结果的遍历分装,才能得到我们所需要的结果类型。这些都太麻烦,为了避免数据库连接关闭过程中所消耗的资源过大,我们还要用数据库连接池。
现在,mybatis将所有的问题都解决了,传参,封装结果,都交给了mybatis解决。
三、使用(使用maven+idea创建Mybatis项目,普通的java工程)
1、没有dao层的
项目结构:
Ⅰ、在pom.xml中引入mybatis的依赖包
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.fy</groupId> <artifactId>day01</artifactId> <version>1.0-SNAPSHOT</version> <dependencies> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.26</version> </dependency> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.5.3</version> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.16</version> </dependency> </dependencies> </project>
Ⅱ、配置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>
<environments default="development">
<!-- 配置数据源 ,id="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/test" />
<property name="username" value="root" />
<property name="password" value="root" />
</dataSource>
</environment>
</environments>
<!-- mappers中配置映射文件-->
<mappers>
<mapper resource="mapper/SalGradeMapper.xml"></mapper>
</mappers>
</configuration>
Ⅲ、配置映射文件(SalGradeMapper.xml),映射文件写sql语句,该文件和dao层对应,第一个示例先不写dao层,所以映射文件的namespace的属性可以随意写。如果有dao,映射文件的namespace属性就要写对应的dao层全路径名。(该映射文件要在配置文件中配置,我们项目启动时找的时配置文件,配置文件再找映射文件)
<?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="fy"> <select id="getAll" parameterType="int" resultType="com.fy.entity.SalGrade"> select * from salgrade </select> <insert id="insertInto"> -- 当传入实体类参数时,会自动匹配实体类中的字段和 #{}中的字段 insert into salgrade(grade,losal,hisal) values (#{grade},#{losal},#{hisal}); </insert> <update id="updateOne"> --当要穿实体类作为参数时, #{}中的参数要和实体类中的字段对应 update salgrade set grade=#{grade} where id=#{id} </update> <delete id="deleteById"> delete from salgrade where id=#{id} </delete> </mapper>
Ⅳ、实体类
package com.fy.entity; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; /** * @Description: * @ClassName: SalGrade * @Author: fengyun * @Date: 2021/3/19 14:40 * @Version: 1.0 */ @Data @NoArgsConstructor @AllArgsConstructor public class SalGrade { private int id; private int grade; private Double losal; private Double hisal; }
Ⅴ、测试类
import com.fy.entity.SalGrade; 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.Reader; import java.util.List; /** * @Description: * @ClassName: Demo1Test * @Author: fengyun * @Date: 2021/3/19 14:48 * @Version: 1.0 */ public class Demo1Test { public static void main(String[] args) throws Exception { // 读取配置文件 Reader reader = Resources.getResourceAsReader("mybatis-config.xml"); // 使用工厂类创建sqlSessionFactory对象 SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader); // 打开数据库连接,这是开启了事务,当增改删时要关闭连接 SqlSession sqlSession = sqlSessionFactory.openSession(); /*List<SalGrade> list = sqlSession.selectList("fy.getAll"); System.out.println(list);*/ /* sqlSession.insert("fy.insertInto",new SalGrade(1,10,600.00,1900.00)); sqlSession.update("fy.updateOne",new SalGrade(6,19,300.00,600.00));*/ // 方法的第一个参数是配置文件中的 namespace+标签id,第二个是sql需要的参数 sqlSession.delete("fy.deleteById",7); sqlSession.commit(); } }
2、加上dao层
所有文件都一样,更改的地方在两个文件。新增的dao,更改了映射文件以及测试类
dao层:
public interface SalGradeDao { public List<SalGrade> getAll(); public int updateOne(@Param("id") int id,@Param("losal") double losal); }
映射文件:该文件中主要更改 namespace 属性,现在该属性值要和dao层的接口全路径对应,一个映射文件对应一个dao层的接口
<?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.fy.bbb.dao.SalGradeDao"> <select id="getAll" resultType="com.fy.bbb.entiry.SalGrade"> select * from salgrade </select> <update id="updateOne"> update salgrade set losal=#{param2} where id=#{param1} </update> </mapper>
测试类:
public class DemoTest { public static void main(String[] args) throws Exception{ // 读取配置文件 Reader reader = Resources.getResourceAsReader("config.xml"); SqlSessionFactory build = new SqlSessionFactoryBuilder().build(reader); SqlSession sqlSession = build.openSession(); // 通过sqlsession获取接口的映射 SalGradeDao mapper = sqlSession.getMapper(SalGradeDao.class); /* List<SalGrade> all = mapper.getAll(); System.out.println(all);*/ int i = mapper.updateOne(3, 9000.00); System.out.println(i); } }
四、可能出现的错误
1、数据连接出现时区问题
改,在连接语句上加上时区限制:jdbc:mysql://localhost:3306/test?serverTimezone=Asia/Shanghai
2、文件绑定问题
解决:查找各个路径引用的地方,看是否将文件名写错
3、main方法无法测试
解决:使用junit,测试单元
4、
原因:①查找的id不在 ②映射文件没有放在配置文件中