注解说明:
MyBatis可以利用SQL映射文件来配置,也可以利用Annotation来设置。MyBatis提供的一些基本注解如下表所示:
注解 | 目标 | 相应的XML | 描述 |
---|---|---|---|
@CacheNamespace | 类 | <cache> | 为给定的命名空间(比如类)配置缓存。属性:implemetation,eviction,flushInterval , size 和 readWrite 。 |
@CacheNamespaceRef | 类 | <cacheRef> | 参照另外一个命名空间的缓存来使用。属性:value,也就是类的完全限定名。 |
@ConstructorArgs | 方法 | <constructor> | 收集一组结果传递给对象构造方法。属性:value,是形式参数的数组 |
@Arg | 方法 | <arg><idArg> | 单独的构造方法参数,是ConstructorArgs 集合的一部分。属性id,column,javaType,typeHandler 。id属性是布尔值,来标识用于比较的属性,和XML 元素相似 |
@TypeDiscriminator | 方法 | <discriminator> | 一组实例值被用来决定结果映射的表现。属性:Column, javaType , jdbcType typeHandler,cases 。cases属性就是实例的数组。 |
@Results | 方法 | <resultMap> | 结果映射的列表,包含了一个特别结果列如何被映射到属性或字段的详情。属性:value ,是Result注解的数组 |
@Case | 方法 | <case> | 单独实例的值和它对应的映射。属性:value ,type ,results 。Results 属性是结果数组,因此这个注解和实际的ResultMap 很相似,由下面的 Results注解指定 |
@Result | 方法 | <result><id> | 在列和属性或字段之间的单独结果映射。属性:id ,column , property,javaType ,jdbcType ,type Handler ,one,many 。id 属性是一个布尔值,表示了应该被用于比较的属性。one属性是单独的联系,和 <association> 相似,而many 属性是对集合而言的,和<collection> 相似。 |
@One | 方法 | <association> | 复杂类型的单独属性值映射。属性:select,已映射语句(也就是映射器方法)的完全限定名,它可以加载合适类型的实例。注意:联合映射在注解API中是不支持的。 |
@Many | 方法 | <collection> | 复杂类型的集合属性映射。属性:select,是映射器方法的完全限定名,它可加载合适类型的一组实例。注意:联合映射在 Java注解中是不支持的。 |
@Options | 方法 | 映射语句的属性 | 这个注解提供访问交换和配置选项的宽广范围,它们通常在映射语句上作为属性出现。而不是将每条语句注解变复杂,Options 注解提供连贯清晰的方式来访问它们。属性:useCache=true,flushCache=false,resultSetType=FORWARD_ONLY,statementType=PREPARED,fetchSize= -1,timeout=-1 ,useGeneratedKeys=false ,keyProperty=”id“。 理解Java 注解是很重要的,因为没有办法来指定“null ”作为值。因此,一旦你使用了 Options注解,语句就受所有默认值的支配。要注意什么样的默认值来避免不期望的行为 |
@Insert @Update @Delete | 方法 | <insert><update><delete> | 这些注解中的每一个代表了执的真实 SQL。它们每一个都使用字符串数组(或单独的字符串)。如果传递的是字符串数组,它们由每个分隔它们的单独空间串联起来。属性:value,这是字符串数组用来组成单独的SQL语句 |
@InsertProvider @UpdateProvider @DeleteProvider @SelectProvider | 方法 | <insert><update><delete><select> 允许创建动态SQL。 | 这些可选的SQL注解允许你指定一个类名和一个方法在执行时来返回运行的SQL。基于执行的映射语句, MyBatis会实例化这个类,然后执行由 provider指定的方法. 这个方法可以选择性的接受参数对象作为它的唯一参数,但是必须只指定该参数或者没有参数。属性:type,method。type 属性是类的完全限定名。method 是该类中的那个方法名。 |
@Param | 参数 | N/A | 当映射器方法需多个参数,这个注解可以被应用于映射器方法参数来给每个参数一个名字。否则,多参数将会以它们的顺序位置来被命名。 比如#{1},#{2} 等,这是默认的。使用@Param(“person”),SQL中参数应该被命名为#{person}。 |
注意:如果使用注解开发,xxmapper.xml映射文件可以不用书写
下面进行代码,实现示例:
- 创建项目(数据库准备,添加依赖)
<dependencies>
<!-- mybatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.2.8</version>
</dependency>
<!-- mysql驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.39</version>
</dependency>
<!-- 测试用例 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
</dependency>
<!-- 日志 -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.6.4</version>
</dependency>
</dependencies>
- Mybatis-config.xml核心配置文件
<?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>
<!-- 开启驼峰匹配 -->
<settings>
<setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>
<!-- 类别名 -->
<typeAliases>
<package name="cn.yanqi.pojo"/>
</typeAliases>
<!-- 连接数据库相关的配置 后面不用写,spring代替-->
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${driverClass}"/>
<property name="url" value="${url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper class="cn.yanqi.com.UserMapper"/>
</mappers>
</configuration>
- Jdbc.properties
driverClass=com.mysql.jdbc.Driver
url=jdbc:mysql:///mybatis
jdbc.username=root
jdbc.password=root
实体类就不写了!!!
4. Dao接口
(单表查询)
public interface UserMapper {
@Delete("delete from tb_user where id = #{id}")
public void delete(int id);
@Select("select * from t_user where id = #{id}")
public User select(int id);
@Select("select * from t_user")
public List<User> selectAll();
@Insert("insert into t_user(id,username,sex)values(null,#{username},#{sex})")
public void adduser(User user);
@Update("update t_user set username =#{username}, sex = #{sex} where id =#{id}")
public void updateuser(User user);
}
- 测试
import java.io.InputStream;
import java.util.List;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Before;
import org.junit.Test;
import cn.yanqi.pojo.User;
public class UserDaoTest {
private UserMapper userMapper;
private SqlSession sqlSession ;
private SqlSessionFactory sqlSessionFactory ;
//运行@test方法之前运行
@Before
public void setUp() throws Exception {
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
sqlSession = sqlSessionFactory.openSession();
userMapper = sqlSession.getMapper(UserMapper.class);
}
@Test
public void testDelete(){
this.userMapper.delete(20);
this.sqlSession.commit();
}
@Test
public void testselect(){
User user = this.userMapper.select(1);
System.out.println(user);
}
@Test
public void testselectall(){
List<User> list = this.userMapper.selectAll();
for(User res :list){
System.out.println(res);
}
}
@Test
public void testadd(){
User user = new User();
user.setUsername("jack");
user.setSex("boy");
this.userMapper.adduser(user);
this.sqlSession.commit();
}
@Test
public void testupdateuser(){
User user = new User();
user.setId(3);
user.setUsername("jack");
user.setSex("boy");
this.userMapper.updateuser(user);
this.sqlSession.commit();
}
}