20200107——day02 mybatis

总结
sqlsessionfactorybuild接受sqlmapconfig.xml文件流,构建出sqlsessionfactory对象

sqlsessionfactory读取sqlmapconfig.xml连接数据库和mapper映射信息,用来生产真正操作数据库的sqlsession对象

sqlsession对象有两大作用 1)生成接口代理对象 2)定义通用增删改查

在sqlsessionImpl对象的getMapper方法中分两步来实现,第一,先用sqlsessionfactory读取数据库连接信息创建connection对象。第二,通过jdk代理模式创建出代理对象作为getMapper方法的返回值,这里主要工作是创建代理对象时第三个参数处理类里面得到sql语句,执行crud操作。

封装结果集,我们都需要对返回的数据库结果集进行封装,变成java对象返回给调用者,我们还要必须知道调用者所需要的返回类型。

插入表

  @Test
    public void testSave() throws  Exception{
        User user = new User();
        user.setAddress("吉林长春");
        user.setUsername("马铭泽");
        user.setSex("男");
        user.setBirthday(new Date());

        userDao.saveUser(user);
        sqlSession.commit();

    }
    <insert id="saveUser" parameterType="com.mmz.domain.User" >
        insert into user(username,address,sex,birthday) values(#{username},#{address},#{sex},#{birthday});
    </insert>

最后别忘了要加上sqlseesion.commit放在@After中

package com.mmz.test;

import com.mmz.dao.UserDao;
import com.mmz.domain.User;
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.After;
import org.junit.Before;
import org.junit.Test;

import java.io.InputStream;
import java.util.Date;
import java.util.List;

/**
 * @Classname MybatisTest
 * @Description TODO
 * @Date 2020/1/7 12:21
 * @Created by mmz
 */
public class MybatisTest {
    private InputStream inputStream;
    private SqlSession sqlSession;
    private UserDao userDao;
    private SqlSessionFactory sqlSessionFactory;
    private SqlSessionFactoryBuilder sqlSessionFactoryBuilder;

    @Before
    public void init() throws Exception{
        inputStream = Resources.getResourceAsStream("SqlMapConfig.xml");
        //2.创建工厂
        sqlSessionFactoryBuilder  = new SqlSessionFactoryBuilder();
        sqlSessionFactory = sqlSessionFactoryBuilder.build(inputStream);
        //3.使用工厂生产对象
        sqlSession =  sqlSessionFactory.openSession();
        //4.使用sqlsessio,创建Dao接口的代理对象
        userDao = sqlSession.getMapper(UserDao.class);
    }
    @After
    public void destroy()throws  Exception{
        sqlSession.commit();
        sqlSession.close();
        inputStream.close();
    }
    @Test
    public void testFind(){
        List<User> users = userDao.findAll();
        for (User user:users
        ) {
            System.out.println(user);
        }
    }

    @Test
    public void testSave() throws  Exception{
        User user = new User();
        user.setAddress("吉林长春");
        user.setUsername("马铭泽");
        user.setSex("男");
        user.setBirthday(new Date());

        userDao.saveUser(user);

    }

    @Test
    public void testUpdate() throws  Exception{
        User user = new User();
        user.setId(51);
        user.setAddress("吉林长春");
        user.setUsername("咕噜咕噜");
        user.setSex("男");
        user.setBirthday(new Date());

        userDao.updateUser(user);
    }
    @Test
    public void testDetele() throws Exception{
        userDao.deleteUser(48);
    }

    @Test
    public void testFindById() throws Exception{
        User user  = userDao.findById(52);
        System.out.println(user);
    }

    @Test
    public void testFindByName() throws Exception{
        List<User> users = userDao.findByName("%小%");
        System.out.println(users);
    }
}

关于增删改查的代码都在这里了

selectKey
在这里插入图片描述

mybatis的参数

ognl表达式
object graphic navigation language
对象 图 导航 语言

它是通过对象的取值方法来获取数据,在写法上把get给省略了
比如我们获取用户名称
user.getUsername
OGNL表达式写法user.username
mybatis中,为什么能直接写username,而不用user.呢
因为在parameterType中,已经提供了属性所属的类,所以此时不需要写对象名
传递pojo包装对象

问题出现
当我们如果查询的字段与映射到的pojo类不一致怎么办
第一种方法用as

在sql语句的层面上解决了问题

第二种是resultMap,利用配置的方式
在这里插入图片描述
resultMap的id属性是为了给后面的引用的,type是映射到的pojo对象
result标签中的property 第一个对应的是pojo中的字段名字,colunn对应的是数据库中的字段名字
id 同理

properties属性
可以通过属性resource这个属性,或者在其内部定义property

url属性,按照url的写法来写
url:uniform resource locator 统一资源定位符 它是一个唯一可以标识资源的位置
它的写法:
协议 主机 端口 url

别名typeAliases
只能配置domain中的别名
少写一些包名和权限名
在这里插入图片描述

package用于指定别名的包,当指定之后,该包下的实体类都会注册别名,类名就是别名
在这里插入图片描述

发布了657 篇原创文章 · 获赞 39 · 访问量 6万+

猜你喜欢

转载自blog.csdn.net/qq_36344771/article/details/103873401