学习笔记 Java Mybatis学习 前言 最近在学习javaweb,刚开始学习java与mysql之间的数据库操作,一开始学习的是jdbc,学过之后发现jdbc操作有些麻烦,处理简单的语句还可以,一旦如果工程量巨大,那么可能会十分麻烦。同时在把查询结果映射成对象这一操作上,需要执行单独的函数,今天学了Mybatis后,发现这次操作十分简单,甚至Mybatis默认就会帮我们完成这一操作。但是有利也有弊,学过之后感觉Mybatis的配置可能比较多,不过与其说多不如说是有序,有一个总的配置,之后mapper的配置。总体来讲Mybatis还是比较方便的。
Mybatis配置 Mybatis配置文件是XML的格式,内容中包括数据库连接信息,mapper等,实际可配置的项目有很多,但是主要有用的就这几种,如下示例中包含了一个mapper,对应的是一个查表的语句。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "https://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/study"/> <property name="username" value="root"/> <property name="password" value="root"/> </dataSource> </environment> </environments> <mappers> <mapper resource="com/test/mapper/testMapper.xml"/> </mappers> </configuration>
Mapper文件 这个文件里面规定了执行的sql语句,以及执行结果要映射的对象类型,Mybatis非常神奇,通过映射,直接把结果变成了对象,例如如下,示例是查Account表,然后把结果映射为Account类的对象。
Mapper.xml
1 2 3 4 5 6 7 8 9 <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "https://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.test.mapper.TestMapper"> <select id="selectAccount" resultType="com.test.entity.Account"> select * from Accounts </select> </mapper>
com.test.entity.Account
这里要提到一个Lombok,下面的@Data注解就是利用小辣椒的注解,这样以来构造方法,getter,setter,toString都帮我们写好了,非常方便。
1 2 3 4 5 6 7 8 9 10 11 package com.test.entity;import lombok.Data;@Data public class Account { int id; String account; String password; }
Mybatis 核心 有了上面两个之后,我们直接运行两行代码即可执行sql,首先一句代码的含义就是读取配置文件,连接Mysql数据库,从代码理解上大概意思为建立一个sql会话(SqlSession),第二句就是具体的执行Sql操作,如下:
1 2 FileInputStream fileInputStream = new FileInputStream ("mybatis-config.xml" );SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder ().build(fileInputStream);
这两行代码类似于让Mybatis读取我们设立的配置文件,然后给我们一个sqlSessionFactory,有了这个之后,我们再得到session,即可在session上进行一系列sql的操作
1 2 3 4 try (SqlSession sqlSession = sqlSessionFactory.openSession(true )){ TestMapper mapper = sqlSession.getMapper(TestMapper.class); mapper.selectAccount().forEach(System.out::println); }
如上代码就是先规定openSession(true),意为实时执行sql操作,之后会返回一个sqlsession类型的对象,再直接使用sqlSession.getMapper(TestMapper.class)方法即可返回TestMapper接口的实现类,其中TestMapper的内容如下:
TestMapper.java
1 2 3 4 5 6 7 8 9 package com.test.mapper;import com.test.entity.Account;import java.util.List;public interface TestMapper { List<Account> selectAccount () ; }
没错,Mybatis会帮我们动态实现一个接口的实现类,我们只需在接口中定义类型即可,这里注意上面的selectAccount(),这个selectAccount实际是和testMapper.xml中的 id 是对应的,不对应将会报错。同时上面testMapper.xml中namespace也写明了这个接口的地址com.test.mapper.TestMapper,因此是这个namespace让二者产生关联。
拓展 更方便一些,我们可以把Mybatis核心的代码都写到一个MybatisUtil类里面,当作工具类,之后我们可以在其他任何地方执行操作数据库,如下:
MybatisUtil.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 package com.test;import org.apache.ibatis.session.SqlSession;import org.apache.ibatis.session.SqlSessionFactory;import org.apache.ibatis.session.SqlSessionFactoryBuilder;import java.io.FileInputStream;import java.io.FileNotFoundException;public class MybatisUtil { private static SqlSessionFactory sqlSessionFactory; static { try { sqlSessionFactory = new SqlSessionFactoryBuilder ().build(new FileInputStream ("mybatis-config.xml" )); } catch (FileNotFoundException e) { throw new RuntimeException (e); } } public static SqlSession getSession (boolean autocommit) { return sqlSessionFactory.openSession(autocommit); } }
示例在其他地方执行,可以写:
Main.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 package com.test;import com.test.mapper.TestMapper;import org.apache.ibatis.session.SqlSession;public class Main { public static void main (String[] args) { try (SqlSession sqlSession = MybatisUtil.getSession(true )){ TestMapper mapper = sqlSession.getMapper(TestMapper.class); mapper.selectAccount().forEach(System.out::println); } } }
Mybatis是个非常有趣的东西,非常方便,虽然算不上简洁,但是非常清晰明了,把要执行的sql都放到mapper,把sql的配置都放到配置文件,代码则只需要专注执行,虽然之后还没深入学习,但是相信这些种种优点给了Mybatis挑战大型项目的可能性。加油!!!