mybatis学习笔记之----初识mybatis

mybatis介绍:

  MyBatis 是支持普通 SQL 查询,存储过程和高级映射的优秀持久层框架。MyBatis 消除 了几乎所有的 JDBC 代码和参数的手工设置以及结果集的检索。MyBatis 使用简单的 XML 或注解用于配置和原始映射,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java 对象)映射成数据库中的记录。每个MyBatis应用程序主要都是使用SqlSessionFactory实例的,一个SqlSessionFactory实例可以通过SqlSessionFactoryBuilder获得。SqlSessionFactoryBuilder可以从一个xml配置文件或者一个预定义的配置类的实例获得。用xml文件构建SqlSessionFactory实例是非常简单的事情。推荐在这个配置中使用类路径资源(classpath resource),但你可以使用任何Reader实例,包括用文件路径或file://开头的url创建的实例。MyBatis有一个实用类----Resources,它有很多方法,可以方便地从类路径及其它位置加载资源。MyBatis 最强大的特性之一就是它的动态语句功能。如果您以前有使用JDBC或者类似框架的经历,您就会明白把SQL语句条件连接在一起是多么的痛苦,要确保不能忘记空格或者不要在columns列后面省略一个逗号等。动态语句能够完全解决掉这些痛苦。尽管与动态SQL一起工作不是在开一个party,但是MyBatis确实能通过在任何映射SQL语句中使用强大的动态SQL来改进这些状况。动态SQL元素对于任何使用过JSTL或者类似于XML之类的文本处理器的人来说,都是非常熟悉的。在上一版本中,需要了解和学习非常多的元素,但在MyBatis 3 中有了许多的改进,现在只剩下差不多二分之一的元素。MyBatis使用了基于强大的OGNL表达式来消除了大部分元素

环境搭建:

  jar包:mybatis核心包,连接MYSQL数据包

  开发工具:eclipse

基于XML的CRUD:

1.创建mybatis的主配置文件:

<?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>
        <!-- 为User类取别名,以后在使用的时候2者是完全等价的 -->
        <typeAlias alias="User" type="com.carter.user.User" />
    </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://127.0.0.1:3306/demo02?useUnicode=true&amp;characterEncoding=utf-8"/>
                <property name="username" value="root" />
                <property name="password" value="123456" />
                       </dataSource>
        </environment>
    </environments>
    <!-- 注册mapper配置 -->
    <mappers>
        <mapper resource="com/carter/user/User.xml" /> 
    </mappers>
</configuration>

2.创建实体类

package com.carter.user;

public class User {
    private int age;
    private String name;
    private float score;
    
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public float getScore() {
        return score;
    }
    public void setScore(float score) {
        this.score = score;
    }
}

3.创建工具类获取sqlsessionFactory

package com.carter.util;

import java.io.IOException;
import java.io.Reader;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

public class SqlSessionUtil {
    private static SqlSessionFactory sqlSessionFactory = null;
    private static Reader reader = null;
    
    public static SqlSessionFactory getSqlSessionFactory(){
        if(sqlSessionFactory==null){
            try {
                reader = Resources.getResourceAsReader("config/Config.xml");
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);    //建造者模式得到SqlsessionFactory        
        }
        return sqlSessionFactory;
    }

}

4.创建操作接口

package com.carter.dao;

import java.util.List;

import com.carter.user.User;

public interface IUser {
    //这里方法名应该与映射文件中ID一致
    public List<User> getUserList();
    public User getUserByID(int userid);
    public int insertStu(User user);
    public int deleteUser(int id);
    public int updateUser(User user);
}

5.创建映射文件

