51 Mybatis02

1、回顾mybatis自定义和环境搭建+完善自定义Mybatis的注解开发
2、Mybatis基于代理Dao的CRUD操作 重点内容
3、CRUD中可能遇到的问题:参数的传递以及返回值的封装
4、介绍Mybatis基于传统dao方式的使用(自己编写dao的实现类) 了解的内容
5、mybatis主配置文件中的常用配置
properties标签
typeAliases标签 —解释Integer的写法
mappers标签的子标签:package


OGNL表达式:
Object Graphic Navigation Language
对象 图 导航 语言

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

IUserDao

package com.itheima.dao;

import com.itheima.domain.QueryVo;
import com.itheima.domain.User;

import java.util.List;

public interface IUserDao {
    /***
     *
     * 查询所有的操作
     */

    List<User> findAll();

    /***
     * 添加用户操作
     *
     * */
    void saveUser(User user);

    /**
     * 更新用户操作
     **/
    void updateUser(User user);
    /**
     * 删除用户操作
     * */
    void deleteUser(int id);

    /**
     * 根据id查询用户信息
     * */
    User findById(int id);

    /**
     * 根据名字进行模糊查询
     * */
    List<User> findByName(String name);

    /**
     * 查询个数
     * */
    int findTotal();

    /**
     * 使用自定义查询对象进行模糊查询
     * */
    List<User> findByVo(QueryVo queryVo);
}


IUserDao.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="com.itheima.dao.IUserDao">

    <resultMap id="userMap" type="com.itheima.domain.User">
        <id column="id" property="userId"/>
        <result column="username" property="userName"/>
        <result column="sex" property="userSex"/>
        <result column="address" property="userAddress"/>
        <result column="birthday" property="userBirthday"/>
    </resultMap>
    <select id="findAll"  resultMap="userMap">
        SELECT  * FROM USER ;
    </select>

    <insert id="saveUser" parameterType="com.itheima.domain.User">
        <!--获取插入之后的用户id值-->
        <selectKey keyProperty="userId" keyColumn="id" resultType="int" order="AFTER">
           select last_insert_id();
        </selectKey>

        INSERT INTO  USER (username,address,sex,birthday) values(#{userName},#{userAddress},#{userSex},#{userBirthday});
    </insert>

    <update id="updateUser" parameterType="com.itheima.domain.User">
         update user set username=#{userName},address=#{userAddress},sex=#{userSex},birthday=#{userBirthday} where id=#{userId};
    </update>

    <delete id="deleteUser" parameterType="int">
        delete from user where id = #{uid};
    </delete>
    
    <select id="findById" parameterType="int" resultType="com.itheima.domain.User">
        select * from User Where id = #{uid};
    </select>

    <select id="findByName" parameterType="String" resultMap="userMap" >
        select * from USER Where username LIKE #{username};
        <!-- select * from user where username like '%${value}%'-->
    </select>

    <select id="findTotal" resultType="int">
        select count(id) from user;
    </select>

    <select id="findByVo" parameterType="com.itheima.domain.QueryVo" resultType="com.itheima.domain.User">
        select * from USER Where username LIKE #{user.userName};
        <!-- select * from user where username like '%${value}%'-->
    </select>

    <!--总之还是将数据库的列名和实体类的属性对应起来最好-->
</mapper>

test

package com.itheima.test;

import com.itheima.dao.IUserDao;
import com.itheima.domain.QueryVo;
import com.itheima.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.IOException;
import java.io.InputStream;
import java.util.Date;
import java.util.List;

public class mybatisTest {

    private InputStream in;
    private SqlSession sqlSession;
    private IUserDao userDao;

    @Before//用于在测试方法执行之前执行
    public void init()throws Exception{
        //1.读取配置文件,生成字节输入流
        in = Resources.getResourceAsStream("SqlMapConfig.xml");
        //2.获取SqlSessionFactory
        SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in);
        //3.获取SqlSession对象
        sqlSession = factory.openSession();
        //4.获取dao的代理对象
        userDao = sqlSession.getMapper(IUserDao.class);
    }
    @After//用于在测试方法执行之后执行
    public void destroy()throws Exception{
        //提交事务
        sqlSession.commit();
        //6.释放资源
        sqlSession.close();
        in.close();
    }

    //测试查询所有的方法
    @Test
    public void testfindAll() throws IOException {


        List<User> users = userDao.findAll();
        for(User user : users) {
            System.out.println(user);
        }

    }
    //测试保存用户的方法
    @Test
    public void testInsertUser(){
        User user =new User();
        user.setUserName("111");
        user.setUserAddress("河南商丘");
        user.setUserSex("女");
        Date d=new Date();

        user.setUserBirthday(d);
        System.out.println("执行保存方法之前"+user);
        userDao.saveUser(user);
        System.out.println("执行保存方法之后"+user);

    }
    //测试更新用户的方法
    @Test
    public void testUpdateUser(){
        User user =new User();
        user.setUserId(41);
        user.setUserName("张笑笑111");
        user.setUserAddress("河南商丘");
        user.setUserSex("女");
        Date d=new Date();
        user.setUserBirthday(d);
        userDao.updateUser(user);
    }
    //测试删除用户的方法
    @Test
    public void testDeleteUser(){
        userDao.deleteUser(42);
    }
    //测试id查询用户的方法
    @Test
    public void testFindById(){
        User user = userDao.findById(41);
        System.out.println(user);
    }
    //测试名字模糊查询用户的方法
    @Test
    public void testFindByName(){

        List<User> users = userDao.findByName("%王%");//这种是用预编译的方式  占位符的方式
        //List<User> users = userDao.findByName("王");//这种是用字符创拼接的方式。
        for(User user:users){
            System.out.println(user);

        }
    }
    //使用聚合函数进行查询
    @Test
    public void testFindTotal(){
        int total = userDao.findTotal();
        System.out.println(total);
    }
    //使用自定义的查询对象进行模糊查询
    @Test
    public void tsetFindByVo(){
        QueryVo queryVo=new QueryVo();
        User user =new User();
        user.setUserName("%王%");
        queryVo.setUser(user);

        List<User> users = userDao.findByVo(queryVo);

        for (User u:users){
            System.out.println(u);
        }
    }

}

