木舟0基础学习Java的第二十八天(常见的Java框架,MyBatis框架,动态SQL,缓存机制,多表关联查询,注释开发,逆向工程,LOG4J,Lombok)

news2024/9/20 18:27:10

常见的Java开发的框架

MyBatis,ORM(Object Relational Mapping)框架,底层对jdbc进行了封装

Spring 是一个容器(可以将其他框架融合在一起)

SpringMVC 分层框架

Struts2 功能类似于 SpringMVC

Hibernate 功能类似于 MyBatis

MyBatis

持久层(数据访问层)框架 支持自定义sql 存储过程以及高级映射

通过xml或者注解配置原始类型 接口 Java pojo为数据库中的记录

MyBatis中三个常用的查询方法

1.selectOne

用于查询单条数据的情况,返回值是一个对象,如果没有查到任何数据,返回 null

2.selectList

用于查询多条数据的情况,返回值是一个 list 集合,如果没有查到任何数据返回没有元素的集合(空集合,不是 null)

3.selectMap

用于查询多条数据的情况,多条数据要形成一个 Map集合需要指定哪个属性作为 key 如果查不到,返回一个空 map 集合(不是 null)

MyBatis中常用的DML方法

1.insert
2.delete
3.update

DML要考虑事务处理(从mybatis的源码里看到事务默认是手动提交).commit

增删改查例:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.mybatis.mapper.UserMapper"><!--写该xml的路径-->
    <select id="selAll" resultType="com.mybatis.pojo.Users"><!--自动封装为集合 resultType为泛型-->
        select * from t_user<!--不需要分号结尾 会报错-->
    </select>
    <select id="selOne" resultType="com.mybatis.pojo.Users"><!--自动封装为集合 resultType为泛型-->
        select * from t_user where id=13<!--不需要分号结尾 会报错-->
    </select>
    <insert id="addUser">
        insert into t_user(id,uname,pwd) values(null,"妮妮","0105")
    </insert>
    <update id="updateUser">
        update t_user set uname="nini" where uname="妮妮"
    </update>
    <delete id="deleteUser">
        delete from t_user where id=13
    </delete>
</mapper>
public class Demo01 {
    public static void main(String[] args) {
        //加载mybatis.xml的配置文件
        String resource = "mybatis.xml";//mybatis.xml要放在src目录下
        try {
            //把配置文件转换为流 相当于FileInputStream
            InputStream is = Resources.getResourceAsStream(resource);
            //通过xml配置文件的数据创建SqlSessionFactory对象
            SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(is);
            //由SqlSessionFactory对象创建发送sql语句的对象
            SqlSession sqlSession = sqlSessionFactory.openSession();
            //查询多条数据 返回list集合
            List<Users> users= sqlSession.selectList("selAll");
            //selAll由UserMapper.xml中的select id="selAll"取到
            //查询单条数据
            Object selOne = sqlSession.selectOne("selOne");
            /*
            查询多条数据 返回map集合
            第一个参数:映射文件UserMapper.xml中的sql语句对应的id
            第二个参数:指定那么列(属性) 作为map中的key
            */
            Map<Integer, Users> map = sqlSession.selectMap("selAll", "id");
            System.out.println(users);
            System.out.println(selOne);
            System.out.println(map);
            sqlSession.commit(true);//设置mybatis事物为自动提交(一般推荐手动提交)
            sqlSession.close();//关闭资源
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }
}

public class Demo02 {
    SqlSession sqlSession;
    public Demo02() {
        String resource="mybatis.xml";
        try {
            InputStream is = Resources.getResourceAsStream(resource);

            SqlSessionFactory ssf=new SqlSessionFactoryBuilder().build(is);
            sqlSession = ssf.openSession();
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }
    //新增
    @Test
    public void addUser(){
        int addUser = sqlSession.insert("addUser");
            System.out.println(addUser==1?"新增成功":"新增失败");
        //增删改是 有事物的 需要commit 手动提交事物
        sqlSession.commit();
        sqlSession.close();
    }
    //修改
    @Test
    public void updateUser(){
        int updateUser= sqlSession.update("updateUser");
        System.out.println(updateUser==1?"修改成功":"修改失败");
        //增删改是 有事物的 需要commit 手动提交事物
        sqlSession.commit();
        sqlSession.close();
    }
    //删除
    @Test
    public void deleteUser(){
        int deleteUser= sqlSession.delete("deleteUser");
        System.out.println(deleteUser==1?"删除成功":"删除失败");
        //增删改是 有事物的 需要commit 手动提交事物
        sqlSession.commit();
        sqlSession.close();
    }
}

其他标签(了解)

properties:用于加载外部的properties文件 通过${}方式获取

typeAliases:配置简化返回值类型

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "https://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <!--从当前文件以外加载数据库参数的配置文件-->
    <properties resource="db.properties"></properties>
    <!--给全路径类名取别名:尽量使用类名-->
    <typeAliases>
        <typeAlias type="com.mybatis.pojo.T_user" alias="T_user"></typeAlias>
    </typeAliases>
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="${driver}"/>
                <property name="url" value="${url}"/>
                <property name="username" value="${username}"/>
                <property name="password" value="${password}"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <mapper resource="com/mybatis/mapper/UserMapper.xml"/>
    </mappers>
</configuration>
 <select id="selAll" resultType="T_user">
        select * from t_user
    </select>