<?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.carter.dao.IUser">
    <resultMap type="User" id="resultUserList">  
        <!-- 这里可以解决和数据库字段不统一问题,column是数据字段, property为实体字段 是一种映射 以后均可以使用该映射-->
        <id column="age" property="id"></id>  
        <result column="name" property="name"/>  
        <result column="score" property="score"/>   
    </resultMap> 
    <!-- 这里返回结果集应该用resultMap,且值应该为上面声明的ID-->
    <select id="getUserList" resultMap="resultUserList">
        select * from `user` 
    </select>
    
    <select id="getUserByID"  parameterType="int" resultType="User"><!--这里User由于别名原因,与User实体类完全等价-->
        select * from `user` 
        where user.id=#{userid}
    </select>
    
    <insert id="insertStu" parameterType="User">
        insert into user(name,score)values(#{name},#{score}) 
    </insert>
    
    <delete id="deleteUser" parameterType="int">
        delete from user where id=#{id}
    </delete>
    
    <update id="updateUser" parameterType="User">
        update user set name=#{name},score=#{score} where id=#{age}
    </update>
</mapper>

6.创建测试代码

package com.carter.test;

import java.util.List;

import javax.naming.spi.DirStateFactory.Result;

import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.junit.Test;

import com.carter.dao.IUser;
import com.carter.user.User;
import com.carter.util.SqlSessionUtil;

public class Client {
    @Test
    public void insertIntoUser(){
        SqlSessionFactory sqlSessionFactory = SqlSessionUtil.getSqlSessionFactory();
        SqlSession sqlSession = sqlSessionFactory.openSession();
        
        User user = new User();
        user.setName("李花花");
        user.setScore(100);
        
        IUser iUser = sqlSession.getMapper(IUser.class);
        int result = (int) iUser.insertStu(user);
        
        if(result>0){
            System.out.println("新增成功");
        }else{
            System.out.println("新增失败");
        }
    }
    
    @Test
    public void getAllUser(){
        SqlSessionFactory sessionFactory = SqlSessionUtil.getSqlSessionFactory();
        SqlSession sqlSession = sessionFactory.openSession();
        IUser iUser = sqlSession.getMapper(IUser.class);
        List<User> list = iUser.getUserList();
        for(User u:list){
            System.out.println("用户名:"+u.getName()+"========="+"成绩:"+u.getScore());
        }
    }
    
    @Test
    public void deleteUser(){
        SqlSessionFactory sessionFactory = SqlSessionUtil.getSqlSessionFactory();
        SqlSession sqlSession = sessionFactory.openSession();
        IUser iUser = sqlSession.getMapper(IUser.class);
        int result = iUser.deleteUser(4);
        if(result>0){
            System.out.println("删除成功");
        }else{
            System.out.println("删除失败");
        }
    }

    @Test
    public void updateUser(){
        SqlSessionFactory sessionFactory = SqlSessionUtil.getSqlSessionFactory();
        SqlSession sqlSession = sessionFactory.openSession();
        IUser iUser = sqlSession.getMapper(IUser.class);
        
        User user = new User();
        user.setAge(9);
        user.setName("张强a");
        user.setScore(12);
        
        int result = iUser.updateUser(user);
    }
    
    @Test
    public void getUserByID(){
        SqlSessionFactory sessionFactory = SqlSessionUtil.getSqlSessionFactory();
        SqlSession sqlSession = sessionFactory.openSession();
        IUser iUser = sqlSession.getMapper(IUser.class);
        User user = iUser.getUserByID(1);
        System.out.println("id为1的用户是"+user.getName());
    }
}
View Code

 基于注解的CRUD:

基于注解的实现方式和基于XML最大的区别在于我们不需要为每个实体类提供一个映射文件,而是在实体类操作的接口上添加注解,并在主配置文件中注册该类。所有的操作SQL都写在注解上。

操作接口:

package com.carter.dao;

import java.util.List;

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 com.carter.user.User;

public interface IUser {
    //这里方法名应该与映射文件中ID一致
    @Select("select * from user ")
    public List<User> getUserList();
    
    @Select("select * from `user` where user.id=#{userid}")
    public User getUserByID(int userid);
    
    @Insert("insert into user(name,score)values(#{name},#{score}) ")
    public int insertStu(User user);
    
    @Delete("delete from user where id=#{id}")
    public int deleteUser(int id);
    
    @Update("update user set name=#{name},score=#{score} where id=#{age}")
    public int updateUser(User user);
}

 

posted @ 2018-03-20 22:55  只要出发、就会到达  阅读(66)  评论(0)    收藏  举报