MyBatis
一、MyBatis概念:
MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。
MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。
MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。
二、示例:
1)用maven骨架创建一个webapp项目:
2)创建相关目录:
3)编写mybatis配置文件:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
<?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>
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
db.driver=com.mysql.jdbc.Driver
db.url=jdbc:mysql://localhost:3306/test
db.username=root
db.password=000000
4)导入依赖:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
<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;
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
<build> <resources> <resource> <directory>src/main/java</directory> <includes> <include>**/*.xml</include> </includes> <!--默认是true--> <!--<filtering>true</filtering>--> </resource> </resources> </build>
6)bean:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
<?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)接口:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
public interface UserMapper { List<User> selectAll(); }
9)测试类:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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.属性名不再需要对应,但是属性类型必须一致;
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
<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};//参数和编号保持一致;(了解)