当出现数据库列名和实体类属性名不一致时

1 起别名的方法处理

使用别名查询
<!-- 配置查询所有操作 -->
<select id="findAll" resultType="com.itheima.domain.User">
select id as userId,username as userName,birthday as userBirthday,
sex as userSex,address as userAddress from user
</select>
运行结果:

2 定义resultMap

<!-- 建立 User 实体和数据库表的对应关系
type 属性:指定实体类的全限定类名
id 属性:给定一个唯一标识,是给查询 select 标签引用用的。
-->
<resultMap type="com.itheima.domain.User" id="userMap">
<id column="id" property="userId"/>
<result column="username" property="userName"/>
<result column="sex" property="userSex"/>
<result column="address" property="userAddress"/>
<result column="birthday" property="userBirthday"/>
</resultMap>
id 标签:用于指定主键字段
result 标签:用于指定非主键字段
column 属性:用于指定数据库列名
property 属性:用于指定实体类属性名称

映射配置

<!-- 配置查询所有操作 -->
<select id="findAll" resultMap="userMap">
select * from user
</select>

在这里插入图片描述

2实现类的方法实现增删改查

UserDaoImpl

package com.itheima.dao.Impl;

import com.itheima.dao.IUserDao;
import com.itheima.domain.User;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;

import java.util.List;

public class UserDaoImpl implements IUserDao {

    private SqlSessionFactory factory;

    public UserDaoImpl(SqlSessionFactory factory){
        this.factory = factory;
    }

    public List<User> findAll() {
        SqlSession session = factory.openSession();
        List<User> users = session.selectList("com.itheima.dao.IUserDao.findAll");
        session.close();
        return users;
    }

    public void saveUser(User user) {
        //1.根据factory获取SqlSession对象
        SqlSession session = factory.openSession();
        //2.调用方法实现保存
        session.insert("com.itheima.dao.IUserDao.saveUser",user);
        //3.提交事务
        session.commit();
        //4.释放资源
        session.close();
    }

    public void updateUser(User user) {
        SqlSession session = factory.openSession();
        //2.调用方法实现更新
        session.update("com.itheima.dao.IUserDao.updateUser",user);
        //3.提交事务
        session.commit();
        //4.释放资源
        session.close();
    }

    public void deleteUser(int id) {
//1.根据factory获取SqlSession对象
        SqlSession session = factory.openSession();
        //2.调用方法实现更新
        session.update("com.itheima.dao.IUserDao.deleteUser",id);
        //3.提交事务
        session.commit();
        //4.释放资源
        session.close();
    }

    public User findById(int id) {
        //1.根据factory获取SqlSession对象
        SqlSession session = factory.openSession();
        //2.调用SqlSession中的方法,实现查询一个
        User user = session.selectOne("com.itheima.dao.IUserDao.findById",id);
        //3.释放资源
        session.close();
        return user;
    }

    public List<User> findByName(String name) {
        //1.根据factory获取SqlSession对象
        SqlSession session = factory.openSession();
        //2.调用SqlSession中的方法,实现查询列表
        List<User> users = session.selectList("com.itheima.dao.IUserDao.findByName",name);
        //3.释放资源
        session.close();
        return users;
    }

    public int findTotal() {
        //1.根据factory获取SqlSession对象
        SqlSession session = factory.openSession();
        //2.调用SqlSession中的方法,实现查询一个
        Integer count = session.selectOne("com.itheima.dao.IUserDao.findTotal");
        //3.释放资源
        session.close();
        return count; 
    }
}

测试类

package com.itheima.test;

