注解也是mybatis的特色之一,可以简化大量的文件配置。
接下来,对一个表进行增删改查操作
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>MybatisSelect</groupId>
<artifactId>MybatisSelect</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>war</packaging>
<name>MybatisSelect Maven Webapp</name>
<!-- FIXME change it to the project's website -->
<url>http://www.example.com</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.7</maven.compiler.source>
<maven.compiler.target>1.7</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.1</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.43</version>
</dependency>
</dependencies>
<build>
<finalName>MybatisSelect</finalName>
<pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
<plugins>
<plugin>
<artifactId>maven-clean-plugin</artifactId>
<version>3.0.0</version>
</plugin>
<!-- see http://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_war_packaging -->
<plugin>
<artifactId>maven-resources-plugin</artifactId>
<version>3.0.2</version>
</plugin>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.7.0</version>
</plugin>
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.20.1</version>
</plugin>
<plugin>
<artifactId>maven-war-plugin</artifactId>
<version>3.2.0</version>
</plugin>
<plugin>
<artifactId>maven-install-plugin</artifactId>
<version>2.5.2</version>
</plugin>
<plugin>
<artifactId>maven-deploy-plugin</artifactId>
<version>2.8.2</version>
</plugin>
</plugins>
</pluginManagement>
</build>
</project>
以后的依赖文件pom.xml无需配置Java文件的资源加载。
Mapper映射文件被注解替代。
<?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>
<typeAliases>
<package name="com.hc.model"/>
</typeAliases>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/cn?characterEncoding=utf-8"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper class="com.hc.mapper.UserMapper"/>
<mapper class="com.hc.mapper.PersonMapper"/>
<mapper class="com.hc.mapper.CardMapper"/>
<mapper class="com.hc.mapper.AuthorMapper"/>
<mapper class="com.hc.mapper.BookMapper"/>
<mapper class="com.hc.mapper.CourseMapper"/>
<mapper class="com.hc.mapper.StudentMapper"/>
</mappers>
</configuration>
依次是别名、数据库、Mapper配置
Mapper从resource变成了class
同样:
从前所习惯的entity变为model
dao接口变成了Mapper
package com.hc.model;
public class User {
private int userId;
private String userName;
public User() {
}
public User(String userName) {
this.userName = userName;
}
public int getUserId() {
return userId;
}
public void setUserId(int userId) {
this.userId = userId;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
}
User对象的封装
package com.hc.mapper;
//import org.apache.ibatis.annotations.CacheNamespace;
import com.hc.model.User;
import org.apache.ibatis.annotations.Delete;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.Update;
import java.util.List;
//@CacheNamespace 缓存
public interface UserMapper {
@Update("update User set userName=#{userName} where userId=#{userId}")
public void updateUser(User user);
@Delete("delete from User where userId=#{userId}")
public void deleteUser(int userId);
@Insert("insert into User(userName) values(#{userName})")
public void insertUser(User user);
@Select("select * from User")
public List<User> allUser();
@Select("select * from User where userId=#{userId}")
public User selectUser(int userId);
@Select("select * from User where userName like concat('%',#{userName},'%')")
public List<User> likeUser(String userName);
}
@CacheNamespace 缓存:二级缓存,实践
直接在接口上注解SQL
#{ }:依旧是占位符
@select、@update:操作类型
concat:拼接
以上方式的前提条件必须是对象与表一一对应,即对象的属性与表的字段相同,这是个好习惯,开发也会更便捷
否则:
需要手动配置
@Select("select * from Author")
@Results({
@Result(id=true,property = "autId",column = "autId"),//id=true
@Result(property = "books",column = "autId",many = @Many(select = "com.hc.mapper.BookMapper.selectBookByAutId"))
})
public List<Author> allAuthor();
Results:结果集
Result:结果
主键需要id=true
property:对象属性
column :表字段
声明对象的某个属性与表的某个字段是关联的
此种注解,也被称为面向接口编程
package com.hc.test;
import com.hc.mapper.UserMapper;
import com.hc.model.User;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
public class TestUser {
private SqlSession session;
private UserMapper userMapper;
@Before
public void before() {
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(getClass().getClassLoader().getResourceAsStream("myBatis-config.xml"));
session = factory.openSession();
userMapper = session.getMapper(UserMapper.class);
}
@Test
public void test() {
User user=new User("战国七雄昂");
user.setUserId(6);
userMapper.updateUser(user);
// userMapper.deleteUser(1);
// for (User user : userMapper.likeUser("l")) {
// System.out.println(user.getUserId() +"\t"+ user.getUserName());
// }
// User user=new User("战国");
// userMapper.insertUser(user);
// for (User user : userMapper.allUser()) {
// System.out.println(user.getUserId() +"\t"+ user.getUserName());
// }
// User user=userMapper.selectUser(1);
// System.out.println(user.getUserId() +"\t"+ user.getUserName());
}
@After
public void after() {
session.commit();
session.close();
}
}
单元测试
比以前的开发更为简便。
再加上Spring后,会更加简捷。