栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

MyBatis中的动态代理

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

MyBatis中的动态代理

1.动态代理存在的意义

在三层架构中,业务逻辑层要通过接口访问数据访问层的功能.动态代理可以实现.

2.动态代理的规范

1.UsersMapper.xml文件与UsersMapper.java的接口必须同一个目录下.
2.UsersMapper.xml文件与UsersMapper.java的接口的文件名必须一致,后缀不管.

3.UserMapper.xml文件中标签的id值与与UserMapper.java的接口中方法的名称完全一致.

UserMapper接口
package com.xin.mapper;

import com.xin.pojo.Users;

import java.util.List;


public interface UsersMapper {
    //查询全部用户信息
    List getAll();
    //根据用户主键查用户
    Users getById(Integer id);
    //根据用户名模糊查询用户
    List getByName(String name);
    //用户更新
    int update(Users users);
    //增加用户
    int insert(Users users);
    //根据主键删除用户
    int delete(Integer id);
}

UserMapper.xml文件



    
    
        select id,username,birthday,sex,address
        from users
        where id=#{id}
    
    
    
        update users set username=#{userName},birthday=#{birthday},sex=#{sex},address=#{address}
        where id=#{id}
    
    
    
        select id,username,birthday,sex,address
        from users
    
    
    
        select id,username,birthday,sex,address
        from users
        where username like '%${name}%'
    
    
    
        insert into users(username,birthday,sex,address) values(#{userName},#{birthday},#{sex},#{address})
    
    
    
        delete from users
        where id=#{id}
    

10)添加测试类,测试功能

package com.xin.test;

import com.xin.mapper.UsersMapper;
import com.xin.pojo.Users;
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.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.List;

public class MyTest {
    SqlSession sqlSession;
    //动态代理对象
    UsersMapper usersMapper;
    //日期的格式化
    SimpleDateFormat sf=new SimpleDateFormat("yyyy-MM-dd");
    @Before
    public void openSqlSession() throws IOException {
        //使用文件流读取核心配置文件SqlMapConfig.xml
        InputStream in= Resources.getResourceAsStream("SqlMapConfig.xml");
        //创建SqlSessionFactory工厂对象
        SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(in);
        //取出SqlSession对象
        sqlSession=sqlSessionFactory.openSession();
        //取出动态代理对象,完成接口中方法的调用,实则是调用xml文件中相应标签的功能
        usersMapper=sqlSession.getMapper(UsersMapper.class);
    }
    @After
    public void closeSqlSession() {
        sqlSession.close();
    }
    @Test
    public void testGetAll() {
        
        //调用接口中的方法,mybatis框架已经为我们把功能代理出来了
        List list=usersMapper.getAll();
        list.forEach(users-> System.out.println(users));
    }
    @Test
    public void testById() {

        Users users= usersMapper.getById(2);
        System.out.println(users);
    }
    @Test
    public void testUpdate() throws ParseException {
        Users users=new Users(7,"Lihua",sf.parse("2000-01-01"),"2","北京");
        int num=usersMapper.update(users);
        System.out.println(num);
        //切记切记切记:手工提交事务
        sqlSession.commit();
    }
    @Test
    public void testByName() {

        List list=usersMapper.getByName("张");
        list.forEach(users-> System.out.println(users));
    }
    @Test
    public void testInsert() throws ParseException {
        Users users=new Users("tom",sf.parse("2000-12-24"),"21","河南周口");
        int num=usersMapper.insert(users);
        System.out.println(num);
        sqlSession.commit();
    }
    @Test
    public void testDelete() {
        int num=usersMapper.delete(29);
        System.out.println(num);
        sqlSession.commit();
    }
}

4.优化mapper.xml文件注册


    
    
    
    
    
    
    
    
 
5.#{}占位符

传参大部分使用#{}传参,它的底层使用的是PreparedStatement对象,是安全的数据库访问 ,防止sql注入.
#{}里如何写,看parameterType参数的类型
1)如果parameterType的类型是简单类型(8种基本(封装)+String),则#{}里随便写.

===>入参类型是简单类型
    select id,username,birthday,sex,address
    from users
    where id=#{zar}  ===>随便写

2)parameterType的类型是实体类的类型,则#{}里只能是类中成员变量的名称,而且区分大小写.

     ===>入参是实体类
    insert into users (username, birthday, sex, address) 
    values(#{userName},#{birthday},#{sex},#{address})  ==>成员变量名称
   
6. ${}字符串拼接或字符串替换

1)字符串拼接,一般用于模糊查询中.建议少用,因为有sql注入的风险.
也分两种情况,同样的看parameterType的类型
A. 如果parameterType的类型是简单类型,则${}里随便写,但是分版本,如果是3.5.1及以下的版本,只以写value.

 
        select id,username,birthday,sex,address
        from users
        where username like '%${name}%'
    

测试:

@Test
    public void testByName() {
        List list=usersMapper.getByName("'or 1=1 or 1='");//sql注入
//        List list=usersMapper.getByName("张");
        list.forEach(users-> System.out.println(users));
    }


由于输入的是" ‘or 1=1 or 1=’ ",存在SQL注入,所有的信息都被查了出来
D. 优化后的模糊查询(以后都要使用这种方式)


测试;

@Test
    public void testGetByNameOrAddress() {
        List list=usersMapper.getByNameOrAddress("username","小");
        list.forEach(users-> System.out.println(users));
    }

@Test
    public void testGetByNameOrAddress() {
//        List list=usersMapper.getByNameOrAddress("username","小");
        List list=usersMapper.getByNameOrAddress("address","市");
        list.forEach(users-> System.out.println(users));
    }

7.返回主键值
 
        insert into users(username,birthday,sex,address) values(#{userName},#{birthday},#{sex},#{address})
    

测试:

 @Test
    public void testInsert() throws ParseException {
        Users users=new Users("uu",sf.parse("2000-12-24"),"21","河南周口");
        int num=usersMapper.insert(users);
        System.out.println(num);
        System.out.println(users);
        sqlSession.commit();
    }


可以看到,主键id=null,是因为在创建Users对象时,并没有给id传参,所以为null

在插入语句结束后, 返回自增的主键值到入参的users对象的id属性中.


        
            select last_insert_id()
        
        insert into users(username,birthday,sex,address) values(#{userName},#{birthday},#{sex},#{address})

标签的参数详解:
keyProperty: users对象的哪个属性来接返回的主键值
resultType:返回的主键的类型
order=“BEFORE”:在执行inser插入语句执行前,返回主键的值
order=“AFTER”:执行insert插入语句后返回主键的值

测试:

@Test
    public void testInsert() throws ParseException {
        Users users=new Users("uu",sf.parse("2000-12-24"),"21","河南周口");
        int num=usersMapper.insert(users);
        System.out.println(num);
        System.out.println(users);
        sqlSession.commit();
    }

8.UUID

这是一个全球唯一随机字符串,由36个字母数字中划线组成.

UUID uuid = UUID.randomUUID();
System.out.println(uuid.toString().replace("-","").substring(20));
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1005961.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号