 通过接口绑定映射文件 进行crud(增删改查)操作

开发中推荐使用 比session提供的方法更方便

xml文件

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.mybatis.mapper.UserMapper"><!--写该xml的路径-->
   <!-- 查询-->
    <select id="selAll" resultType="Users"><!--自动封装为集合 resultType为泛型-->
        select * from t_user<!--不需要分号结尾 会报错-->
    </select>
    <select id="login" resultType="Users">
        select * from t_user where uname=#{param1} and pwd=#{param2}
    </select>
  <!--  如果传入的参数是对象类型 动态取值(推荐使用#) 使用对象中对应的属性名称-->
    <select id="login2" resultType="Users">
        select * from t_user where uname=#{uname} and pwd=#{pwd}
    </select>
    <!--新增-->
    <insert id="addUser">
        insert into t_user(id,uname,pwd) values(#{param1},#{param2},#{param3})
    </insert>
    <insert id="addUser2">
        insert into t_user values(#{id},#{uname},#{pwd})
    </insert>
    <!--修改-->
    <update id="updateUser">
        update t_user set pwd=#{param2} where id=#{param1}
    </update>
    <update id="updateUser2">
        update t_user set pwd=#{pwd},uname=#{uname} where id=#{id}
    </update>
    <!--删除-->
    <delete id="deleteUser">
        delete from t_user where uname=#{param1}
    </delete>
    <delete id="deleteUser2">
        delete from t_user where uname=#{uname}
    </delete>
</mapper>

 接口

//当前接口与UserMapper.xml文件绑定起来
public interface UserMapper {
    //查询
    public List<Users> selAll();//抽象方法名需要与配置文件中的id一致
    public Users login(String uname, String pwd);
    public Users login2(Users u);
    //添加
    public int addUser(int id, String uname, String pwd);
    public int addUser2(Users u);
    //修改
    public int updateUser(int id,String pwd);
    public int updateUser2(Users u);
    //删除
    public int deleteUser(String uname);
    public int deleteUser2(Users u);
}

测试

public class Demo03 {
    SqlSession sqlSession;
    UserMapper mapper;
    public Demo03() {
        String resource="mybatis.xml";
        try {
            InputStream is = Resources.getResourceAsStream(resource);
            SqlSessionFactory ssf=new SqlSessionFactoryBuilder().build(is);
            sqlSession = ssf.openSession();
            mapper = sqlSession.getMapper(UserMapper.class);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }


    @Test
    public void selAllUser(){
        List<Users> users = mapper.selAll();
        System.out.println(users);
    }
    @Test
    public void loginUser(){
        Users admin = mapper.login("admin", "1234");
        System.out.println(admin);
    }
    @Test
    public void loginUser2(){
        Users u=new Users();
        u.setUname("张三");
        u.setPwd("3333333");
        Users users = mapper.login2(u);
        System.out.println(users);
    }


    @Test
    public void addUser(){
        int i = mapper.addUser(18, "木舟", "123");
        System.out.println(i==1?"添加成功":"添加失败");
        sqlSession.commit();
    }
    @Test
    public void addUser2(){
        Users u=new Users();
        u.setId(18);
        u.setUname("木舟");
        u.setPwd("123");
        int i = mapper.addUser2(u);
        System.out.println(i==1?"添加成功":"添加失败");
        sqlSession.commit();
    }


    @Test
    public void updateUser(){
        int i = mapper.updateUser(1, "333");
        System.out.println(i==1?"修改成功":"修改失败");
        sqlSession.commit();

    }
    @Test
    public void updateUser2(){
        Users u=new Users();
        u.setPwd("55555");
        u.setUname("月木舟");
        u.setId(18);
        int i = mapper.updateUser2(u);
        System.out.println(i==1?"修改成功":"修改失败");
        sqlSession.commit();
    }


    @Test
    public void deleteUser(){
        int i = mapper.deleteUser("木舟");
        System.out.println(i==1?"删除成功":"删除失败");
        sqlSession.commit();
    }
    @Test
    public void deleteUser2(){
        Users u=new Users();
        u.setUname("月木舟");
        int i = mapper.deleteUser2(u);
        System.out.println(i==1?"删除成功":"删除失败");
        sqlSession.commit();
    }
}

动态SQL

<if>标签

​
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.mybatis.mapper.UserMapper"><!--写该xml的路径-->
   <!-- 查询-->
    <select id="selByPram" resultType="Users"><!--自动封装为集合 resultType为泛型-->
        select * from t_user where 1=1
        <if test="id!=0">
           and id=#{id}
        </if>
        <if test="uname!=null and uname!=''">
            and uname=#{uname}
        </if>
        <if test="pwd!=null and pwd!=''">
            and pwd=#{pwd}
        </if>
    </select>
</mapper>

​

<where>标签 

如果没有条件,不会生成 where关键字

如果有条件,会自动添加 where 关键字

如果条件中有 and,自动去除之,但不会自动加

  <select id="selByPram2" resultType="Users"><!--自动封装为集合 resultType为泛型-->
        select * from t_user
        <where><!--可以自动去掉and 根据条件判断是否保留and-->
        <if test="id!=0">
            and id=#{id}
        </if>
        <if test="uname!=null and uname!=''">
            and uname=#{uname}
        </if>
        <if test="pwd!=null and pwd!=''">
            and pwd=#{pwd}
        </if>
        </where>
    </select>

<bind>标签

用于模糊查询

可以对传入的参数提前处理

方式1
<!--方式1-->
    <select id="selLike" resultType="Users">
        <bind name="param1" value="'%'+param1+'%'"/><!--通过bind绑定标签 进行数据提前加工-->
        select * from t_user where uname like #{param1}
    </select>
方式2

推荐用这个可读性强

<!--方式2:使用concat函数拼接-->
    <select id="selLike2" resultType="Users">
        select * from t_user where uname like concat('%',#{param1},'%')
    </select>

<foreach>标签

在一个范围中查询
用于在 SQL 语句中遍历集合参数,在 in 查询中使用
1.collection:待遍历的集合

2.open:设置开始符号(

3.separator:项目分隔符,

4.close:设置结束符号)

5.item:迭代变量

<select id="selIn" resultType="Users">
        select * from t_user where id in
        <foreach collection="list" open="(" separator="," close=")" item="u"><!--u用来接受list集合中的元素-->
            #{u}
        </foreach>
    </select>

<sql><include>标签

动态选择要查询的列

 <sql id="id1">
        id,uname
    </sql>
    <sql id="id2">
        uname,pwd
    </sql>
    <select id="selSame" resultType="Users">
        select
        <include refid="id2">
            <!--代替*-->
            <!--refid 关联 sql的id 查询想查的列-->
        </include>
        from t_user
    </select>

<choose><when><otherwise>标签(了解) 

但条件查询 只取其一   

类似于if--else--if--else

 <select id="selByPram3" resultType="Users"><!--自动封装为集合 resultType为泛型-->
        select * from t_user
        <where><!--可以自动去掉and 根据条件判断是否保留and-->
            <choose>
            <when test="id!=0">
                and id=#{id}
            </when>
            <when test="uname!=null and uname!=''">
                and uname=#{uname}
            </when>
            <otherwise >
                and pwd=#{pwd}
            </otherwise>
            </choose>
        </where>
    </select>

只要满足条件 就不再向下运行 不追加其他条件 如果都不满足就不查询数据 

<set>标签

用于维护 update 语句中的 set 子句

1.满足条件时,会自动添加 set 关键字

2.会去除 set 子句中多余的逗号

3.不满足条件时,不会生成 set 关键字

<update id="updateUser">
        update t_user
        <set>
            <if test="uname!=null and uname!=''">
                uname=#{uname},
            </if>
            <if test="pwd!=null and pwd!=''">
                pwd=#{pwd}
            </if>
        </set>
       where id=#{id}
    </update>

查询过程中 类中属性名与数据库中列名不一致 解决方式

建议开发中类中的属性名与sql中的列名一致

<resultMap id="mm" type="com.mybatis.pojo.T_User">
        <id property="uid" column="id"></id><!--主键列 实体类uid关联数据库id-->
        <result property="username" column="uname"></result><!--非主键列 实体类username关联数据库uname-->
        <result property="password" column="pwd"></result><!--非主键列 实体类password关联数据库pwd-->
    </resultMap>
    <select id="selAll" resultMap="mm"><!--mm关联resultMap中id名称-->
        select * from t_user
    </select>

 MyBatis的缓存机制

MyBatis的缓存是使用SQL标签的ID作为缓存的唯一标识,执行相同的标签可以使用缓存,不同的标签不能使用缓存

注意:使用效果有限 MyBatis缓存不能持久化保持

MyBatis中有两种缓存机制:

1.一级缓存

默认开启 线程级别的缓存 SqlSession的缓存

在SqlSession的生命周期中有效 SqlSession关闭 缓存清空

2.二级缓存

进程级别的缓存 SqlSessionFactory的缓存(缓存数据存储在这个对象中)

在一个SqlSessionFactory生命周期中有效 可以在多个SqlSession生命周期中共享

默认关闭 需要使用的时候 要为某个命名空间 开启二级缓存(在mapper.xml中配置<cache>)

<mapper namespace="com.mybatis.mapper.UserMapper">
    <!--开启二级缓存-->
<cache></cache>

MyBatis多表关联查询

多对一

1.业务装配实现多表查询(多对一)

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.mybatis.mapper.StuMapper">
    <select id="getStudents" resultType="stu">
        select * from student
    </select>
</mapper>
@Data
public class Student implements Serializable {
    private int sid;
    private String sname;
    private int age;
    private int cid;

    //持有班级信息作为属性
    private Clazz clazz;
}
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.mybatis.mapper.ClazMapper">
    <select id="selBy" resultType="cla">
        select * from clazz where cid = #{param1}
    </select>
</mapper>
  /*
    手动装配方式的多对一查询
    查询学生对应的班级信息
    */
    @Test
    public void sel1(){
        //1.查询所有的学生信息
        List<Student> students = stuMapper.getStudents();
        for (Student stu : students) {
            //每个学生的cid
            int cid = stu.getCid();
        //2.根据cid查对应的班级
            Clazz clazz = clazMapper.selBy(cid);
            stu.setClazz(clazz);
        }
        System.out.println(students);
    }

 2.resultMap的N+1方式实现多表查询(多对一)

  <!--N+1的装配方式-->
    <resultMap id="rm" type="stu">
        <!--如果Student中的属性名与数据库中的类名一致可以省略映射关系-->
       <!-- <id property="sid" column="sid"></id>
        <result property="sname" column="sname"></result>
        <result property="age" column="age"></result>
        <result property="cid" column="cid"></result>-->

        <!--以下的意思是给Student类中的属性clazz赋值
        值通过com.mybatis.mapper.ClazMapper中的 标签id为selBy查询
        查询出的数据封装类型为cla
        根据列名cid查-->
        <association property="clazz" select="com.mybatis.mapper.ClazMapper.selBy" javaType="cla" column="cid">
            <!--如果Clazz中的属性名与数据库中的类名一致可以省略映射关系-->
            <!--<id property="cid" column="cid"></id>
            <result property="cname" column="cname"></result>
            <result property="room" column="room"></result>-->
        </association>
    </resultMap>
    <select id="getStudents2" resultMap="rm">
        select * from student
    </select>

 3.使用sql多表关联语句查询(多对一)

  <!--使用sql多表关联语句查询-->
    <resultMap id="rm2" type="stu">
        <!--这里的映射文件不能省略-->
        <id property="sid" column="sid"></id>
        <result property="sname" column="sname"></result>
        <result property="age" column="age"></result>
        <result property="cid" column="cid"></result>
        <association property="clazz" javaType="cla">
            <!--这里的映射文件不能省略-->
            <id property="cid" column="cid"></id>
            <result property="cname" column="cname"></result>
            <result property="room" column="room"></result>
        </association>
    </resultMap>
    <select id="getStudents3" resultMap="rm2">
        select * from student natural join clazz
    </select>

一对多 

1.业务装配实现多表查询(一对多)

 <!--手动装配实现一对多-->
    <select id="selClazzAll" resultType="cla">
        select * from clazz
    </select>
@Data
public class Clazz {
    private int cid;
    private String cname;
    private String room;

    //持有当前班级中的学生信息(一对多)
    private List<Student> stus;
}
<!--                                 一对多                             -->
    <!--根据班级cid 查学生-->
    <select id="getStus" resultType="stu">
        select * from student where cid=#{param1}
    </select>

  /*
    手动装配方式的一对多查询
    查询班级及其班级中包含的学生
    */
    @Test
    public void sel4(){
        //1.查所有的班级信息
        List<Clazz> clazzes = clazMapper.selClazzAll();
        for(Clazz clazz:clazzes){
            //得到cid
            int cid = clazz.getCid();
            //根据cid查学生
            List<Student> stus = stuMapper.getStus(cid);
            clazz.setStus(stus);
        }
        System.out.println(clazzes);
    }

 2.resultMap的N+1方式实现多表查询(一对多)

 <!--N+1的装配方式-->
    <resultMap id="aa" type="cla">
        <!--在一对多中 id不能省略-->
        <!--类属性名与数据库列名 如果一致 除了主键其他映射关系可以省略-->
        <id property="cid" column="cid"></id>
        <collection property="stus" select="com.mybatis.mapper.StuMapper.getStus"  column="cid">
            <id property="sid" column="sid"></id>
        </collection>
    </resultMap>
    <select id="selClazzAll2" resultMap="aa">
        select * from clazz
    </select>

 3.使用sql多表关联语句查询(一对多)

<!--一对多的sql多表关联语句查询 注意:查询的结果中不能有同名列-->
    <resultMap id="bb" type="cla">
        <id property="cid" column="cid"></id>
        <result property="cname" column="cname"></result>
        <result property="room" column="room"></result>
        <collection property="stus" javaType="list" ofType="stu">
            <id property="sid" column="sid"></id>
            <result property="sname" column="sname"></result>
            <result property="age" column="age"></result>
            <result property="cid" column="cid"></result>
        </collection>
    </resultMap>
    <select id="selClazzAll3" resultMap="bb">
        select c.cid,c.cname,c.room,s.sid,s.sname,s.age from student s join clazz c on c.cid=s.cid
    </select>

注解开发

用注解完成增删改查

优点:简洁,可以不使用****Mapper.xml映射文件

缺点:多表查询特别繁琐

建议在单表查询时使用

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "https://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <properties resource="db.properties"></properties>
    <typeAliases>
        <typeAlias type="com.mybatis.pojo.Users" alias="u"></typeAlias>
    </typeAliases>
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="${driver}"/>
                <property name="url" value="${url}"/>
                <property name="username" value="${username}"/>
                <property name="password" value="${password}"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <!--扫描当前com.mybatis.mapper包下所有的mapper.xml文件-->
        <package name="com.mybatis.mapper"/>
    </mappers>
</configuration>
public interface UserMapper {
    //查所有
    @Select("select * from t_user")
    public List<Users> getUsers();
    //根据名字查询
    @Select("select * from t_user where uname=#{param1}")
    public List<Users> getUsersByName(String uname);
    //新增
    @Insert("insert into t_user values(null,#{uname},#{pwd})")
    public int addUsers(Users users);
    //修改
    @Update("update t_user set pwd=#{param1} where uname=#{param2}")
    public int updateUsers(String pwd, String uname);
    //删除
    @Delete("delete from t_user where uname=#{param1}")
    public int deleteUsers(String uname);
public class Demo {
    UserMapper mapper;
    SqlSession sqlSession;
    public Demo() {
        String resource ="mybatis.xml";
        try {
            InputStream is = Resources.getResourceAsStream(resource);
            SqlSessionFactory ssf=new SqlSessionFactoryBuilder().build(is);
            sqlSession = ssf.openSession();
            mapper=sqlSession.getMapper(UserMapper.class);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }
    //查所有
    @Test
    public void selAll(){
        List<Users> list = mapper.getUsers();
        System.out.println(list);
    }
    //根据名字查询
    @Test
    public void selUname(){
        List<Users> list = mapper.getUsersByName("张三");
        System.out.println(list);
    }
    //新增
    @Test
    public void insert(){
        Users user = new Users();
        user.setUname("李雷");
        user.setPwd("123456");
        int i = mapper.addUsers(user);
        sqlSession.commit();
        System.out.println(i==1?"新增成功":"新增失败");
    }
    //修改
    @Test
    public void update(){
        int i = mapper.updateUsers("123", "李雷");
        sqlSession.commit();
        System.out.println(i==1?"修改成功":"修改失败");
    }
    //删除
    @Test
    public void delete(){
        int i = mapper.deleteUsers("李雷");
        sqlSession.commit();
        System.out.println(i==1?"删除成功":"删除失败");
    }
}

MyBatis逆向工程

注意:逆向工程只适合单表查询,不适合多表关联查询(多表使用业务装配方式完成)

public class Demo {
    SqlSession sqlSession;
    ClazzMapper clazzMapper;
    StudentMapper studentMapper;
    public Demo() {
        String resource = "mybatis.xml";
        try {
            InputStream inputStream = Resources.getResourceAsStream(resource);
            SqlSessionFactory ssf=new SqlSessionFactoryBuilder().build(inputStream);
            sqlSession = ssf.openSession();
            clazzMapper = sqlSession.getMapper(ClazzMapper.class);
            studentMapper = sqlSession.getMapper(StudentMapper.class);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }
    //查询所有的学生信息
    @Test
    public void selAll(){
        //selectByExample根据非主键列查询 查所有 传null
        List<Student> students = studentMapper.selectByExample(null);
        System.out.println(students);
    }
    //根据学生的sid和sname查询
    @Test
    public void selIdName(){
        //用一个对象StudentExample 封装查询参数
        StudentExample exp = new StudentExample();
        //                   传入要查询的sid         传入要查询的sname
        exp.createCriteria().andSidEqualTo(7).andSnameEqualTo("妮妮");
        //exp.createCriteria().andSnameEqualTo("妮妮");
        List<Student> students = studentMapper.selectByExample(exp);
        if (students!=null&&students.size()>0){
            Student student = students.get(0);
            System.out.println(students);
        }
    }
    //根据主键sid查询
    @Test
    public void selId(){
        Student student = studentMapper.selectByPrimaryKey(1);
        System.out.println(student);
    }
    //查询
    @Test
    public void sel1(){
        //年龄>=25的学生
        StudentExample exp1 = new StudentExample();
        exp1.createCriteria().andAgeGreaterThanOrEqualTo(25);
        //查询年龄>=23 <=25
        StudentExample exp2 = new StudentExample();
        exp2.createCriteria().andAgeGreaterThanOrEqualTo(23).andAgeLessThanOrEqualTo(25);
        //查询年龄>=23 <=25
        StudentExample exp3 = new StudentExample();
        exp2.createCriteria().andAgeBetween(23,25);
        List<Student> students = studentMapper.selectByExample(exp1);
        List<Student> students1 = studentMapper.selectByExample(exp2);
        List<Student> students2 = studentMapper.selectByExample(exp3);
        System.out.println(students);
        System.out.println(students1);
        System.out.println(students2);
    }


    //删除
    @Test
    public void delete(){
        //根据主键删除
        /*int i = studentMapper.deleteByPrimaryKey(10);
        System.out.println(i==1?"删除成功":"删除失败");
        sqlSession.commit();*/
        //根据条件删除 sname,age
        StudentExample exp = new StudentExample();
        exp.createCriteria().andSnameEqualTo("坏心情").andAgeEqualTo(99);
        int i = studentMapper.deleteByExample(exp);
        System.out.println(i==1?"删除成功":"删除失败");
        sqlSession.commit();
    }


    //修改
    @Test
    public void update(){
        //根据主键修改
        Student student = new Student();
        student.setSid(12);
        student.setSname("好心情");
        //不需要修改的值 也要封装进去不然会被null覆盖
        student.setAge(28);
        student.setCid(3);
        int i = studentMapper.updateByPrimaryKey(student);
        sqlSession.commit();
        System.out.println(i==1?"修改成功":"修改失败");
    }
    @Test
    public void update2(){
        //根据主键修改
        Student student = new Student();
        student.setSid(12);
        student.setSname("坏心情");
        //根据可选的条件修改
        int i = studentMapper.updateByPrimaryKeySelective(student);
        sqlSession.commit();
        System.out.println(i==1?"修改成功":"修改失败");
    }

    @Test
    public void update3(){
        //封装修改后的值
        Student student = new Student();
        student.setSname("坏心情");
        student.setSid(10);
        //封装修改条件
        StudentExample exp = new StudentExample();
        exp.createCriteria().andSnameEqualTo("好心情").andSidEqualTo(12);
        int i = studentMapper.updateByExampleSelective(student,exp);
        sqlSession.commit();
        System.out.println(i==1?"修改成功":"修改失败");
    }
    @Test
    public void update4(){
        //封装修改后的值
        Student student = new Student();
        student.setSname("好心情");
        //使用updateByExample 不用修改的值也必须写 不然会报错或被空值覆盖
        student.setSid(11);
        student.setAge(22);
        student.setCid(3);
        //封装修改条件
        StudentExample exp = new StudentExample();
        exp.createCriteria().andSnameEqualTo("坏心情");
        int i = studentMapper.updateByExample(student,exp);
        sqlSession.commit();
        System.out.println(i==1?"修改成功":"修改失败");
    }



    //新增
    @Test
    public void insert(){
        Student student = new Student();
        student.setSid(12);
        student.setSname("阿尤");
        student.setAge(26);
        student.setCid(3);
        int i = studentMapper.insert(student);
        sqlSession.commit();
        System.out.println(i==1?"新增成功":"新增失败");
    }
    //新增
    @Test
    public void insert2(){
        Student student = new Student();
        student.setSname("咪咪");
        int i = studentMapper.insertSelective(student);
        sqlSession.commit();
        System.out.println(i==1?"新增成功":"新增失败");
    }
}

LOG4J日志

log4j简介:(http://lpgging.apache.org)

1.log4j是Apache提供的一款记录日志的工具

2.log4j的API与实现是分开的,从而使应用程序开发人员可以清楚地知道他们可以使用哪些类和方法

3.log4j既可以将日志信息打印在控制台,也可以打印输出到一个日志文件中

4.log4j 可以定制日志的输出格式

5.log4j 可以定制日志级别

日志级别

FATAL
致命的,表示非常严重的错误,一般是系统错误

ERROR

错误,表示代码错误,比较严重

WARN

警告,不影响程序的运行,但是可能存在风险

INFO

信息,表示一个普通的输出信息

DEBUG

调试,表示程序员人为的一些调试信息

FATAL< ERROR<WARN<INFO< DEBUG

开发中推荐使用 DEBUG和INFO

Lombok使用

1.导入lombok jar包

2.在实体类上加@Data

3.下载lombok插件:注意没有插件的话 没用

4.重启idea或删除out文件

会自动生成Get and Set方法 equals方法 hashCode方法 tostring方法

如果在idea里的插件库中搜索不到Lombok,去以下地址下载离线安装

安装之后一定要重启idea,才会生效

下载对应idea版本的lombok插件:https://plugins.jetbrains.com/plugin/6317-lombok/versions

PageHelper分页插件

1.导入jar包(jsqlparser.jar,pagehelper.jar)容易报错

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "https://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <properties resource="db.properties"></properties>
    <typeAliases>
        <typeAlias type="com.mybatis.pojo.Users" alias="u"></typeAlias>
    </typeAliases>
    <!--加入分页插件-->
    <plugins>
        <plugin interceptor="com.github.pagehelper.PageInterceptor">
        </plugin>
    </plugins>
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="${driver}"/>
                <property name="url" value="${url}"/>
                <property name="username" value="${username}"/>
                <property name="password" value="${password}"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <!--扫描当前com.mybatis.mapper包下所有的mapper.xml文件-->
        <package name="com.mybatis.mapper"/>
    </mappers>
</configuration>
 //查所有
    @Test
    public void selAll(){
        int pageNum=3;//页码(从一开始)
        int rows=3;//每页显示的数量
        //设置页码和每页显示的条数一定要放在查询语句之前 否则不生效
        PageHelper.startPage(pageNum,rows);//等同于sql语句中的limit(0,3)
        List<Users> users = mapper.getUsers();
        //整理分页之后的数据
        PageInfo<Users> usersPageInfo = new PageInfo<>(users);
        //获取分页之后的数据
        List<Users> list1 = usersPageInfo.getList();
        System.out.println("分页后");
        for (Users user : list1) {
            System.out.println(user.getId()+"-"+user.getUname()+"-"+user.getPwd());
        }
        System.out.println("当前页码"+usersPageInfo.getPageNum());
        System.out.println("数据总数"+usersPageInfo.getTotal());
    }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2149673.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

一文看懂误植域名的威胁和对策

你熟悉“误植域名”&#xff08;typosquatting&#xff09;这个术语吗&#xff1f;这是一种域名抢注&#xff0c;可能会损害你的品牌和声誉。我们在这篇博文中将探讨误植域名是什么、它与域名抢注的区别&#xff0c;并提供如何防止这种行为的要点。另外&#xff0c;我们将讨论沦…

选择优质代理IP建议分享

“在互联网的广阔世界中&#xff0c;代理IP作为一种重要的网络工具&#xff0c;扮演着连接用户与目标服务器之间的桥梁角色。不同类型的代理IP适用于不同的场景和需求&#xff0c;因此选择合适的代理IP类型对于提高网络访问效率、保护用户隐私至关重要。” 一、代理IP类型概述 …

如何在多台Linux虚拟机上安装和配置Zookeeper集群

Zookeeper 是一个高性能的协调服务&#xff0c;广泛应用于分布式系统中。本文将详细介绍如何在多台Linux虚拟机上安装和配置Zookeeper集群。下面以三台服务器&#xff08;node1、node2、node3&#xff09;进行讲解。 前置准备&#xff1a; 配置多台Linux虚拟机参考&#xff1a;…

跨国公司决策的影响与中国IT产业的应对

跨国公司在华研发中心的调整是一个复杂的现象&#xff0c;它可能受到多种因素的影响&#xff0c;包括全球经济环境的变化、成本考量、战略重心的转移以及地缘政治因素等。IBM中国研发中心的撤出可能会对中国IT行业造成短期的就业压力&#xff0c;加速人才流动&#xff0c;并促使…

YOLOv5白皮书-第Y1周:调用官方权重进行检测

>- **&#x1f368; 本文为[&#x1f517;365天深度学习训练营](小团体&#xff5e;第八波) 中的学习记录博客** >- **&#x1f356; 原作者&#xff1a;[K同学啊](K同学啊-CSDN博客)** 一、前言 拖了好久&#xff0c;终于要开始目标检测系列了。自己想过好几次&#xf…

【Python机器学习】NLP信息提取——值得提取的信息

目录 提取GPS信息 提取日期 如下一些关键的定量信息值得“手写”正则表达式&#xff1a; GPS位置&#xff1b;日期&#xff1b;价格&#xff1b;数字。 和上述可以通过正则表达式轻松捕获的信息相比&#xff0c;其他一些重要的自然语言信息需要更复杂的模式&#xff1a; 问…

Linux入门学习:Linux调试器gdb使用

1. 背景 程序的发布方式有两种&#xff0c;debug模式和release模式&#xff0c;debug是添加调试信息&#xff0c;release是取消调试信息&#xff0c; Linux gcc/g出来的二进制程序&#xff0c;默认是release模式&#xff0c;要使用gdb调试&#xff0c;必须在源代码生成二进制程…

html+css+js网页设计 旅游 穷游10个页面

htmlcssjs网页设计 旅游 穷游10个页面 网页作品代码简单&#xff0c;可使用任意HTML辑软件&#xff08;如&#xff1a;Dreamweaver、HBuilder、Vscode 、Sublime 、Webstorm、Text 、Notepad 等任意html编辑软件进行运行及修改编辑等操作&#xff09;。 获取源码 1&#xff…

SpringCloud微服务消息驱动的实践指南

Spring Cloud是一个用于构建分布式系统的开发工具&#xff0c;通过它可以快速搭建基于微服务架构的应用&#xff0c;并提供了丰富的功能和解决方案。在Spring Cloud中&#xff0c;消息驱动是一种常见的通信模式&#xff0c;通过消息传递来实现不同微服务之间的数据交互。本文将…

文件上传js代码

大家好&#xff0c;很久没更新了&#xff0c;今天空了&#xff0c;记录一下文件上传js代码。(自己搭建的网站&#xff0c;演示学习一下这种漏洞&#xff0c;不要做违法的事情&#xff01;&#xff01;&#xff01;) 一般文件上传的话都是奔着getshell去的&#xff0c;但是一般…

【Linux 20】线程控制

文章目录 &#x1f308; 一、创建线程⭐ 1. 线程创建函数⭐ 2. 创建单线程⭐ 3. 给线程传参⭐ 4. 创建多线程⭐ 5. 获取线程 ID &#x1f308; 二、终止线程⭐1. 使用 return 终止线程⭐ 2. 使用 pthread_exit 函数终止线程⭐ 3. 使用 pthread_cancel 函数终止线程 &#x1f30…

Python中lambda表达式的使用——完整通透版

文章目录 一、前言二、 基本语法三、举个简单的例子&#xff1a;四、常见应用场景1. 用于排序函数sort() 方法简介lambda 表达式的作用详细解释进一步扩展总结 2、与 map、filter、reduce 等函数结合1、 map() 函数示例&#xff1a;将列表中的每个数字平方 2、 filter() 函数示…

Centos 7 搭建Samba

笔记&#xff1a; 环境&#xff1a;VMware Centos 7&#xff08;网络请选择桥接模式&#xff0c;不要用NAT&#xff09; 遇到一个问题就是yum 安装404&#xff0c;解决办法在下面&#xff08;没有遇到可以无视这句话&#xff09; # 安装Samba软件 yum -y install samba# 创建…

Shader Graph Create Node---Channel

二、Channel 1、Combine(合并通道) 2、Flip(翻转) 3、Split(分离) 4、Swizzle(交换)

ELK环境部署

目录 环境准备 Elasticsearch 部署 安装Elasticsearch Elasticsearch-head 插件 安装node 安装 phantomjs 安装 Elasticsearch-head Logstash 安装部署 Kibana 安装部署 ELFK 本章纯搭建过程&#xff0c;几乎无任何注释解释 环境准备 ELK的搭建和测试&#xff0c;…

力扣(LeetCode)每日一题 2576. 求出最多标记下标

题目链接https://leetcode.cn/problems/find-the-maximum-number-of-marked-indices/description/?envTypedaily-question&envId2024-09-12 思路&#xff1a; 先排序&#xff0c;然后定义双指针 left&#xff0c;right&#xff0c;贪心遍历&#xff0c;左指针在中间&…

机器狗与无人机空地协调技术分析

随着科技的飞速发展&#xff0c;机器狗与无人机作为智能机器人领域的杰出代表&#xff0c;正逐步在军事侦察、灾害救援、环境监测、农业植保等多个领域展现出巨大的应用潜力。本文旨在深入探讨机器狗与无人机之间的空地协调技术&#xff0c;分析其在复杂环境中的协同作业机制、…

轻松打造:用Python实现手机与电脑间的简易消息系统

展示&#x1f3a5; 观看视频&#xff1a;&#x1f440;&#xff0c;这是之前完成的一个项目&#xff0c;但今天我们的重点不是这个哦。 告别往昔&#xff0c;启航新篇章 现象&#x1f31f; 智能互动&#xff1a;&#x1f4f1; 我们每天都在享受与智能设备的互动&#xff0c;…

作为HR,如何考察候选人的沟通能力

如何考察候选人的沟通能力。沟通能力&#xff0c;这个听起来简单&#xff0c;实际上却是一个非常复杂的技能&#xff0c;它关乎到一个人能否有效地传递信息&#xff0c;理解他人&#xff0c;并且在团队中发挥积极的作用。 作为HR&#xff0c;我们应该怎样才能精准地把握住候选…

鸿蒙开发(HarmonyOS)组件化浅谈

众所周知&#xff0c;现在组件化在移动开发中是很常见的&#xff0c;那么组件化有哪些好处&#xff1a; 1. 提高代码复用性&#xff1a;组件化允许将应用程序的不同功能模块化&#xff0c;使得这些模块可以在不同的项目中重复使用&#xff0c;从而提高开发效率并减少重复工作。…