mybatis基本环节的搭建

https://blog.csdn.net/weixin_44954070/article/details/105618760
观看这个

mybatis_UserDao(没有实现类)

包结构图
在这里插入图片描述

实现SQL的CRUD代码

mybatis_UserDao(有Impl)

包类结构图
在这里插入图片描述
UserDaoImpl实现类代码
其中注意事项:

  1. 如果是sqlSession.insert()sqlSession.delete()、需要使用sqlSession来提交事务sqlSession.commit();否则这些事件会回滚,不会完成真正的业务逻辑。
  2. 这些语句传入的参数是:com.xiao.dao.UserDao.saveUser = 方法所在的接口位置+方法的名称
package com.xiao.dao.impl;

import com.xiao.dao.UserDao;
import com.xiao.domain.User;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;

import java.util.List;

/**
 * @_PackageName:com.xiao.dao.impl
 * @_ClassName:UserDaoImpl
 * @_Description:
 * @_Author:笑老二
 * @_data 2020/4/19 13:14
 */
public class UserDaoImpl implements UserDao {
    private SqlSessionFactory factory ;
    public UserDaoImpl(SqlSessionFactory factory){
        this.factory = factory;
    }
    public List<User> findAll() {
        //创建sqlSession
        SqlSession sqlSession = factory.openSession();
        //传入类型
        List<User> users = sqlSession.selectList("com.xiao.dao.UserDao.findAll");
        sqlSession.close();
        return users;
    }

    public void saveUser(User user) {
        //创建sqlSession
        SqlSession sqlSession = factory.openSession();
        //传入类型
        sqlSession.insert("com.xiao.dao.UserDao.saveUser",user);
        //提交事务
        sqlSession.commit();
        sqlSession.close();
    }

    public void delUser(Integer id) {
        //创建sqlSession
        SqlSession sqlSession = factory.openSession();
        //调用方法执行
        sqlSession.delete("com.xiao.dao.UserDao.delUser",id);
        //提交事务
        sqlSession.commit();
        sqlSession.close();
    }

    public void updateUser(User user) {
        //创建sqlSession
        SqlSession sqlSession = factory.openSession();
        //调用方法执行
        sqlSession.update("com.xiao.dao.UserDao.updateUser",user);
        //提交事务
        sqlSession.commit();
        sqlSession.close();
    }

    public User findById(Integer id) {
        //创建sqlSession
        SqlSession sqlSession = factory.openSession();
        //调用方法执行
        User user = sqlSession.selectOne("com.xiao.dao.UserDao.findById", id);
        //提交事务
        sqlSession.commit();
        sqlSession.close();
        return user;
    }

    public List<User> findByLikeName(String name) {
        //创建sqlSession
        SqlSession sqlSession = factory.openSession();
        //调用方法执行
        List<User> users = sqlSession.selectList("com.xiao.dao.UserDao.findByLikeName",name);
        //提交事务
        sqlSession.commit();
        sqlSession.close();
        return users;
    }

    public int findByTotalCount() {
        //创建sqlSession
        SqlSession sqlSession = factory.openSession();
        //调用方法执行
        int total = sqlSession.selectOne("com.xiao.dao.UserDao.findByTotalCount");
        //提交事务
        sqlSession.commit();
        sqlSession.close();
        return total;
    }
}

UserDao.xml配置
注意:

  1. #{} 与${}区别
    #{} 表示一个占位符号
    通过#{}可以实现preparedStatement 向占位符中设置值,自动进行 java 类型和 jdbc 类型转换,
    #{}可以有效防止 sql 注入。 #{}可以接收简单类型值或 pojo 属性值。 如果 parameterType 传输单个简单类
    型值,#{}括号中可以是 value 或其它名称。
    ${} 表示拼接 sql 串
    通过 ${}可以将 parameterType 传入的内容拼接在 sql中且不进行 jdbc 类型转换, ${}可以接收简
    单类型值或 pojo 属性值,如果 parameterType 传输单个简单类型值, ${}括号中只能是 value。
<?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.xiao.dao.UserDao">
    <!--查询所有-->
    <select id="findAll" resultType="User">
        select * from USER
    </select>

    <!--保存用户-->
    <!--如何保存了用户后可以让user获取到mysql赋予的id -->
    <insert id="saveUser" parameterType="com.xiao.domain.User">
        <selectKey keyColumn="id" resultType="int" keyProperty="id"  order="AFTER">
            select last_insert_id();
        </selectKey>
        insert into user (username,birthday,sex,address) values (#{username},#{birthday},#{sex},#{address});
    </insert>

    <!--删除用户-->
    <select id="delUser" parameterType="Integer">
        delete from user where id = #{id}
    </select>

    <!--更新用户-->
    <select id="updateUser" parameterType="com.xiao.domain.User">
        update user set username=#{username},birthday=#{birthday},sex=#{sex},address=#{address} where id=#{id}
    </select>

    <!--查询某个用户-->
    <select id="findById" parameterType="int" resultType="com.xiao.domain.User">
        select * from USER where id = #{id}
    </select>

    <!--模糊查询用户信息-->
    <select id="findByLikeName" parameterType="String" resultType="com.xiao.domain.User">
        <!--第一种方式-->
         select * from  user where username like #{username}
        <!--第二种方式(不常用)-->
        <!-- select * from user where username like '%${value}%' -->
    </select>

    <!--查询所有用户数-->
    <select id="findByTotalCount" resultType="int">
        select count(*) from USER
    </select>

</mapper>

SqlMapperConfig.xml配置

  1. 所以#{}是放在sql语句中充当传参的 ${}是放在加载配置文件充当传参数的
  2. 标签 < typeAliases>(类型别名),< package name="com.xiao.domain"/>
    在这里插入图片描述
  3. properties 标签配置
    在这里插入图片描述
  4. 使用外置配置文件
    这时dataSource就变成了
    注意此时的:dataSource中的${****}要和配置文件名字一样
<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>
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/eesy?useUnicode=true&amp;characterEncoding=utf-8
jdbc.username=root
jdbc.password=1234

  1. mappers (映射器)
    A. < mapper resource=" " />
    使用相对于类路径的资源(URI
    如:< mapper resource="com/itheima/dao/IUserDao.xml" />
    B. < mapper class=" " />
    使用 mapper 接口类路径
    如:< mapper class="com.itheima.dao.UserDao"/>
    注意:此种方法要求 mapper 接口名称和 mapper 映射文件名称相同,且放在同一个目录下面
    C.< package name=""/>
    注册指定包下的所有 mapper 接口
    如:< package name="cn.itcast.mybatis.mapper"/>
    注意:此种方法要求 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="database.properties">

    </properties>
    <!--typeAliases配置别名,它只能配置domain中的别名-->
    <typeAliases>
        <!-- 单个别名定义 -->
        <typeAlias alias="hehe" type="com.xiao.domain.User"/>
        <!--批量别名定义,扫描整个包下的类,别名为类名(首字母大写或小写都可以)-->
        <package name="com.xiao.domain"/>
    </typeAliases>
    <environments default="mysql">
        <environment id="mysql">
            <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>
<!--        <mapper url="file:///E:/CodeSeniorJava/mybatis_04_CRUD_demo02/src/main/resources/com/xiao/dao/UserDao.xml"/>-->
    <!--package标签能够用于指定dao接口所在的包,当指定了之后就不需要再写mapper以及resource以及class了-->
        <package name="com.xiao.dao"/>
    </mappers>
</configuration>

当完成了以上的配置信息后
在这里插入图片描述
parameterType 配置参数
基 本类 型和 String 我 们可 以直接 写类型 名称 ,也 可以 使用包 名 . 类名的 方式 ,例如 :
java.lang.String。
实体类类型,目前我们只能使用全限定类名。
究其原因,是 mybaits 在加载时已经把常用的数据类型注册了别名,从而我们在使用时可以不写包名,
而我们的是实体类并没有注册别名所以必须写全限定类名
resultType属性
resultType 属性可以指定结果集的类型,它支持基本类型和实体类类型。
我们在前面的 CRUD 案例中已经对此属性进行过应用了。
需要注意的是,它和 parameterType 一样,如果注册过类型别名的,可以直接使用别名。没有注册过的必须使用全限定类名。例如:我们的实体类此时必须是全限定类名(注册过指的是:你自己定义了或者像int、String这种类型
同时,当是实体类名称是,还有一个要求,实体类中的属性名称必须和查询语句中的列名保持一致,否则无法实现封装。

<!--查询某个用户-->
    <select id="findById" parameterType="int" resultType="com.xiao.domain.User">
        select * from USER where id = #{id}
    </select>
Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