MyBatis 学习笔记(XML配置)
本文是本人在学习MyBatis过程中对于一些知识点的一些小总结,由于本人能力有限,若有不对的还望指正
1、快速开始
首先要从xml中获得SqlSessionFactory,再从SqlSessionFactory获得SqlSession,代码如下:
public class JavaDemo { //获得SqlSessionFactory public static SqlSessionFactory getSqlFactory() { InputStream inputStream=null; try { String resource = "mybatis-config.xml"; inputStream = Resources.getResourceAsStream(resource); return new SqlSessionFactoryBuilder().build(inputStream); } catch (IOException e) { e.printStackTrace(); } finally { try { if(inputStream!=null) inputStream.close(); } catch (IOException e) { e.printStackTrace(); } } return null; } @Test public void test() { SqlSessionFactory sqlFactory = JavaDemo.getSqlFactory(); SqlSession sqlSession = sqlFactory.openSession(); } }
再通过SqlSession获得接口对象,调用接口对象的函数,最后将SqlSession关闭,代码如下:
AuthorMapper mapper = sqlSession.getMapper(AuthorMapper.class); System.out.println(mapper.getAutById(1)); sqlSession.close();
其中mapper.getAutById(1)调用了select方法,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> <!--数据库信息文件存放的位置--> <properties resource="jdbc.properties"></properties> <!--类型别名--> <typeAliases> <package name="com.study.day01"/> </typeAliases> <!--环境配置--> <environments default="development"> <environment id="development"> <!--事务管理的类型--> <transactionManager type="JDBC"/> <!-- 使用连接池--> <dataSource type="POOLED"> <property name="driver" value="${jdbc.driver}"/> <property name="url" value="${jdbc.url}"/> <property name="username" value="${jdbc.username}"/> <property name="password" value="${jdbc.password}"/> </dataSource> </environment> </environments> <!--支持多数据库厂商--> <databaseIdProvider type="DB_VENDOR"> <property name="MySQL" value="mysql"/> <property name="Oracle" value="oracle"/> <property name="SQL Server" value="sqlserver"/> </databaseIdProvider> <!--映射文件路径--> <mappers> <mapper resource="mapper/AuthorMapper.xml"/> <mapper resource="mapper/BookMapper.xml"/> </mappers> </configuration>
对于简单的MyBatis demo,我们只需要关注 mappers、environments、properties标签,映射文件如下:
<?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.study.day01.AuthorMapper"> <resultMap id="MyAuthor" type="com.study.day01.Author"> <id column="id" property="id"></id> <result column="name" property="name"></result> <result column="nation" property="nation"></result> </resultMap> <select id="getAutById" resultMap="MyAuthor"> select * from authors where id=#{id} </select> </mapper>
映射文件需要保存在mapper/下。
jdbc.properties配置如下:
jdbc.driver=com.mysql.cj.jdbc.Driver jdbc.url=jdbc:mysql://localhost:3306/books?serverTimezone=UTC&useSSL=false&allowPublicKeyRetrieval=true jdbc.username=root jdbc.password=weiwei1997
java代码如下:
package com.study.day01; import org.apache.ibatis.type.Alias; import java.util.List; @Alias(value = "auth") public class Author { private int id; private String name; private String nation;public List<Book> getBooks() { return books; } public void setBooks(List<Book> books) { this.books = books; } public Author() { } public Author(int id, String name, String nation, List<Book> books) { this.id = id; this.name = name; this.nation = nation; this.books = books; } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String au_name) { this.name = au_name; } public String getNation() { return nation; } public void setNation(String nation) { this.nation = nation; } @Override public String toString() { return "Author{" + "id=" + id + ", au_name='" + name + '\'' + ", nation='" + nation + '\'' + '}'; } } package com.study.day01; import org.apache.ibatis.annotations.Param; import java.util.List; public interface AuthorMapper { public Author getAutById(Integer id); }
2、配置文件xml
1)properties
这些属性可以在外部进行配置,并可以进行动态替换。你既可以在典型的 Java 属性文件中配置这些属性,也可以在 properties 元素的子元素中设置。如将username值设为dev_user,代码如下:
<properties resource="org/mybatis/example/config.properties"> <property name="username" value="dev_user"/> <property name="password" value="F2Fa3!33TYyg"/> </properties>
2)settings
一套配置完全的settings标签设置为:
<settings> <setting name="cacheEnabled" value="true"/> <setting name="lazyLoadingEnabled" value="true"/> <setting name="multipleResultSetsEnabled" value="true"/> <setting name="useColumnLabel" value="true"/> <setting name="useGeneratedKeys" value="false"/> <setting name="autoMappingBehavior" value="PARTIAL"/> <setting name="autoMappingUnknownColumnBehavior" value="WARNING"/> <setting name="defaultExecutorType" value="SIMPLE"/> <setting name="defaultStatementTimeout" value="25"/> <setting name="defaultFetchSize" value="100"/> <setting name="safeRowBoundsEnabled" value="false"/> <setting name="mapUnderscoreToCamelCase" value="false"/> <setting name="localCacheScope" value="SESSION"/> <setting name="jdbcTypeForNull" value="OTHER"/> <setting name="lazyLoadTriggerMethods" value="equals,clone,hashCode,toString"/> </settings>
3)类型别名
给java对象起一个别名,在package下,所有类的别名为首字母小写,比如com.study.day01.Author的别名为author,但是我们一般不这么用,因为在debug的时候,会根据完整的类名去debug。
<typeAliases> <package name="com.study.day01"/> </typeAliases>
4)environment
MyBatis 可以配置成适应多种环境,这种机制有助于将 SQL 映射应用于多种数据库之中, 现实情况下有多种理由需要这么做。例如,开发、测试和生产环境需要有不同的配置;或者想在具有相同 Schema 的多个生产数据库中使用相同的 SQL 映射。还有许多类似的使用场景。
不过要记住:尽管可以配置多个环境,但每个 SqlSessionFactory 实例只能选择一种环境。
所以,如果你想连接两个数据库,就需要创建两个 SqlSessionFactory 实例,每个数据库对应一个。而如果是三个数据库,就需要三个实例,依此类推,记起来很简单:
为了指定创建哪种环境,只要将它作为可选的参数传递给 SqlSessionFactoryBuilder 即可。可以接受环境配置的两个方法签名是:
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(reader, environment); SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(reader, environment, properties);
如果忽略了环境参数,那么将会加载默认环境,如下所示:
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(reader); SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(reader, properties);
配置文件的代码如下:
<environments default="development"> <environment id="development"> <transactionManager type="JDBC"> <property name="..." value="..."/> </transactionManager> <dataSource type="POOLED"> <property name="driver" value="${driver}"/> <property name="url" value="${url}"/> <property name="username" value="${username}"/> <property name="password" value="${password}"/> </dataSource> </environment> </environments>
浙公网安备 33010602011771号