MyBatis
一、MyBatis概念:
MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。
MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。
MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。
二、示例:
1)用maven骨架创建一个webapp项目:

2)创建相关目录:

3)编写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>
<!-- 引入db配置文件,可以使用${}配置服务器 -->
<properties resource="db.properties"/>
<!--配置对象别名-->
<typeAliases>
<!--<typeAlias type="com.qf.entity.User" alias="user"></typeAlias>-->
<!-- 批量别名,只写包名,包下的所有类的别名为首字母小写 -->
<package name="com.qf.entity"/>
</typeAliases>
<!--配置转换器-->
<!--<typeHandlers>-->
<!-- <typeHandler handler="全限命名" javaType="" jdbcType="" />-->
<!--</typeHandlers>-->
<!-- 开发环境 default指定使用的环境id -->
<environments default="development">
<!-- 开发环境id-->
<environment id="development">
<!-- 事务提交方式:
JDBC:利用JDBC方式处理事务(commit、rollback、close);
MANAGED:将事务交由其它组件托管(spring、jobss),默认关闭连接;
-->
<transactionManager type="JDBC"/>
<!-- 数据源类型:
UNPOOLED:传统JDBC模式,不使用连接池;
POOLED:使用数据库连接池,三方连接池;
JNDI:从tomcat中获取一个内置的连接池;
-->
<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>
</environments>
<mappers>
<!-- 加载映射文件 -->
<!--<mapper resource="com.qf.entity/UserMapper.xml" />-->
<!-- 批量加载映射文件,只写包名;要求xml和mapper接口放一个包内,且名称相同 -->
<package name="com.qf.mapper"/>
</mappers>
</configuration>
db.driver=com.mysql.jdbc.Driver
db.url=jdbc:mysql://localhost:3306/test
db.username=root
db.password=000000
4)导入依赖:
<dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.46</version> </dependency> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.4.0</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> </dependency> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.12</version> </dependency>
5)在pom中的build标签中配置导入mapper.xml文件:默认只会导入resource文件下的xml;
<build> <resources> <resource> <directory>src/main/java</directory> <includes> <include>**/*.xml</include> </includes> <!--默认是true--> <!--<filtering>true</filtering>--> </resource> </resources> </build>
6)bean:
public class User { private Long id; private String name; private Integer age; public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } @Override public String toString() { return "User{" + "id=" + id + ", name='" + name + '\'' + ", age=" + age + '}'; } }
7)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"> <mapper namespace="com.qf.mapper.UserMapper"> <resultMap id="BaseResultMap" type="com.qf.entity.User"> <id column="id" jdbcType="BIGINT" property="id"/> <result column="name" jdbcType="VARCHAR" property="name"/> <result column="age" jdbcType="INTEGER" property="age"/> </resultMap> <sql id="Base_Column_List"> id, name, age </sql> <select id="selectAll" resultMap="BaseResultMap"> select <include refid="Base_Column_List" /> from user </select> </mapper>
8)接口:
public interface UserMapper { List<User> selectAll(); }
9)测试类:
public class test { @Test public void test01() throws IOException { // 1、加载mybatis配置文件 Reader reader = Resources.getResourceAsReader("mybatis.xml"); // 2、构建SqlSessionFactoryBuilder SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder(); // 3、构建SqlSessionFactory工厂 SqlSessionFactory sessionFactory = sqlSessionFactoryBuilder.build(reader); // 4、构建SqlSession SqlSession sqlSession = sessionFactory.openSession(); UserMapper userMapper = sqlSession.getMapper(UserMapper.class); List<User> users = userMapper.selectAll(); for (Iterator<User> iterator = users.iterator(); iterator.hasNext(); ) { User user = iterator.next(); System.out.println(user); } } }
三、映射表配置的三种方式:
1)自然映射:bean的属性名和数据库中的字段名完全一致;
2)resultMap标签配置:
<resultMap id="BaseResultMap" type="com.qf.entity.User"> <id column="id" jdbcType="BIGINT" property="id"/> <result column="name" jdbcType="VARCHAR" property="name"/> <result column="age" jdbcType="INTEGER" property="age"/> </resultMap>
3)构造函数配置:
1.bean的属性顺序必须和构造内的一致;
2.属性名不再需要对应,但是属性类型必须一致;
<resultMap id="BaseResultMap" type="com.qf.entity.User"> <constructor> <idArg column="id" jdbcType="BIGINT" javaType="java.lang.Long"></idArg> <arg column="name" jdbcType="VARCHAR" javaType="java.lang.String"></arg> <arg column="user_id" jdbcType="INTEGER" javaType="java.lang.Integer"></arg> </constructor> </resultMap>
四、映射表SQL语句参数:
1、参数类型:
1)输入类型:parameterType;
1、如果输入的是简单类型(8个基本类型+String),占位符可以是#{随意};
2、如果输入的是对象,占位符必须是对象的属性名,#{属性名};
2)输出类型:
1、resultType:输出类型,自然映射;//包名+类名;
2、resultMap:映射表ID;
//返回值是集合和数组的情况,都只需设置为单数;
PS:输入输出参数只能为1个值;
2、#{}/${}区别:
|
类型 |
简单类型 |
复杂类型 |
区别 |
安全 |
适用 |
|
#{} |
#{任意} |
#{字段名} |
自动加''单引号 |
防止sql注入 |
/ |
|
${} |
${value} |
${字段名} |
不加单号 |
不防止 |
动态排序 |
3、多参数传入:
(1)map集合:#{键名};
(2)注解:#{参数名};//接口中参数设置:@Param(value="参数名");
(3)编号:#{0};//参数和编号保持一致;(了解)

浙公网安备 33010602011771号