【mybatis】大概总结(一)

原生访问数据库方法
总配置文件
mapper配置
mapper接口
使用示例


原生访问数据库方法:jdbc

jdbc编程步骤:

  1. 加载数据库驱动
  2. 创建并获取数据库链接
  3. 创建jdbc statement对象
  4. 设置sql语句
  5. 设置sql语句中的参数(使用preparedStatement)
  6. 通过statement执行sql并获取结果
  7. 对sql执行结果进行解析处理
  8. 释放资源(resultSet、preparedstatement、connection)

缺点:每次对数据库操作时就得建立连接,用完又得释放,非常不方便,且对数据库造成压力较大。不灵活, 程序耦合度高。


–Mybatis–

与hibernate类似,mybatis也让表和java类产生映射关系,通过配置映射文件实现。

可创建相应实体类.xml,并在mybatis配置文件中加载(这里省略这种方法)。

首先配置mybatis总配置文件SqlMapConfig.xml

注意事项:

  • 标签有固定的配置顺序
    properties(属性)
    settings(全局配置参数)
    typeAliases(类型别名)
    typeHandlers(类型处理器)
    objectFactory(对象工厂)
    plugins(插件)
    environments(环境集合属性对象)
    environment(环境子属性对象)
    transactionManager(事务管理)
    dataSource(数据源)
    mappers(映射器)
  • mybatis使用自带的数据库连接池,不支持第三方连接池(网上有添加方法)

配置建议:

  • 别名配置typeAliases:使用批量配置,标签里加入

    <package name="com.me.domain"/>
    

    其中com.me.domain是你要自动配置的包里类的别名(用对应类名配置)

  • mappers映射器配置:使用批量配置,标签里加入

    <package name="com.me.mapper"/>
    

    其中com.me.mapper对应配置的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>

    <properties resource="db.properties"></properties>

    <typeAliases>
        <package name="com.me.domain"/>
    </typeAliases>

    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"></transactionManager>
            <dataSource type="POOLED">
                <property name="driver" value="${jdbc.driver}"/>
                <property name="url" value="${jdbc.url}"/>
                <property name="username" value="${jdbc.username}"/>
                <property name="password" value="${jdbc.password}"/>
            </dataSource>
        </environment>
    </environments>

    <mappers>
        <package name="com.me.mapper"/>
    </mappers>

</configuration>

mapper映射器配置

输入映射:
resultType指定输入参数类型:

  • 简单类型(直接使用)
  • hashmap(直接使用)
  • pojo的包装类型(常用):
    通过创建一个新的类,在这个类里创建想用来操作的输入参数,并生成set和get方法

输出映射:

  • resultType:列名与属性名一致才能成功映射
    • 输出简单类型
    • 输出pojo对象和列表
  • resultMap:可以定义列的别名,通过别名来映射
    • 输出配置的resultMap的id对应的对象

resultMap需要先在mapper里配置resultMap(使用时若要用其他mapper里的resultMap配置,需要在前面加上对应mapper的namespace)示例:

<!-- 定义resultMap
将SELECT id id_,username username_ FROM USER 和User类中的属性作一个映射关系

type:resultMap最终映射的java对象类型,可以使用别名
id:对resultMap的唯一标识
 -->
 <resultMap type="user" id="userResultMap">
    <!-- id表示查询结果集中唯一标识 
    column:查询出来的列名
    property:type指定的pojo类型中的属性名
    最终resultMap对column和property作一个映射关系 (对应关系)
    -->
    <id column="id_" property="id"/>
    <!-- 
    result:对普通名映射定义
    column:查询出来的列名
    property:type指定的pojo类型中的属性名
    最终resultMap对column和property作一个映射关系 (对应关系)
     -->
    <result column="username_" property="username"/>

 </resultMap>

使用示例:

<select id="findUserByIdResultMap" parameterType="int" resultMap="userResultMap">
    SELECT id id_,username username_ FROM USER WHERE id=#{value}
</select>

另外在接口中,返回类型写map对应实体类就OK


Mapper配置示例:

<!DOCTYPE mapper
    PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
    "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="com.me.mapper.GoodsMapper">

<resultMap type="goods" id="goodsResultMap">
    <id column="gname_haha" property="gname" />
    <result column="price_haha" property="price" />
</resultMap>

<insert id="insertGoods" parameterType="goods">
    INSERT INTO GOODS(gname,price) VALUE(#{gname},#{price})
</insert>

<select id="selectall" resultMap="goodsResultMap">
    SELECT gname gname_haha,price price_haha FROM goods
</select>


Mapper接口:

创建mapper.xml映射器对应的接口。
在mapper.xml中配置的方法,需要在mapper接口类里配置:
其中必须符合以下个规范:

  • mapper接口类和映射文件在同一包下
  • mapper接口里方法名与映射文件配置id一致
  • mapper接口方法参数和映射文件配置参数类型一致
  • mapper接口方法返回类型和映射文件配置参数类型一致(可以用list<类>,会自动调用selectlist返回对应对象的list集合)

示例:

package com.me.mapper;

import java.util.List;

import com.me.domain.User;
import com.me.domain.UserQuery;

public interface UserMapper {
    public User findUserById(Integer userid) throws Exception;

    public User selectUserQuery(UserQuery userQuery) throws Exception;

    public void updateUser(User user) throws Exception;

    public List<User> findUserByName(String string) throws Exception;

    public List<User> selectUserList(UserQuery userQuery) throws Exception;
}

使用mapper操作数据:

示例:

import java.io.IOException;
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 com.me.domain.Goods;
import com.me.domain.User;
import com.me.domain.UserQuery;
import com.me.mapper.GoodsMapper;
import com.me.mapper.UserMapper;

public class Tmybati {

    SqlSessionFactory sessionFactory;
    //这个注解会让这个方法在test方法前执行
    @Before
    public void a() throws IOException {
        String string="SqlMapConfig.xml";

        InputStream inputStream=Resources.getResourceAsStream(string);

        sessionFactory=new SqlSessionFactoryBuilder().build(inputStream);

    }

    //测试方法
    @Test
    public void tess() throws Exception {
        SqlSession session=sessionFactory.openSession();
        UserMapper userMapper=session.getMapper(UserMapper.class);
/*        
        User user2=new User();
        user2.setUserid(1111);

        Goods goods=new Goods();
        goods.setGname("吴克");
        goods.setPrice(1111);

        UserQuery userQuery=new UserQuery();
        userQuery.setUser(user2);
        userQuery.setGoods(goods);

        List<User> users=userMapper.selectUserList(userQuery);
        users.stream().forEach(System.out::println);

        User user=userMapper.findUserById(1111);
        System.out.println(user);*/

        Goods dGoods =new Goods();
        dGoods.setGname("吴克5");
        dGoods.setPrice(1111);
        GoodsMapper goodsMapper=session.getMapper(GoodsMapper.class);
        List<Goods> goods=goodsMapper.selectall();

        goods.stream().filter(n->n.getPrice()==123).forEach(System.out::println);

        session.commit();
        session.close();

    }
}