myBatis:注解-普通增删改查

注解也是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后,会更加简捷。

猜你喜欢

转载自blog.csdn.net/qq_43532342/article/details/83824208