79.【Mybatis】(二)

简介: 79.【Mybatis】

(三)、CURD

1.Mapper实现类

首先我们我们要去写一个接口-----》 然后去.xml配置接口的具体用法-----》最后我们在测试类中进行测试.

写一个接口

package Com.Jsxs.Dao;
import Com.Jsxs.pojo.User;
import java.util.List;
public interface UserMapper {
//    查询全部用户
    List<User> getUserList();
//    根据ID查询用户
    User getUserById(int id);
//    增加一个用户
    int addUser(User user);
//    删除一个用户
    int removeUser(int id);
//    更改一个用户的信息
    int updateUser();
}

配置.xml文件,对其进行具体化的实现

<?xml version="1.0" encoding="UTF8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--namespace绑定一个对应的Dao/Mapper接口-->
<mapper namespace="Com.Jsxs.Dao.UserMapper">
<!--    查询语句全部用户-->
    <select id="getUserList" resultType="Com.Jsxs.pojo.User">
        select *from mybatis.user
    </select>
<!--    根据ID查询用户-->
    <select id="getUserById" parameterType="int" resultType="Com.Jsxs.pojo.User">
        select *from mybatis.user where id=#{id}
    </select>
<!--    增加一个用户,对象中的可以直接取出来-->
    <insert id="addUser" parameterType="Com.Jsxs.pojo.User">
        insert into mybatis.user(id,name,pwd) values (#{id},#{name},#{pwd})
    </insert>
<!--    删除一个用户-->
    <delete id="removeUser" parameterType="int">
        delete from mybatis.user where id=#{id}
    </delete>
<!--    更改用户的信息-->
    <update id="updateUser" >
        update  mybatis.user set pwd="123456789"
    </update>
</mapper>

进行测试的操作

package Com.Jsxs.Dao;
import Com.Jsxs.pojo.User;
import Com.Jsxs.utils.MybatisUtils;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;
import java.util.List;
public class UserDaoTest {
    /**
     * 查询全部的用户信息
     */
    @Test
    public void test(){
//        第一步: 获取sqlSession对象
        SqlSession sqlSession = MybatisUtils.getSqlSession();
//        方式一:  执行SQL
//        UserDao userDao = sqlSession.getMapper(UserDao.class);
//        List<User> userList = userDao.getUserList();
//        方式二:
        List<User> userList = sqlSession.selectList("Com.Jsxs.Dao.UserMapper.getUserList");
        for (User user : userList) {
            System.out.println(user);
        }
//        关闭sqlSession
        sqlSession.close();
    }
    /*
    * 根据用户的id进行查询用户
    * */
    @Test
    public void test2(){
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        User userById = mapper.getUserById(1);
        System.out.println(userById);
        sqlSession.close();
    }
//    增删改需要提交事务
    /**
     * 添加数据
     */
    @Test
    public void test3(){
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        int addUser = mapper.addUser(new User(4, "傻子", "258987"));
        if (addUser>0){
            System.out.println("插入成功!");
        }
//        提交事务
        sqlSession.commit();
//        关闭
        sqlSession.close();
    }
/**
 *  删除用户的信息
 */
        @Test
        public void test4(){
            SqlSession sqlSession = MybatisUtils.getSqlSession();
            UserMapper mapper = sqlSession.getMapper(UserMapper.class);
            int i = mapper.removeUser(4);
            if (i>0){
                System.out.println("已经删除了ID为"+i+"的用户");
            }
            sqlSession.commit();
            sqlSession.close();
        }
    /**
     * 更改用户的信息
     */
    @Test
    public void test5(){
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        int i = mapper.updateUser();
        if (i>0){
            System.out.println("修改密码成功");
        }
        sqlSession.commit();
        sqlSession.close();
    }
}
(1).namespace

namespce中的包名要和接口的包名一致

(2).select

id : 就是对应namespace中的方法名

resultType: Sql执行语句的返回值(增删改没结果返回类型)

parameterType: 参数类型。如果没有参数类型的话(此处可以省略)

(3).insert
(4)update
(5).delete

2.增删改的注意事项

(1).占位符号

#{参数}

(2).增删改必须要提交事务

sqlSession.commit(),不提交事务的话,我们实际的操作就不会生效。

(四)、错误排查指导

中文错误解决办法: 在xml配置文件中把最上面的UTF-8改为UTF8即可
标签不要写错
在映射路径的时候,我们要用/而不是.

(五)、万能的Map(切记类型别名)

1.Map的公要

定义一个Map数组: Map<String,Object> map

在测试类中定义Map,定义的是HashMap()

然后利用map.put()进行追加

最后进行元素的追加

假设我们的实体类,或则数据库的表,字段或则参数过多,我们应当考虑使用Map!如果不使用Map那么我们的添加的字段名要和实体类的属性值应该一一对应,否则会报错。第一个参数一定要是: String,第二个参数可以是Obiect/具体的

package Com.Jsxs.Dao;
import Com.Jsxs.pojo.User;
import java.util.List;
import java.util.Map;
public interface UserMapper {
//    查询全部用户
    List<User> getUserList();
//    根据ID查询用户
    User getUserById(int id);
//    增加一个用户
    int addUser(User user);
//    增加一个用户
    int addUser2(Map<String,Object> map);
//    删除一个用户
    int removeUser(int id);
//    更改一个用户的信息
    int updateUser();
}

Map的key值

<?xml version="1.0" encoding="UTF8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--namespace绑定一个对应的Dao/Mapper接口-->
<mapper namespace="Com.Jsxs.Dao.UserMapper">
<!--    查询语句全部用户-->
    <select id="getUserList" resultType="Com.Jsxs.pojo.User">
        select *from mybatis.user
    </select>
<!--    根据ID查询用户-->
    <select id="getUserById" parameterType="int" resultType="Com.Jsxs.pojo.User">
        select *from mybatis.user where id=#{id}
    </select>
<!--    增加一个用户,对象中的可以直接取出来-->
    <insert id="addUser" parameterType="Com.Jsxs.pojo.User">
        insert into mybatis.user(id,name,pwd) values (#{id},#{name},#{pwd})
    </insert>
<!--    删除一个用户-->
    <delete id="removeUser" parameterType="int">
        delete from mybatis.user where id=#{id}
    </delete>
<!--    更改用户的信息-->
    <update id="updateUser" >
        update  mybatis.user set pwd="123456789"
    </update>
<!--    利用Map增加一个用户 -->
    <insert id="addUser2" parameterType="map">
<!--        map的key值-->
        insert into mybatis.user(id,name,pwd) values(#{userid},#{username},#{password});
    </insert>
</mapper>
@Test
public void test6(){
    SqlSession sqlSession = MybatisUtils.getSqlSession();
    UserMapper mapper = sqlSession.getMapper(UserMapper.class);
    HashMap<String, Object> map = new HashMap<>();
    map.put("userid",4);
    map.put("username","小直筒啊");
    map.put("password","1234566");
    int i = mapper.addUser2(map);
    if (i>0){
        System.out.println("添加成功");
    }
    sqlSession.commit();
    sqlSession.close();
}

2.Map和对象传递参数的区别

(1).Map传递参数,直接在sql中取出key值即可. 【parameterType=“map”】

(2).对象传递参数,直接在sql中取出对象的属性即可(实体类的数据)【parameterType=“Object”】

(3).如果接口中只有一个基本类型参数的情况下,利用对象属【parameterType=“Object/不写”】

(4).如果接口中有多个基本类型参数的情况下,;利用Map/注解

@Test
public void test7(){
    SqlSession sqlSession = MybatisUtils.getSqlSession();
    UserMapper mapper = sqlSession.getMapper(UserMapper.class);
    HashMap<String, Object> map = new HashMap<>();
    map.put("id_one",1);
    map.put("name_one","吉士先生");
    User uer = mapper.getUer(map);
    System.out.println(uer);
    sqlSession.close();
}
<!--    利用Map根据两个条件进行数据的查找-->
    <select id="getUer" parameterType="map" resultType="Com.Jsxs.pojo.User">
        select *from mybatis.user where id=#{id_one} and name=#{name_one};
    </select>
//    根据ID和用户名查找数据
    User getUer(Map<String,Object> map);

(六)、模糊查询

1.模糊查询 like(通配符放在java代码中)有注入问题

//    进行模糊查询
    List<User> getUserLike(String name);
<!--    进行模糊查询的操作-->
    <select id="getUserLike" resultType="Com.Jsxs.pojo.User" >
        select *from mybatis.user where name like #{name};
    </select>
@Test
public void test8(){
    SqlSession sqlSession = MybatisUtils.getSqlSession();
    UserMapper mapper = sqlSession.getMapper(UserMapper.class);
    List<User> userLike = mapper.getUserLike("%吉%");
    for (User user : userLike) {
        System.out.println(user);
    }

注入问题

2.通配符放在sql语句中,可以防止SQL注入问题

@Test
public void test8(){
    SqlSession sqlSession = MybatisUtils.getSqlSession();
    UserMapper mapper = sqlSession.getMapper(UserMapper.class);
    List<User> userLike = mapper.getUserLike("吉");
    for (User user : userLike) {
        System.out.println(user);
    }
}
<!--    进行模糊查询的操作-->
    <select id="getUserLike" resultType="Com.Jsxs.pojo.User" >
        select *from mybatis.user where name like "%" #{name} "%";
    </select>


相关文章
|
10天前
|
SQL 缓存 Java
浅谈mybatis
浅谈mybatis
9 1
|
1月前
|
SQL Java 数据库连接
从0开始回顾Mybatis
Mybatis 1、什么是Mybatis? 概念: 1. Mybatis 是一个半 ORM(对象关系映射)框架,它内部封装了 JDBC,开发时只需要关注 SQL 语句本身,不需要花费精力去处理加载驱动、创建连接、创建statement 等繁杂的过程。程序员直接编写原生态 sql,可以严格控制 sql 执行性能,灵活度高。 2. MyBatis 可以使用 XML 或注解来配置和映射原生信息,将 POJO 映射成数据库中的记录,避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。 缺点: 1. SQL语句的编写工作量较大,尤其当字段多、关联表多时,对开发人员编写SQL语句的功底有一定要求
|
SQL Java 数据库连接
Mybatis之discriminator(鉴别器)详解
前言 最近干了一个工作是使用discriminator去写一个新的API,那么写这个新的API原因是什么呢?原因是这样的:我们的项目使用Mybatis,我们项目中有一个实体类叫做User,在User中还含有很多别的实体类,例如Role,Permission,Address等(有经验的肯定知道这种嵌套实体类的情况,使用和)。
3890 0
|
7月前
|
SQL 安全 Java
Mybatis
参数传递 单个普通参数:Mybatis可以直接使用这个值,取值#{ },不会对它进行处理 多个参数:任意多个参数,都会被Mybatis封装成一个Map传入,map的key时param1,param2,或者0.1.2.......,就是参数的值
27 1
|
8月前
|
Java 数据库连接 测试技术
Mybatis-PLUS详解
Mybatis-PLUS详解
174 0
|
4月前
|
Java 数据库连接 测试技术
mybatis中@Many
mybatis中@Many
31 0
|
7月前
|
SQL Java 数据库连接
|
7月前
|
SQL Java 数据库连接
|
8月前
|
SQL Java 数据库连接
Mybatis Plus
Mybatis Plus
|
8月前
|
SQL Java 数据库连接
MyBatis(下)
MyBatis(下)