import com.itheima.dao.IUserDao;
import com.itheima.dao.Impl.UserDaoImpl;
import com.itheima.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.IOException;
import java.io.InputStream;
import java.util.Date;
import java.util.List;

public class mybatisTest {

    private InputStream in;

    private IUserDao userDao;

    @Before//用于在测试方法执行之前执行
    public void init()throws Exception{
        //1.读取配置文件,生成字节输入流
        in = Resources.getResourceAsStream("SqlMapConfig.xml");
        //2.获取SqlSessionFactory
        SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in);

        //4.获取dao的代理对象
        userDao = new UserDaoImpl(factory);
    }
    @After//用于在测试方法执行之后执行
    public void destroy()throws Exception{
        //提交事务

        in.close();
    }

    //测试查询所有的方法
    @Test
    public void testfindAll() throws IOException {


        List<User> users = userDao.findAll();
        for(User user : users) {
            System.out.println(user);
        }

    }
    //测试保存用户的方法
    @Test
    public void testInsertUser(){
        User user =new User();
        user.setUsername("111");
        user.setAddress("河南商丘");
        user.setSex("女");
        Date d=new Date();

        user.setBirthday(d);
        System.out.println("执行保存方法之前"+user);
        userDao.saveUser(user);
        System.out.println("执行保存方法之后"+user);

    }
    //测试更新用户的方法
    @Test
    public void testUpdateUser(){
        User user =new User();
        user.setId(41);
        user.setUsername("张笑笑222");
        user.setAddress("河南商丘");
        user.setSex("女");
        Date d=new Date();
        user.setBirthday(d);
        userDao.updateUser(user);
    }
    //测试删除用户的方法
    @Test
    public void testDeleteUser(){
        userDao.deleteUser(43);
    }
    //测试id查询用户的方法
    @Test
    public void testFindById(){
        User user = userDao.findById(41);
        System.out.println(user);
    }
    //测试名字模糊查询用户的方法
    @Test
    public void testFindByName(){

        List<User> users = userDao.findByName("%王%");//这种是用预编译的方式  占位符的方式
        //List<User> users = userDao.findByName("王");//这种是用字符创拼接的方式。
        for(User user:users){
            System.out.println(user);

        }
    }
    //使用聚合函数进行查询
    @Test
    public void testFindTotal(){
        int total = userDao.findTotal();
        System.out.println(total);
    }


}

在这里插入图片描述

两个重要的标签

properties 标签配置
typeAliases(类型别名)
package

<?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属性: 常用的
            用于指定配置文件的位置,是按照类路径的写法来写,并且必须存在于类路径下。
        url属性:
            是要求按照Url的写法来写地址
            URL:Uniform Resource Locator 统一资源定位符。它是可以唯一标识一个资源的位置。
            它的写法:
                http://localhost:8080/mybatisserver/demo1Servlet
                协议      主机     端口       URI

            URI:Uniform Resource Identifier 统一资源标识符。它是在应用中可以唯一定位一个资源的。
    -->
    <!--<properties url="file:///D:/IdeaProjects/day02_eesy_01mybatisCRUD/src/main/resources/jdbcConfig.properties">-->
    <properties resource="jdbcConfig.properties">
        <!-- <property name="driver" value="com.mysql.jdbc.Driver"></property>
         <property name="url" value="jdbc:mysql://localhost:3306/eesy_mybatis"></property>
         <property name="username" value="root"></property>
         <property name="password" value="1234"></property>-->
    </properties>

    <!--使用typeAliases配置别名,它只能配置domain中类的别名 -->
    <typeAliases>
        <!--typeAlias用于配置别名。type属性指定的是实体类全限定类名。alias属性指定别名,当指定了别名就再区分大小写
        <typeAlias type="com.itheima.domain.User" alias="user"></typeAlias>-->

        <!-- 用于指定要配置别名的包,当指定之后,该包下的实体类都会注册别名,并且类名就是别名,不再区分大小写-->
        <package name="com.itheima.domain"></package>
    </typeAliases>


    <environments default="mysql">
        <!--配置myql的环境-->
        <environment id="mysql">
            <!--配置事务的类型-->
            <transactionManager type="JDBC"></transactionManager>
            <!--配置数据源  连接池-->
            <dataSource type="POOLED">
            <!--配置数据库的四个基本信息-->
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/eesy_mybatis"/>
                <property name="username" value="root"/>
                <property name="password" value="root"/>
            </dataSource>
        </environment>
    </environments>

    <mappers>
        <!--<mapper resource="com/itheima/dao/IUserDao.xml"></mapper>-->
        <!-- package标签是用于指定dao接口所在的包,当指定了之后就不需要在写mapper以及resource或者class-->
        <package name="com.itheima.dao"></package>
    </mappers>
</configuration>

关于主配置文件中最后mapper中的class 和resource的问题
1 使用注解的方式来实现
在这里插入图片描述2使用xml配置的方式来实现

在这里插入图片描述3使用自定义实现dao的实现类的方式在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值