mybatis crud 学习总结02
阅读原文时间:2023年07月08日阅读:4

原因:数据库的连接直接写到配置(mybati-config.xml)里存在安全隐患

解决:将配置的信息放到一个文件中管理

右键resources --> File --> 填“db.properties”

db.properties

driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/mybatis?useSSL=true&useUnicode=true&characterEncoding=utf8
username=root
password=123

到配置中进行引入(properties标签)和使用(${}

mybati-config.xml

<?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> <!-- 配置标签 -->
    <!-- 导入db.properties文件 , 使用 ${} 引入-->
    <properties resource="db.properties"/>

<environments default="development"> <!-- 总环境  默认:development -->
    <environment id="development"> <!-- 环境 名为:development -->
        <transactionManager type="JDBC"/> <!-- 事务管理器  类型:JDBC (事务:确保操作完整性,要么成功要么失败)-->
        <dataSource type="POOLED"> <!-- 数据源 类型:POOLED-->
            <property name="driver" value="${driver}"/> <!--属性 名:驱动 值:..mysql(使用的何种数据库).. -->
            <!-- 属性 名:url 值:数据连接地址+规则(如:字符集:UTF-8) -->
            <property name="url" value="${url}"/>
            <property name="username" value="${username}"/> <!-- 属性 名:数据库用户名  值:root-->
            <property name="password" value="${password}"/> <!--属性 名:密码  值:123 -->
        </dataSource>
    </environment>
</environments>
<mappers> <!--映射器 -->
    <mapper resource="com/dao/userMapper.xml"/> <!-- 映射  资源:userMapper.xml -->
</mappers>
</configuration>

原因:为了减少代码的冗余

例如:在userMapping中会常常用到:com.pojo.User,可以进行别名设置。

解决:设置别名,用别名代替全名,减少代码冗余

mybatis-config.xml -->configuration(代码最好放到该标签下的第一位)

    <!--配置别名,注意顺序:最好能放到configuration标签下的第一位。-->
    <typeAliases>
        <typeAlias type="com.pojo.User" alias="User"/> <!--设置com.pojo.User 别名为:User-->
    </typeAliases>

指定包进行别名设置(一般都是使用这个方法)

mybatis-config.xml -->configuration(代码最好放到该标签下的第一位)

<typeAliases>
    <package name="com.pojo"/> <!--在该包下所有文件设别名为:文件名-->
</typeAliases>

验证效果:

com/dao/userMapper.xml 为设别名前(com.pojo.User)的代码

<select id="selectUser" resultType="com.pojo.User">

设置了别名后(使用别名:User)的代码,减少了代码冗余

<select id="selectUser" resultType="User">

使用settings标签实现

  • 懒加载
  • 日志实现
  • 缓存开启关闭

默认的settings如下,通过修改里面的设置(setting)实现相应的功能。

mybatis-config.xml

<settings>
     <setting name="cacheEnabled" value="true"/>
     <setting name="lazyLoadingEnabled" value="true"/>
     <setting name="multipleResultSetsEnabled" value="true"/>
     <setting name="useColumnLabel" value="true"/>
     <setting name="useGeneratedKeys" value="false"/>
     <setting name="autoMappingBehavior" value="PARTIAL"/>
     <setting name="autoMappingUnknownColumnBehavior" value="WARNING"/>
     <setting name="defaultExecutorType" value="SIMPLE"/>
     <setting name="defaultStatementTimeout" value="25"/>
     <setting name="defaultFetchSize" value="100"/>
     <setting name="safeRowBoundsEnabled" value="false"/>
     <setting name="mapUnderscoreToCamelCase" value="false"/>
     <setting name="localCacheScope" value="SESSION"/>
     <setting name="jdbcTypeForNull" value="OTHER"/>
     <setting name="lazyLoadTriggerMethods" value="equals,clone,hashCode,toString"/>
</settings>

问题:如果在 configuration标签 上出现红色波浪线

鼠标移到该标签出现:The content of element type "configuration" must match "(properties?,settings?,typeAliases?,typeHandlers?,objectFactory?,objectWrapperFactory?,reflectorFactory?,plugins?,environments?,databaseIdProvider?,mappers?)".

解决:因为位置错误,settings标签要放在properties标签后面。

1、示范:查询功能

1、设置接口

userMapper (接口)

package com.dao;

import com.pojo.User;

import java.util.List;

public interface userMapper {
    //查询全部用户
    List<User> selectUser();
    //根据id查询用户
    User selectUserById(int id);
}

2、在userMapper.xml设置SQL语句

userMapper.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.dao.userMapper"> <!-- 映射器  命名空间:映射到那个类的地址  -->
    <select id="selectUser" resultType="User"> <!-- 查询  名:selectUser  结果类型:com.pojo.User -->
        select * from user
    </select>

    <select id="selectUserById" resultType="User">
        select * from user where id = #{id}
    </select>
</mapper>

3、测试

MyTest.java

import com.dao.userMapper;
import com.pojo.User;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;
import utils.MybatisUtils;

import java.util.List;

public class MyTest {
    @Test
    public void selectUser() {
        SqlSession session = MybatisUtils.getSession();
        userMapper mapper = session.getMapper(userMapper.class);

        User user = mapper.selectUserById(1);
        System.out.println("通过Id查询:"+user);

        System.out.println("查询所有:");
        List<User> userAll = mapper.selectUser();
        for (User user1 : userAll) {
            System.out.println(user1);
        }

        session.close();
    }
}

com/dao/userMapper (接口)

package com.dao;

import com.pojo.User;

import java.util.List;

public interface userMapper {
    //查询全部用户
    List<User> selectUser();
    //根据id查询用户
    User selectUserById(int id);
    //添加一个用户
    int addUser(User user);
    //修改一个用户
    int updateUser(User user);
    //根据id删除用户
    int deleteUser(int id);
}

userMapper.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.dao.userMapper"> <!-- 映射器  命名空间:映射到那个类的地址  -->
    <select id="selectUser" resultType="User"> <!-- 查询  名:selectUser  结果类型:com.pojo.User -->
        select * from user
    </select>

    <select id="selectUserById" resultType="User">
        select * from user where id = #{id}
    </select>

    <insert id="addUser" parameterType="User">
        insert into user (id,name,pwd) values (#{id},#{name},#{pwd})
    </insert>

    <update id="updateUser" parameterType="User">
        update user set name=#{name},pwd=#{pwd} where id = #{id}
    </update>

    <delete id="deleteUser" parameterType="int">
        delete from user where id = #{id}
    </delete>
</mapper>

MyTest.java

import com.dao.userMapper;
import com.pojo.User;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;
import utils.MybatisUtils;

public class MyTest {
    @Test
    public void selectUser() {
        SqlSession session = MybatisUtils.getSession();
        userMapper mapper = session.getMapper(userMapper.class);

        /*通过id查询*/
/*        User user = mapper.selectUserById(1);
        System.out.println("通过Id查询:"+user);*/

        /*查询所有用户*/
/*        System.out.println("查询所有:");
        List<User> userAll = mapper.selectUser();
        for (User user1 : userAll) {
            System.out.println(user1);
        }*/

       /*增加用户*/
/*        User user = new User(6,"赵六","chaoliu"); // 到实体类User中设置:有参构造
        int i = mapper.addUser(user);
        System.out.println(i); // 输出为1,时表示增加一个用户成功
        session.commit(); // 提交事务,没有的话交不到数据库*/

        /*根据删除*/
/*        int i = mapper.deleteUser(6);
        System.out.println(i); // 输出为1,表示删除一个用户成功
        session.commit(); //提交事务,重点!不写的话不会提交到数据库*/

        /*修改*/
        User user = mapper.selectUserById(1);
        user.setPwd("newPassword");
        int i = mapper.updateUser(user);
        System.out.println(i);
        session.commit(); //提交事务,重点!不写的话不会提交到数据库

        session.close();
    }
}