mybatis基於注解實現增刪改查


使用Maven構建一個項目,導入相應的架包

在pom文件中導入以下架包

 <!-- 添加項目jdk編譯插件 -->
    <build>
        <plugins>
            <!-- 設置編譯版本為1.8 -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                    <encoding>UTF-8</encoding>
                </configuration>
            </plugin>
        </plugins>
    </build>
    <!-- 導入需要的包 -->
    <dependencies>
        <!-- 測試包 -->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.8.1</version>
            <scope>test</scope>
        </dependency>
        <!-- 數據庫驅動包 -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.25</version>
        </dependency>
        <!-- mybatis包 -->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.4.6</version>
        </dependency>
    </dependencies>
pom.xml

創建數據庫和相應的表,下面放上sql語句

create table stu_info
(
    s_id int primary key auto_increment,
    s_name varchar(30) not null,
    s_age int not null,
    s_sex char(10) not null,
    s_tel   varchar(20) not null,
    s_origin varchar(50) not null
)
-- 班級信息表
create table class_info
(
        c_id int primary key auto_increment,
        c_name varchar(20) not null
)


-- 關聯表
create table stu_class
(
    sc_id int primary key auto_increment,
    s_id int not null,
    c_id int not null
)

info(s_name,s_age,s_sex,s_tel,s_origin) values('小李子',18,'','18970711655','江西贛州'
insert into stu_info(s_name,s_age,s_sex,s_tel,s_origin) values('小李子',18,'','18875711955','江西贛州'),('春春',17,'','17679077981','江西贛州'),('廖狗蛋',20,'','17770719761','江西贛州')

-- 添加幾個班級
insert into class_info(c_name) values('w10'),('w11'),('w12')
-- 把創建的學生添加到班級中
insert into stu_class(s_id,c_id) values(47,1),(48,2),(49,3),(50,2)

-- 根據id查詢學生信息
select s.*,c.c_name from stu_info s inner join stu_class sc on s.s_id = sc.s_id inner join class_info c on sc.c_id = c.c_id

delete from stu_info where s_id = #{id}
-- 修改學生信息
update stu_info set s_name = '',s_age = , s_sex = '', s_tel = '',s_origin =  where s_id = 

-- 使用別名方式映射實體類查詢學生信息
SELECT s_id as sid ,s_name as sname,s_age as sage, s_sex as ssex, s_tel as stel,s_origin as origin from stu_info

select * from stu_info where s_name like '小%'

select * from stu_info where s_name like '小%'

select * from stu_info where s_age BETWEEN  16 and 18
select * from stu_info where s_age BETWEEN  16 and 17

select * from stu_info where s_age = 17

select count(*) from stu_info 

select * from  stu_info where s_age = 17 and s_origin like '江西%'


delete from stu_info where s_id in(10,11,12,10,11,12)

創建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>
    <!-- typeAliases用於給類型指定別名 -->
    <typeAliases>
        <!-- 方式一:使用typeAlias設置別名
        type屬性指定的是類的完整類名,alias屬性指定的是別名 -->
        <!--<typeAlias type="edu.nf.ch01.entity.Users" alias="Users"/>-->
        <!-- 方式二:直接給整個實體包定義別名,name屬性指定實體所在的包名
        ,這樣會為每一個實體類自動生成一個別名,
        而這個別名就是實體類的類名並且首字母小寫-->
        <package name="edu.wang.ch02.entity"/>
    </typeAliases>

    <!-- environments用於配置數據源環境,里面可以配置多個。
         environment環境。
         每個數據源環境都包含在environment子標簽中,
         default屬性指定使用默認的數據源環境是哪個,
         對應environment標簽的id的值-->
    <environments default="mysql">
        <!-- 配置一個mysql的數據源環境,id是自定義的 -->
        <environment id="mysql">
            <!-- 指定事務管理器,這里使用JDBC的本地事務 -->
            <transactionManager type="JDBC"/>
            <!-- 配置數據源,type指定使用mybatis自帶的數據庫連接池 -->
            <dataSource type="POOLED">
                <!-- 配置數據庫的連接屬性 -->
                <property name="driver" value="com.mysql.jdbc.Driver"/>  <!-- 數據庫驅動 -->
                <property name="url"    value="jdbc:mysql://localhost:3306/student?useSSL=true&amp;useUnicode=true&amp;characterEncoding=utf-8"/>
                <property name="username" value="root"/> <!-- 數據庫賬號 -->
                <property name="password" value="root"/>  <!-- 數據庫密碼 -->
            </dataSource>
        </environment>
    </environments>
    <!-- 將所有的mapper映射配置文件加入到mappers配置中 -->
    <mappers>
    <!--引入映射文件 -->
    <!-- 使用注解不是用配置文件使用class配置 -->
    <!--<mapper class="edu.wang.ch02.dao.StudentDao"/>-->
    <!-- 使用注解不是用配置文件時也可以使用name配置 -->
    <!--<package name="edu.wang.ch02.dao"/>-->
    <!-- 當需要使用多表查詢的時候使用mapper.xml映射屬性字段需要映入xml文件,如果不用則使用上面配置即可 -->
    <mapper resource="mapper/StudentMapper.xml"/>
</mappers>
</configuration>

創建一個MybatisUtil工具類獲取SqlSession會話

package edu.wang.studentsystem.commons;


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 java.io.InputStream;
public class MybatisUtil {
    //定義一個全局變量方便調用
    private static SqlSessionFactory sqlSessionFactory;
    static {
        try {
            //讀取mybatis-config.xml配置文件
            InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
            //獲取會話工廠
            sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
        } catch (Exception e) {
            new RuntimeException(e.getMessage());
        }
    }
    //獲取會話
    public static SqlSession getSession(){
        //獲取一個sql會話
        return sqlSessionFactory.openSession();
    }

    /**
     * 
     * @param autoCommit 如果為真則自動提交事務,否者需要手動提交事務
     * @return
     */
    public static SqlSession getSession(boolean autoCommit){
        return sqlSessionFactory.openSession(autoCommit);
    }
}

編寫一個StudentDao接口使用注解的方法

 

package edu.wang.ch02.dao;
import com.sun.org.apache.xalan.internal.xsltc.runtime.InternalRuntimeError;
import edu.wang.ch02.entity.Student;
import org.apache.ibatis.annotations.*;

import java.util.List;
import java.util.Map;

/**
 * @Author Waverly
 * @Date 2018/9/12
 */
public interface  StudentDao {

    /**
     * 保存用戶信息
     * @param student
     * @Insert 注解標識要執行insert語句
     * 主鍵策略:
     * 方式一:使用@Options注解實現主鍵自增長
     * @Options(keyProperty = "s_id" , useGeneratedKeys = true)
     * keyProperty="指定要自增長的主鍵字段"  useGeneratedKeys="true" 為真為使用自增長
     * 方式二:使用@SelectKey注解生成UUID或sequence主鍵,
     *        keyProperty指定實體的主鍵字段,resultType指定生成UUID的類型為String,
     *        before指定為true表示在執行SQL之前生成uuid
     *        statement指定查詢數據的函數生成uuid
     *
     *        例如:@SelectKey(keyProperty = "id",
     *        resultType = String.class,
     *        before = true,statement = "select uuid() from dual")
     *
     *        keyProperty ="自增長的主鍵字段"
     *        resultType = "生成什么類型如(String.class)"
     *        before = true 在執行SQL之前插入
     *        statement = "select uuid() from dual" :生成的參數UUID
     * 方式三:自己維護主鍵生成,不需要任何注解
     */
    //傳入一個Student對象映射每個對應的字段
    @Insert("insert into stu_info(s_name,s_age,s_sex,s_tel,s_origin) values(#{sname},#{sage},#{ssex},#{stel},#{origin})")
    //自動增長,使用了方式一
    @Options(keyProperty = "s_id" , useGeneratedKeys = true)
    void saveStudent(Student student);

    //根據id刪除一條數據
    @Delete("delete from stu_info where s_id = #{id}")
    void delStudentById(Integer id);

    //根據傳入的對象自動映射到對應的字段
    @Update("update stu_info set s_name = #{sname},s_age = #{sage} , s_sex = #{ssex}, s_tel = #{stel},s_origin =#{origin}  where s_id = #{sid}")
    void updateStudent(Student student);

    //因為實體類和數據庫中的字段名不一致,所以需要用as把數據庫中的每個字段變成實體類中的字段名
    @Select(" SELECT s_id as sid ,s_name as sname,s_age as sage, s_sex as ssex, s_tel as stel,s_origin as origin from stu_info")
    //使用@ResultType注解指定返回結果集的類型,
    //這個注解並不強制要求,mybatis會通過反射獲取方法返回值的Class類型
    //@ResultType(List.class)
    List<Student> findAllStudent();

    //統計學生的個數
    @Select("select count(*) from stu_info")
    @ResultType(Integer.class)
    Integer countStudent();

    //多表查詢查詢所在班級
    @Select("select s.*,c.c_name from stu_info s inner join stu_class sc on s.s_id = sc.s_id inner join class_info c on sc.c_id = c.c_id")
    //使用StudentMapper.xml映射字段屬性
    @ResultMap("edu.wang.ch02.dao.StudentDao.StuMap")
    List<Student> getStudentList();

}

創建一個實體類進行映射     

 

package edu.wang.ch02.entity;

/**
 * @Author Waverly
 * @Date 2018/9/12
 */
public class Student {
    private Integer sid;
    private String sname;
    private int sage;
    private String ssex;
    private String stel;
    private String origin;
  //一對一關系,一個學生對應一個班級
private ClassInfo classInfo;      @Override public String toString() { return "Student{" + "sid=" + sid + ", sname='" + sname + '\'' + ", sage='" + sage + '\'' + ", ssex='" + ssex + '\'' + ", stel='" + stel + '\'' + ", origin='" + origin + '\'' + ",classInfo="+classInfo+'\''+ '}'; } public Student() { } public Student(Integer sid, String sname, int sage, String ssex, String stel, String origin) { this.sid = sid; this.sname = sname; this.sage = sage; this.ssex = ssex; this.stel = stel; this.origin = origin; } public Integer getSid() { return sid; } public void setSid(Integer sid) { this.sid = sid; } public String getSname() { return sname; } public void setSname(String sname) { this.sname = sname; } public int getSage() { return sage; } public void setSage(int sage) { this.sage = sage; } public String getSsex() { return ssex; } public void setSsex(String ssex) { this.ssex = ssex; } public String getStel() { return stel; } public void setStel(String stel) { this.stel = stel; } public String getOrigin() { return origin; } public void setOrigin(String origin) { this.origin = origin; } }

 

package edu.wang.ch02.entity;

/**
 * @Author Waverly
 * @Date 2018/9/19
 */
public class ClassInfo {
    private Integer cid;
    private String cname;

    @Override
    public String toString() {
        return "ClassInfo{" +
                "cid=" + cid +
                ", cname='" + cname + '\'' +
                '}';
    }
}

編寫StudentMapper.xml

<?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指定Dao接口的完整類名
    mybatis會依據這個接口動態創建一個實現類去實現這個接口,
    而這個實現類是一個Mapper對象-->
<mapper namespace="edu.wang.ch02.dao.StudentDao">
    <!-- 基於mybatis的增刪查改的sql映射配置 -->
    <!-- 插入操作,id指定UserDao接口中的方法名,
    parameterType指定方法參數的類型,
    也可以設置為typeAliases中定義的別名。
    useGeneratedKeys屬性設置為true表示使用主鍵自增長,
     keyProperty屬性指定實體中需要自增長的字段名稱

    sql中的values設置參數的時候使用#{},
     #{}是一個ognl表達式(對象圖導航語言),
     這個表達式最終會被mybatis解析成具體的值,
     在這里#{}中指定的是實體中的字段名-->
    <resultMap id="StuMap" type="Student">
        <id column="s_id" property="sid"/><!-- 主鍵id映射 -->
        <result column="s_name" property="sname"></result>
        <result column="s_age" property="sage"></result>
        <result column="s_sex" property="ssex"></result>
        <result column="s_tel" property="stel"></result>
        <result column="s_origin" property="origin"></result>
        <association property="classInfo" resultMap="classMap"/><!-- 一對一 關系 -->
    </resultMap>
    <resultMap id="classMap" type="classInfo">
        <id column="c_id" property="cid"/><!-- 映射實體類classInfo中的id -->
        <result column="c_name" property="cname"/><!-- 映射實體類classInfo中的cname -->
    </resultMap>
</mapper>

 

 

 

注解需要跟配置文件中的id對應

 最后編寫一下測試類測試是否有效

package edu.wang.ch02.test;

import edu.wang.ch02.dao.StudentDao;
import edu.wang.ch02.dao.impl.StudentDaoImpl;
import edu.wang.ch02.entity.Student;
import org.junit.Test;

import java.util.List;

/**
 * @Author Waverly
 * @Date 2018/9/18
 */
public class StudentDaoImplTest {
    /**
     * 測試根據id刪除學生信息的方法
     */
    @Test
    public void testDelStudentById(){
        StudentDao studentDao = new StudentDaoImpl();
        studentDao.delStudentById(40);
    }

    /**
     * 測試添加學生信息的方法
     */
    @Test
    public void testSaveStudent(){
        Student student = new Student();
        student.setSname("張三");
        student.setSage(18);
        student.setStel("18888888");
        student.setSsex("男");
        student.setOrigin("江西");
        new StudentDaoImpl().saveStudent(student);
    }

    /**
     * 測試查詢所有學生信息的方法
     */
    @Test
    public void testFindAllStudent(){
        List<Student> list = new StudentDaoImpl().findAllStudent();
        for (Student student : list) {
            System.out.println(student);
        }
    }

    /**
     * 測試統計學生的方法
     */
    @Test
    public void testCountStudent(){
        System.out.println(new StudentDaoImpl().countStudent());
    }
    /**
     * 測試修改學生的方法
     */
    @Test
    public void testUpdateStudent(){
        Student student = new Student();
        student.setSid(47);
        student.setSname("張三");
        student.setSage(18);
        student.setStel("18888888");
        student.setSsex("男");
        student.setOrigin("江西");
        new StudentDaoImpl().updateStudent(student);
    }

    /**
     *  測試getStudentList
     */
    @Test
    public void testGetStudentList(){
        List<Student> studentList = new StudentDaoImpl().getStudentList();
        for (Student student : studentList) {
            System.out.println(student);
        }
    }
}

運行結果

 

 

 

                                     


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM