MyBatis 配置文件记录
概念
将数据库表中记录的数据查询出来,并封装成一个实体类的对象。
SqlSession代表和数据库的一次会话,是用openSession对象实现的,用完必须关闭,释放资源。
SqlSession和connection一样都是非线程安全的,每次使用都应该获取新的对象。
mapper接口没有实现类,但是mybatis会为这个接口生成一个代理对象。
1 初级的mybatis
拥有两个配置文件:全局配置文件 和 映射文件,必须创建mybatis环境。这里用IDEA创建maven项目,只需要在相应的POM文件中写入maven依赖即可。
1.1 pom.xml文件中添加相应依赖
<dependencies> <!--mybatis依赖--> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.4.6</version> </dependency> <!--mysql驱动依赖--> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.7.6</version> </dependency> <!--log4j日志文件系统--> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.17</version> </dependency> <!--这个依赖用于做测试--> <dependency> <groupId>org.junit.jupiter</groupId> <artifactId>junit-jupiter-api</artifactId> <version>5.3.2</version> <scope>compile</scope> </dependency> </dependencies> <!--这个插件,将应用打包成一个可执行的jar包--> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build>
1.2 全局配置文件 mybatis.xml
在此映射文件中,只需要指定输入参数类型,返回结果参数类型,sql语句等就差不多了,也就是将原本jdbc所遇到的硬编码问题全部是使用xml配置文件来替代。以下是一个简单的示例。
1.2.1 全部 MyBatis 的配置元素
MyBatis 配置 XML 文件的层次结构。这些层次是不能够颠倒顺序的,如果颠倒顺序,MyBatis 在解析 XML 文件的时候就会出现异常了。
<?xml version="1.0" encoding="UTF-8"?> <configuration><!--配置--> <properties/><!--属性--> ------------------------------------------------------------------------- <settions/><!--设置--> 属性:mapUnderscoreToCamelCase 是否开启自动驼峰命名规则(camel cass)映射。 即从经典数据库列名A_COLUMN到经典Java属性名aColumn的类似映射 例如:数据库列名为U_NAME,则Java属性名为uName 数据库表中的字段名称下划线后面的第一个字母,与Java属性名的第一个大写字母相同 例如: <settings> <setting name="mapUnderscoreToCamelCase" value="true"/> </settings> ------------------------------------------------------------------------- <typeAliases><!--别名处理器,为某一个类型命名,不区分大小写--> <!-- 配置别名role,它代表com.learn.po.Role --> <typeAliase alias="role" type="com.learn.po.Role"/> <package name="com.zzfan.framework.entiey"/> name:指定包名 可以为当前包以及下面所有的包中的每一个类起默认别名 默认别名是类名的全小写 package标签写在typeAliases标签中 </typeAliases> <!-- 起好的别名用在映射文件中 写sql语句的标签的resultType parameterType等标签中 --> ------------------------------------------------------------------------- <typeHandlers/><!--类型处理器--> ------------------------------------------------------------------------- <objectFactory/><!--对象工厂--> ------------------------------------------------------------------------- <plugins/><!--插件--> ------------------------------------------------------------------------- <environments><!--配置环境--> <!-- mybatis可以配置多种环境 --> <environment> id:当前环境的唯一标识,便于多种开发环境切换 <!-- 必须有以下两个标签 --> <transactionManager/><!--事务管理器--> <dataSource/><!--数据源--> </environment> </environments> <!-- 有如下示例 --> <environments default="development"> <!-- 通过更改default来改变当前环境,达到快速切换的目的 --> <environment id="development" > <transactionManager type="JDBC"/> <dataSource type="POOLED"> <property name="driver" value="${db.driver}"/> <property name="url" value="${db.url}"/> <property name="username" value="${db.username}"/> <property name="password" value="${db.password}"/> </dataSource> </environment> <environment id="test"> ... <!-- 当前环境用于测试,用到该环境时,只需要修改default的值 --> </environment> </environments> ------------------------------------------------------------------------- <databaseIdProvider/><!--数据库厂商标识--> type属性:得到数据库厂商标识(驱动自带) mybatis就能根据数据库厂商标识执行不同的sql <!-- 为不同的数据库厂商起别名 --> <properties name="MySQL" value="mysql"> 然后在映射文件的标签如<select>等有一个databaseId属性,写其对应的别名 ------------------------------------------------------------------------- <mappers/><!--映射器--> 每一个mapper标签都注册一个标签,四种方式加载映射文件 1,2注册配置文件 3注册接口 1. <mapper resource="映射文件地址"/> 引用类路径下的sql映射文件,使用相对路径,相对于项目下的。 "mybatis/mybatis-config.xml" 2. <mapper url=""/> 使用绝对路径或者网络路径,一般不用。 "file:///var/mappers/AuthorMapper.xml" 3. <mapper class=""/> A:接口的全限定名:包括类名以及接口的名称在内的全类名 使用mapper接口的全限定名让mybatis通过全限定名称自己找映射文件 前提:mapper接口的名称必须与映射文件名称相同,并放到同一目录下 B:没有sql映射文件,在接口方法上使用注解 @select("select * from tbl_employee where id = #{id}") 4. <package name=""/> 注册指定包下的所有映射文件 注意:mapper接口的名称必须与映射文件名称相同,并放到同一目录下 ------------------------------------------------------------------------- </configuration>
1.2.2 配置文件示例
<?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) --> <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="zzf940227"/> </dataSource> </environment> </environments> <!-- 写好的sql映射文件一定要注册到全局配置文件中 --> <mappers> <mapper resource="mapper/EmployeeMapper.xml"/> </mappers> </configuration>
1.2.3 引入外部数据库配置信息
引用db.properties中的信息,将上述配置信息中的dataSource标签中的内容进行如下修改。
# 引用外部数据库文件 <dataSource type="POOLED"> <!-- 引用db.properties中的信息,通过${} --> <property name="driver" value="${db.driver}"/> <property name="url" value="${db.url}"/> <property name="username" value="${db.username}"/> <property name="password" value="${db.password}"/> </dataSource> # db.properties文件配置信息 db.driver = com.mysql.cj.jdbc.Driver db.url = jdbc:mysql://localhost:3306/db_test?useUnicode=true&characterEncoding=utf8&aserverTimezone=GMT db.username = root db.password = zzf940227 # 导入properties文件 <properties resource = "db.properties"> 1.3 映射文件操作 xxxMapper.xml # xxxrMapper.xml <?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:名称空间,随便起(也别太随便),一般是该文件的全限定名 id:唯一标识 resultType:返回值类型(对应的应该是表相应的实体类) #{id}:从传递过来的参数中取出ID值 --> <mapper namespace="mapper.xxxMapper"> <select id="selectEmpid" resultType="com.zzfan.test.Mybatis.Employee"> 查询操作,这里写sql语句,下面的是示例。 </select> <insert id="insertid" parameterType="com.zzfan.test.Mybatis.User"> 添加操作 </insert> <delete id="deleteid" parameterType="com.zzfan.test.Mybatis.Employee"> 删除操作 </delete> <update id="deleteid" parameterType="com.zzfan.test.Mybatis.Employee"> 更新操作 </update> -------------------------------------------------------------------- <!-- resultMap最终还是要将结果映射到pojo上, --> <!-- type:指定映射到哪一个pojo id: 设置ResultMap的id --> <resultMap type="order" id="orderResultMap"> <!-- 定义主键 ,非常重要。如果是多个字段,则定义多个id --> <!-- property:主键在pojo中的属性名 --> <!-- column:主键在数据库中的列名 --> <id property="id" column="id" /> <!-- 定义普通属性 --> <result property="userId" column="user_id" /> <result property="number" column="number" /> <result property="createTime" column="create_time" /> <result property="note" column="note" /> </resultMap> -------------------------------------------------------------------- </mapper>
2 DAO接口方式
在开发中,都是开发DAO接口和DAO实现类,然后再DAO实现类中调用sqlsession的方法对数据库进行增删改查操作。
让我留意到的是命名方式,有的是用 xxxDao 的方式命名,有的是 xxxMapper。两种肯定是都行。但我个人习惯使用Mapper结尾,与Mapper配置文件相对应。
数据库表字段对应实体类的私有成员变量。
2.1 实体类
package com.zzfan.framework.entity; public class Employee { private Integer id; private String last_name; private String email; private String gender; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getLastName() { return last_name; } public void setLastName(String lastName) { this.last_name = lastName; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } public String getGender() { return gender; } public void setGender(String gender) { this.gender = gender; } @Override public String toString() { return "Employee{" + "id=" + id + ", last_name='" + last_name + '\'' + ", email='" + email + '\'' + ", gender='" + gender + '\'' + '}'; } }
2.2 DAO接口
import com.zzfan.framework.entity.Employee; /** * 这个接口就是用来查出Employee,记录数据,并封装成Employee对象 */ public interface EmployeeMapper { public Employee getEmpById(Integer id); public void addEmp(Employee employee); public void updateEmp(Employee employee); public void deleteEmpById(Integer id); }
2.3 DAO接口实现类
package com.zzfan.framework.Impl; import com.zzfan.framework.dao.EmployeeMapper; import com.zzfan.framework.entity.Employee; /** * 这里仅实现了接口的一个方法用于测试 */ public class EmployeeMapperImpl implements EmployeeMapper { private SqlSessionFactory sqlSessionFactory; public EmployeeMapperImpl(SqlSessionFactory sqlSessionFactory) { this.sqlSessionFactory = sqlSessionFactory; } public Employee getEmpById(Integer id) { SqlSession sqlSession = sqlSessionFactory.openSession(); return sqlSession.selectOne("com.zzfan.framework.dao.EmployeeMapper.getEmpById", id); } }
2.4 映射文件
# 部分内容进行修改 # mapper标签的namespace属性一般指定为接口的全限定名 <mapper namespace="com.zzfan.framework.dao.EmployeeMapper"> <!-- select标签的id就是接口的getEmpById()方法 --> <select id="getEmpById" resultType="com.zzfan.framework.entity.Employee"> select * from tbl_employee where id = #{id} </select> </mapper>
2.5 测试
public class MybatisTest { @Test public void test() throws IOException { // 1、读取配置文件 String resource = "mybatis/mybatis-config.xml"; // 2、获取SqlSessionFactory对象 InputStream inputStream = Resources.getResourceAsStream(resource); // 3、获取sqlSession实例,能直接执行已经映射的sql语句 SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); EmployeeMapper employeeMapper = new EmployeeMapperImpl(sqlSessionFactory); Employee employee = employeeMapper.getEmpById(1); } }
补充
全局配置文件的标签顺序
properties
settings
typeAliases
typeHandlers
objectFactory
objectWrapperFactory
reflectorFactory
plugins
environments
databaseIdProvider
mappers