Mybatis(2)------CRUD操作 配置文件 解决字段和属性名不一致 分页的实现

1.CRUD操作

增删改查

mapper接口本质就是原来的Dao接口,只是为了方便我们的书写,一个mapper接口对应一个mapper映射文件。
将userMapper映射文件的namespace属性,对应上接口
修改对应的mapper映射文件的namespace属性,对应上接口。

编写接口
package com.kuang.dao;

import com.kuang.pojo.User;

import java.util.List;

public interface UserDao {
    //获取全部的用户
    List<User> selectUser();

    //根据id查找用户
    User selectUserById(int id);

    //添加一个用户
    int addUser(User user);

    //删除用户
    int deleteUserByID(int id);

    //修改用户
    int updateUser(User user);

}

对应的mapper语句编写
<?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对应Mapper接口的类,包名+类名-->
<mapper namespace="com.kuang.dao.UserDao">

    <!--select标签的id对应映射接口的方法名字  resultType:返回结果的类型  中间就编写sql语句-->
    <select id="selectUser" resultType="com.kuang.pojo.User">
    select * from user
    </select>

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

    <!--
    我们需要接受一个自定义的对象(引用对象),需要设置parameterType,为参数类型
    接受这个对象的值,直接使用 #{对象字段名}
    -->
    <insert id="addUser" parameterType="com.kuang.pojo.User">
        insert into user(id ,name, pwd) values (#{id},#{name},#{pwd})
    </insert>

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

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

</mapper>
测试类
package com.kuang.dao;

import com.kuang.dao.UserDao;
import com.kuang.pojo.User;
import com.kuang.utils.MyBatisUtils;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.junit.Test;

import java.util.List;

public class UserMapperTest {
    @Test
    public void selectUser() {

        //1.拿到sqlSessionFactory对象
        SqlSessionFactory sqlSessionFactory = MyBatisUtils.getSqlSessionFactory();
        //2.通过sqlSessionFactory对象openSession()创建一个sqlSession。
        SqlSession sqlSession = sqlSessionFactory.openSession();
        //3.通过sqlSession获得mapper对象 , 参数为映射文件对应的接口类的class对象
        UserDao mapper = sqlSession.getMapper(UserDao.class);
        //4.通过mapper对象来执行操作;
        List<User> users = mapper.selectUser();

        //获得结果集
        for (User user : users) {
            System.out.println(user);
        }

        sqlSession.close(); //关闭sqlSession

    }


    @Test
    public void selectUserById(){
        SqlSessionFactory sqlSessionFactory = MyBatisUtils.getSqlSessionFactory();
        SqlSession sqlSession = sqlSessionFactory.openSession();
        UserDao mapper = sqlSession.getMapper(UserDao.class);
        //接口  对象名  = new  接口实现类
        User user = mapper.selectUserById(1);
        System.out.println(user);

        sqlSession.close(); //关闭sqlSession
    }

    @Test
    public void addUser(){
        User user = new User(4,"qinjiang","123456");

        SqlSessionFactory sqlSessionFactory = MyBatisUtils.getSqlSessionFactory();
        SqlSession sqlSession = sqlSessionFactory.openSession();
        UserDao mapper = sqlSession.getMapper(UserDao.class);

        int i = mapper.addUser(user);

        //没有插入成功的原因:没有提交事务;
        sqlSession.commit(); //提交事务
        sqlSession.close(); //关闭sqlSession

        if (i>0){
            System.out.println("插入成功!");
        }

    }

    @Test
    public void deleteUserByID(){
        SqlSession sqlSession = MyBatisUtils.getSqlSessionFactory().openSession();
        UserDao mapper = sqlSession.getMapper(UserDao.class);
        int i = mapper.deleteUserByID(4);

        //记得提交事务,否则删除不成功!
        sqlSession.commit();//提交事务
        sqlSession.close();//关闭

        if (i>0){
            System.out.println(i);
        }
    }

    @Test
    public void updateUser(){
        SqlSession sqlSession = MyBatisUtils.getSqlSessionFactory().openSession();
        UserDao mapper = sqlSession.getMapper(UserDao.class);
        User user = new User(1,"秦疆","qinjiang");
        mapper.updateUser(user);

        sqlSession.commit();
        sqlSession.close();

    }


}
总结CURD注意点

1.事务
增,改,删需要提交事务!

2.乱码
如果出现乱码,先在sql中进行测试,sql没问题,就检查配置文件

jdbc:mysql://localhost:3306/mybatis?useSSL=true&amp;useUnicode=true&amp;characterEncoding=utf-8"

3.参数问题
如果是基本数据类型,可以省略,但建议写上

引用类型必须写指定的 包名+类名。

4.配置文件的详解

mybatis-config文件解析
<?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   配置文件
    settings     mybatis设置
    typeAliases   为Java类起别名
    typeHandlers  类处理器
    objectFactory  对象工厂 
    plugins   插件
    environments  环境
		transactionManager : 事务管理
		dataSource : 数据源
	mappers 映射器

优化我们的代码
优化配置文件

创建一个database.properties

driver = com.mysql.jdbc.Driver
url = jdbc:mysql://localhost:3306/mybatis?useSSL=true&amp;useUnicode=true&amp;characterEncoding=utf-8
username = root
password = 123456

在mybatis核心配置文件中引入properties配置文件,并用${}表达式引入其中的值

<configuration>

    <!--配置文件修改-->
    <properties resource="database.properties"/>

    <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/kuang/dao/userMapper.xml"/>
    </mappers>

</configuration>
优化别名

注意点:位置必须正确

<!--配置别名-->
<typeAliases>

    <!--配置指定类的别名-->
    <typeAlias type="com.kuang.pojo.User" alias="User"/>

    <!--
        可以为一个包的所有类指定别名,这个别名为类名
        com.kuang.pojo.User    -  >  User
        com.kuang.pojo.Student   -  >  Student

        -->
    <package name="com.kuang.pojo"/>

</typeAliases>

优化完毕后我们在mapper映射文件中就可以使用别名了

<?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对应Mapper接口的类,包名+类名-->
<mapper namespace="com.kuang.dao.UserDao">

    <!--select标签的id对应映射接口的方法名字  resultType:返回结果的类型  中间就编写sql语句-->
    <select id="selectUser" resultType="User">
    select * from user
    </select>

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

    <!--
    我们需要接受一个自定义的对象(引用对象),需要设置parameterType,为参数类型
    接受这个对象的值,直接使用 #{对象字段名}
    -->
    <insert id="addUser" parameterType="User">
        insert into user(id ,name, pwd) values (#{id},#{name},#{pwd})
    </insert>

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

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

</mapper>
环境配置
<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>
映射器
  1. resource 【推荐】
  2. url
  3. class
  4. package
    【推荐使用】
<!-- 使用相对于类路径的资源引用 -->
<mappers>
  <mapper resource="org/mybatis/builder/AuthorMapper.xml"/>
  <mapper resource="org/mybatis/builder/BlogMapper.xml"/>
  <mapper resource="org/mybatis/builder/PostMapper.xml"/>
</mappers>

3.解决属性和字段名不一致

字段名:数据库 id name pwd

属性名:实体类 id name password

我们修改完毕后去测试运行一下:
在这里插入图片描述

分析

select * from user 等价于 select id,name,pwd from user;

mybatis会根据数据库的字段名去找对应的实体类的属性名,(他会将所有列名转换为小写,然后去找实体类中对应的 set方法 ,set方法后面的字段就对应数据库的字段名;如果不一样就会返回null)

解决方案

1.修改set方法名字【不推荐使用】
在这里插入图片描述2.给sql语句取别名【字段少的时候推荐使用】
在这里插入图片描述
3.结果集映射resultmap【最推荐的方式】

<!--设置结果的映射类型-->
<resultMap id="UserMap" type="User">
    <!--
    一般通过id标签来映射主键
    column = 数据库的列名
    property = 结果集对应的数据库列名的映射名
    -->
    <id column="id" property="id"/>
    <result column="name" property="name"/>
    <result column="pwd" property="password"/>
</resultMap>


<select id="selectUser" resultMap="UserMap">
  select * from user
</select>

LOG4J实现

log4 java :Java日志的实现

日志—>控制台

boolean flag = true;

public void isPrint(String msg){
    if (flag){
        System.out.print(msg);
    }else{
    }
}

log4j依赖

<!-- https://mvnrepository.com/artifact/log4j/log4j -->
<dependency>
    <groupId>log4j</groupId>
    <artifactId>log4j</artifactId>
    <version>1.2.17</version>
</dependency>

log4j的配置文件
log4j.properties

### Log4j配置 ###
#定义log4j的输出级别和输出目的地(目的地可以自定义名称,和后面的对应)
#[ level ] , appenderName1 , appenderName2
log4j.rootLogger=DEBUG,console,file

#-----------------------------------#
#1 定义日志输出目的地为控制台
log4j.appender.console = org.apache.log4j.ConsoleAppender
log4j.appender.console.Target = System.out
log4j.appender.console.Threshold=DEBUG
####可以灵活地指定日志输出格式,下面一行是指定具体的格式 ###
#%c: 输出日志信息所属的类目,通常就是所在类的全名
#%m: 输出代码中指定的消息,产生的日志具体信息
#%n: 输出一个回车换行符,Windows平台为"/r/n",Unix平台为"/n"输出日志信息换行
log4j.appender.console.layout = org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=[%c]-%m%n

#-----------------------------------#
#2 文件大小到达指定尺寸的时候产生一个新的文件
log4j.appender.file = org.apache.log4j.RollingFileAppender
#日志文件输出目录
log4j.appender.file.File=log/info.log
#定义文件最大大小
log4j.appender.file.MaxFileSize=10mb
###输出日志信息###
#最低级别
log4j.appender.file.Threshold=ERROR
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=[%p][%d{yy-MM-dd}][%c]%m%n

#-----------------------------------#
#3 druid
log4j.logger.druid.sql=INFO
log4j.logger.druid.sql.DataSource=info
log4j.logger.druid.sql.Connection=info
log4j.logger.druid.sql.Statement=info
log4j.logger.druid.sql.ResultSet=info

#4 mybatis 显示SQL语句部分
log4j.logger.org.mybatis=DEBUG
#log4j.logger.cn.tibet.cas.dao=DEBUG
#log4j.logger.org.mybatis.common.jdbc.SimpleDataSource=DEBUG
#log4j.logger.org.mybatis.common.jdbc.ScriptRunner=DEBUG
#log4j.logger.org.mybatis.sqlmap.engine.impl.SqlMapClientDelegate=DEBUG
#log4j.logger.java.sql.Connection=DEBUG
log4j.logger.java.sql=DEBUG
log4j.logger.java.sql.Statement=DEBUG
log4j.logger.java.sql.ResultSet=DEBUG
log4j.logger.java.sql.PreparedStatement=DEBUG
mybatis的日志实现

1.默认的日志实现

<settings>
    <setting name="logImpl" value="STDOUT_LOGGING"/>
</settings>

log4j日志实现

  1. 导包
  2. 配置文件编写
  3. mybatis核心文件中进行配置
<settings>
    <setting name="logImpl" value="LOG4J"/>
</settings>

4.分页的实现

MySQL的分页语句
select * from user limit #{startIndex},#{pageSize};
# startIndex : 起始位置 ,默认是0开始
# pageSize :页面大小
# 如何计算出当前页面
currentPage = (currentPage-1)* pageSize  
使用limit实现分页

1.编写dao接口

/查询全部用户实现分页
List<User> selectUserByLimit(Map<String,Integer> map);

2.编写对应的mapper映射文件的方法
【参数我们可以使用map封装,方便参数传递】

<select id="selectUserByLimit" parameterType="Map" resultType="User">
    select * from mybatis.user limit #{startIndex},#{pageSize}
</select>

3.测试
【模拟分页数据:currentPage,pageSize】

@Test
public void selectUserByLimit(){

    //创建sqlSession
    SqlSessionFactory sqlSessionFactory = MyBatisUtils.getSqlSessionFactory();
    SqlSession sqlSession = sqlSessionFactory.openSession();

    //准备数据
    int currentPage = 2;//当前是第几页
    int pageSize = 2; //页面大小

    Map<String, Integer> map = new HashMap<String, Integer>();
    map.put("startIndex",(currentPage-1)*pageSize);
    map.put("pageSize",pageSize);

    //测试
    UserDao mapper = sqlSession.getMapper(UserDao.class);
    List<User> users = mapper.selectUserByLimit(map);

    for (User user : users) {
        System.out.println(user);
    }

    sqlSession.close();//关闭连接

}
使用RowBounds实现分页

1.写接口

//查询全部用户实现分页使用RowBounds
List<User> selectUserByRowBounds();

2.写mapper映射文件

<select id="selectUserByRowBounds" resultType="User">
    select * from mybatis.user
</select>

3.编写测试代码

@Test
public void selectUserByRowBounds(){
    //创建sqlSession
    SqlSessionFactory sqlSessionFactory = MyBatisUtils.getSqlSessionFactory();
    SqlSession sqlSession = sqlSessionFactory.openSession();

    int currentPage = 2; //当前页
    int pageSize = 2; //页面大小

    RowBounds rowBounds = new RowBounds((currentPage - 1) * pageSize, pageSize);

    //注意点;使用RowBounds就不能使用getMapper了
    //selectList: 接收一个List
    //selectMap: 接收一个Map
    //selectOne : 接收只有一个对象的时候

    List<User> users = sqlSession.selectList("com.kuang.dao.UserDao.selectUserByRowBounds", null, rowBounds);

    for (User user : users) {
        System.out.println(user);
    }


}

limit和rowBounds去区别

  • rowBounds 本质就是封装了limit
  • limit 是在SQL层面实现分页
  • rowBounds 在代码层面实现分页
面向接口编程

提出的原因:解耦,方便拓展,提高代码的复用性,上层不用管下层实现,只用去调用对应的接口即可。规范性好。

面向过程编程:随着系统越来越大,我们无法使用面向过程的思想满足。面对对象。

面向对象编程:所有系统耦合性高,所有的功能都是由许许多多不同的对象去完成的。随着系统越来越大。提纲

接口 & 抽象类

面向接口编程:约束开发人员操作,而且方便扩展以及规划。

更深层次的分离:定义与实现的一个分离;

接口可以反映一个开发人员的水平高低以及对系统架构理解;

5.使用注解开发

早期的,mybatis都是使用xml进行配置的,直到注解的出现,注解可以替代一些xml中的配置。

连xml配置都不要了!

CRUD的注解:

  • @insert()
  • @delete()
  • @update()
  • @select()

思考?我们之前的代码,还能在优化吗?

日志,工具类,配置文件,别名… 事务

mybaits开发人员也想到了,有一个构造器,可以实现事务自动提交。

openSession(true); //openSession构造器如果参数为true,则事务会自动提交。我们就不用每次都commit;
优化项目

事务优化:自动提交事务

//获得一个带事务自动提交功能的SqlSession公共的方法
public static SqlSession getSqlSession(){
    //自动提交事务
    return sqlSessionFactory.openSession(true);
}

别名优化:pojo包下类自动设置别名

<!--配置别名-->
<typeAliases>
    <!--<typeAlias type="com.kuang.pojo.User" alias="User"/>-->
    <package name="com.kuang.pojo"/>
</typeAliases>

mapper映射文件路径修改

<mappers>
    <!--class对应的是一个接口类-->
    <!--resource对应的是一个接口类的映射文件-->
    <mapper class="com.kuang.dao.UserDao"/>
</mappers>
使用注解进行开发

UserDao.java

package com.kuang.dao;

import com.kuang.pojo.User;
import org.apache.ibatis.annotations.*;

import java.util.List;

public interface UserDao {

    //查询全部用户
    @Select("select * from user")
    List<User> getUserList();

    //通过ID查询用户
    @Select("select * from user where id = #{id}")
    User getUserById(@Param("id") int id);

    //添加用户
    @Insert("insert into user(id,name,pwd) values (#{id},#{name},#{pwd})")
    int addUser(User user);

    //修改用户信息
    @Update("update user set name = #{name}, pwd = #{pwd} where id = #{id}")
    int updateUser(User user);

    //删除用户
    @Delete("delete from user where id =#{uid}")
    int deleteUser(@Param("uid") int id);

}

mybatis核心文件

<?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"/>

    <!--Mybatis设置-->
    <settings>
        <!--默认日志实现-->
        <!--<setting name="logImpl" value="STDOUT_LOGGING"/>-->

        <!--Log4j实现-->
        <setting name="logImpl" value="LOG4J"/>
    </settings>

    <!--配置别名-->
    <typeAliases>
        <!--<typeAlias type="com.kuang.pojo.User" alias="User"/>-->
        <package name="com.kuang.pojo"/>
    </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>
        <!--class对应的是一个接口类-->
        <!--resource对应的是一个接口类的映射文件-->
        <mapper class="com.kuang.dao.UserDao"/>
    </mappers>

</configuration>

测试类

package com.kuang.dao;

import com.kuang.pojo.User;
import com.kuang.utils.MyBatisUtils;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;
import sun.rmi.server.UnicastServerRef;

import java.util.List;


public class UserDaoTest {

    @Test
    public void getUserList(){
        SqlSession sqlSession = MyBatisUtils.getSqlSession();//带自动提交事务

        UserDao mapper = sqlSession.getMapper(UserDao.class);

        List<User> userList = mapper.getUserList();

        for (User user : userList) {
            System.out.println(user);
        }

        sqlSession.close();//关闭sqlSession;

    }

    @Test
    public void getUserById(){
        SqlSession sqlSession = MyBatisUtils.getSqlSession();//带自动提交事务

        UserDao mapper = sqlSession.getMapper(UserDao.class);

        User user = mapper.getUserById(1);

        System.out.println(user);

        sqlSession.close();//关闭sqlSession;

    }
    

    @Test
    public void addUser(){
        SqlSession sqlSession = MyBatisUtils.getSqlSession();//带自动提交事务
        UserDao mapper = sqlSession.getMapper(UserDao.class);
        User user = new User(5, "阿猫", "like-dog");
        int i = mapper.addUser(user);
        System.out.println(i);

        sqlSession.close();//关闭sqlSession;

    }

    @Test
    public void updateUser(){
        SqlSession sqlSession = MyBatisUtils.getSqlSession();//带自动提交事务
        UserDao mapper = sqlSession.getMapper(UserDao.class);
        User user = new User(5, "阿狗", "like-cat");
        int i = mapper.updateUser(user);
        System.out.println(i);

        sqlSession.close();//关闭sqlSession;

    }

    @Test
    public void deleteUser(){
        SqlSession sqlSession = MyBatisUtils.getSqlSession();//带自动提交事务
        UserDao mapper = sqlSession.getMapper(UserDao.class);

        int i = mapper.deleteUser(5);
        System.out.println(i);

        sqlSession.close();//关闭sqlSession;

    }
}
注意事项
  1. 开启事务自动提交了

  2. @param参数尽量都写上,如果有多个参数,就必须填写。

6.多对一处理

多个对象对应一个对象

比如:你们都是我的学生 ,多个学生对应一个老师

掌握两个单词:

  • association — 联系 ,关联 多个人可以关联一个人。
  • collection — 集合 一个人有一个集合,包含多个人。
  • 发现是多对一业务情况,我们需要使用association 标签进行关联
多对一的处理方式一

使用数据库的思想处理:联表查询
1.定于dao接口

List<Student> getStudents();

2.编写查询语句

  1. 查询学生信息 id name tid , 由于我们要得到老师的信息,我们需要联表查询
  2. 查询老师的信息 id name 。
<!--遇到问题:学生类中关联老师: 多个学生对应一个老师 -->
<!--<select id="getStudents" resultType="Student">-->
    <!--select s.id,s.name,t.name from mybatis.student as s,mybatis.teacher as t-->
    <!--where s.tid = t.id-->
<!--</select>-->


<!--解决问题方式一:按查询结果嵌套处理,模拟数据库思想;
-->
<select id="getStudents" resultMap="StudentTeacher">
    select * from mybatis.student
</select>

<resultMap id="StudentTeacher" type="Student">
    <id column="id" property="id"/>
    <result column="name" property="name"/>
    <!--属性和字段对应  , 类和表对应  , 对象和记录
    关联一个字段
    需求:拿到老师这个类的属性

    association : 关联,多对一
        column : 数据库对应的列名
        property : 对应属性名
        javaType : 多对一字段对应的Java类型
        select : 关联一个语句
    -->
    <association column="tid" property="teacher" javaType="Teacher" select="getTeacher"/>
</resultMap>

<select id="getTeacher" resultType="Teacher">
    select * from mybatis.teacher where id = #{id}
</select>

测试类

    @Test
    public void getStudents(){
        SqlSession sqlSession = MyBatisUtils.getSqlSession();

        StudentDao mapper = sqlSession.getMapper(StudentDao.class);

        List<Student> students = mapper.getStudents();

        for (Student student : students) {
            System.out.println("学生姓名:"+student.getName()+"\t老师姓名:"+student.getTeacher().getName());
        }

    }
多对一的处理方式二

1.编写接口

List<Student> getStudentsTwo();

2.编写处理的mapper

  1. 查询学生id,学生姓名,老师姓名,需要从学生表和老师表中查询
  2. 学生对应的类进行映射,发现老师一个对象 , 所以关联一个对象;
<!-- 解决方式二:一个resultMap解决 , 模拟面向对象的思想-->
<select id="getStudentsTwo" resultMap="StudentTeacher2">
    select s.id,s.name,t.name as tname from mybatis.student as s, mybatis.teacher as t
    where s.tid = t.id
</select>

<!--设置结果集映射ResultMap -->
<resultMap id="StudentTeacher2" type="Student">
    <id property="id" column="id"/>
    <result property="name" column="name"/>

    <!--直接关联一个老师-->
    <association property="teacher" javaType="Teacher">
        <result property="name" column="tname"/>
    </association>
</resultMap>

3.测试类

@Test
public void getStudentsTwo(){
    SqlSession sqlSession = MyBatisUtils.getSqlSession();

    StudentDao mapper = sqlSession.getMapper(StudentDao.class);

    List<Student> students = mapper.getStudentsTwo();

    for (Student student : students) {
        System.out.println("学生姓名:"+student.getName()+"\t老师姓名:"+student.getTeacher().getName());
    }

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
【优质项目推荐】 1、项目代码均经过严格本地测试,运行OK,确保功能稳定后才上传平台。可放心下载并立即投入使用,若遇到任何使用问题,随时欢迎私信反馈与沟通,博主会第一时间回复。 2、项目适用于计算机相关专业(如计科、信息安全、数据科学、人工智能、通信、物联网、自动化、电子信息等)的在校学生、专业教师,或企业员工,小白入门等都适用。 3、该项目不仅具有很高的学习借鉴价值,对于初学者来说,也是入门进阶的绝佳选择;当然也可以直接用于 毕设、课设、期末大作业或项目初期立项演示等。 3、开放创新:如果您有一定基础,且热爱探索钻研,可以在此代码基础上二次开发,进行修改、扩展,创造出属于自己的独特应用。 欢迎下载使用优质资源!欢迎借鉴使用,并欢迎学习交流,共同探索编程的无穷魅力! 基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip 基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip 基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值