快盘下载:好资源、好软件、快快下载吧!

快盘排行|快盘最新

当前位置:首页软件教程电脑软件教程 → Mybatis入门

Mybatis入门

时间:2022-09-28 10:20:16人气:作者:快盘下载我要评论

目录

第一个案例;1;创建表;2;创建Maven项目;3;修改POM配置文件;4;添加依赖;5;创建接口和类;6;创建Mapper配置文件;7;创建MyBatis主配置文件;8;测试;9;结果 mybatis提交事务;1;设置日志;2;简单使用占位符;3;使用insert实例来证实自动提交;4;使用占位符完善index插入 MyBatis框架中重要的类IDEA创建模板自定义模板 动态代理dao代理使用 参数parameterType属性#{参数} 占位符的完整语法参数为一个简单类型参数为多个简单类型;;Param;参数为一个自定义类按位传值;不建议使用;Map传值;不建议使用;关系图 #{}和${}占位符的区别#{}和${}一起使用封装MyBatis查询结果自定义别名resultType属性resultMap属性

MyBatis官方文档连接地址;https://mybatis.org/mybatis-3/zh/index.html

第一个案例

;1;创建表

创建Student表;并且添加数据
Mybatis入门

;2;创建Maven项目

;3;修改POM配置文件

<!-- 在pom文件中的<build>标签中添加一下配置 -->
    <resources>
      <resource>
        <directory>src/main/java</directory>
        <includes>
          <include>**/*.xml</include>
          <include>**/*.properties</include>
        </includes>
      </resource>
    </resources>

;4;添加依赖

	<!-- mysql依赖 -->
    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <version>8.0.28</version>
    </dependency>


	<!-- MyBatis依赖 -->
    <dependency>
      <groupId>org.mybatis</groupId>
      <artifactId>mybatis</artifactId>
      <version>3.5.6</version>
    </dependency>

;5;创建接口和类

包结构如下;

注意com.temo包打错了;应该是com.temp

	// 接口
public interface StudentDao {
    Student selectStudentById();
}



// 学生类;属性与mysql表中的字段名和类型相同;用该类来接收查询出来的数据
public class Student {
    private Integer id;
    private String name;
    // 手机号
    private String phone;
    private Integer age;

// 此处省略get and set方法

    ;Override
    public String toString() {
        return ;Student{; ;
                ;id=; ; id ;
                ;, name=;; ; name ; ;;; ;
                ;, phone=;; ; phone ; ;;; ;
                ;, age=; ; age ;
                ;};;
    }
}

;6;创建Mapper配置文件

在接口同包下创建Mapper文件

注意;com.temo包打错了;应该是com.temp

Mybatis入门

<!-- Mapper文件名为;StudentDao.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.temo.dao.StudentDao;>
    <select id=;selectStudentById; resultType=;com.temp.domain.Student;>
        select * from student where id = 100
    </select>
</mapper>

<!-- 
<mapper namespace=;接口全限定名称;包名;接口名;;>
    <select id=;接口中的方法名; resultType=;返回值的全限定名称;包名;类名;;>  <--- resultType只有select语句才有
        select * from student where id = 100		<--- sql语句
    </select>
</mapper>
 -->
</mapper>

;7;创建MyBatis主配置文件

在资源配置文件夹创建MyBates.xml

注意;com.temo包打错了;应该是com.temp

Mybatis入门

	<!-- 主配置文件名;mybatis.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>
    <environments default=;development;>
        <environment id=;development;>
            <transactionManager type=;JDBC;/>
            <dataSource type=;POOLED;>
                <property name=;driver; value=;com.mysql.cj.jdbc.Driver;/>
                <property name=;url; value=;jdbc:mysql://localhost:3306/mybatis?useUnicode=true&amp;characterEncoding=utf-8;/>
                <property name=;username; value=;root;/>
                <property name=;password; value=;123456;/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <mapper resource=;com	empdaoStudentDao.xml;/>
    </mappers>
</configuration>


<!-- 
	<configuration>
    <environments default=;development;>
        <environment id=;development;>
            <transactionManager type=;JDBC;/>
            <dataSource type=;POOLED;>
                <property name=;driver; value=;mysql驱动中的Driver类的全限定名称;包名;类名;;/>
                <property name=;url; value=;mysql的URL;/>
                <property name=;username; value=;数据库用户名;/>
                <property name=;password; value=;数据库密码;/>
            </dataSource>
        </environment>
    </environments>

	下面是Mapper文件的集合
    <mappers>
        <mapper resource=;Mapper文件的路径;/>		
    </mappers>
</configuration>
 -->

;8;测试

// 测试
    ;Test
    public void test() throws IOException {

        // mybatis.xml主配置文件路径是相对于classes文件夹
        String resource = ;mybatis.xml;;
        
        // 获取主配置文件的输入流
        InputStream inputStream = Resources.getResourceAsStream(resource);
        
        // 创建sqlSessionFactory;sql会话工厂;对象
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        
        // 通过sqlSessionFactory工厂获取一个会话
        SqlSession sqlSession = sqlSessionFactory.openSession();
        
        /*
        	sqlId属性分为两部分;
        		1、Mapper文件中<mapper>标签中的namespace属性的值;第一部分为;com.temp.dao.StudentDao;
        		2、Mapper文件中<select>标签中的id属性值;第二部分为;selectStudentById;

			作用;
				用于找到要执行的那个sql语句
        */
        String sqlId = ;com.temp.dao.StudentDao.selectStudentById;;
        
        // 通过会话对象;sqlSession;调用方法来执行sql语句;并且返回把数据封装好的对象
        Student student = sqlSession.selectOne(sqlId);
        
        System.out.println(student);
        
        // 关闭会话
        sqlSession.close();
    }

;9;结果

Mybatis入门

mybatis提交事务

MyBatis框架是不自动提交事务的;通过下面的步骤二来证实这句话

;1;设置日志

在mybatis主配置文件中添加

实例如下;

<!-- 主配置文件名为;mybatis.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>

    <!-- 设置日志 -->
    <settings>	
    	<!-- 
    	设置日志的时候<setting>标签中的name属性值是;logImpl;固定的;
		values属性值可选的值有;SLF4J、LOG4J、LOG4J2、JDK_LOGGING、COMMONS_LOGGING、STDOUT_LOGGING;简单;、NO_LOGGING
		-->
        <setting name=;logImpl; value=;STDOUT_LOGGING;/>
    </settings>
    
    <environments default=;development;>
        <environment id=;development;>
            <transactionManager type=;JDBC;/>
            <dataSource type=;POOLED;>
                <property name=;driver; value=;com.mysql.cj.jdbc.Driver;/>
                <property name=;url; value=;jdbc:mysql://localhost:3306/mybatis?useUnicode=true&amp;characterEncoding=utf-8;/>
                <property name=;username; value=;root;/>
                <property name=;password; value=;123456;/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <mapper resource=;com	empdaoStudentDao.xml;/>
    </mappers>
</configuration>

;2;简单使用占位符

<!-- 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=;com.temp.dao.StudentDao;>

    <select id=;selectStudentById; resultType=;com.temp.domain.Student;>
        select * from student where id = #{sid}		<!-- #{sid};占位符;相当于JDBC的?占位符 -->
    </select>

</mapper>
// 接口
public interface StudentDao {
    Student selectStudentById(Integer sid);
}


// 测试
    ;Test
    public void test() throws IOException {

        // mybatis.xml主配置文件路径是相对于classes文件夹
        String resource = ;mybatis.xml;;
        
        // 获取主配置文件的输入流
        InputStream inputStream = Resources.getResourceAsStream(resource);
        
        // 创建sqlSessionFactory;sql会话工厂;对象
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        
        // 通过sqlSessionFactory工厂获取一个会话
        SqlSession sqlSession = sqlSessionFactory.openSession();
        
        String sqlId = ;com.temp.dao.StudentDao.selectStudentById;;
        
        // 通过会话对象;sqlSession;调用方法来执行sql语句;并且返回把数据封装好的对象
        Student student = sqlSession.selectOne(sqlId,100);
        
        System.out.println(student);
        
        // 关闭会话
        sqlSession.close();

Mybatis入门

通过上面的日志图片可以看出;Mybatis框架在运行我们自己代码之前会关闭自动提交;而我们代码结束之后Mybatis框架又会把打开自动提交

;3;使用insert实例来证实自动提交

<!-- 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=;com.temp.dao.StudentDao;>

	<!-- 根据id查数据 -->
    <select id=;selectStudentById; resultType=;com.temp.domain.Student;>
        select * from student where id = #{sid}
    </select>

	<!-- 插入一条数据 -->
    <insert id=;insertStudent;>
        insert into student values(default,;李某人;,;137********;,19)
    </insert >

</mapper>
// 接口
public interface StudentDao {
    // 查询Student表;根据ID查找
    Student selectStudentById(Integer sid);

    // 在Student表插入数据
    Integer insertStudent(Student student);
}


// 测试
    ;Test
    public void test() throws IOException {

        // mybatis.xml主配置文件路径是相对于classes文件夹
        String resource = ;mybatis.xml;;
        // 获取主配置文件的输入流
        InputStream inputStream = Resources.getResourceAsStream(resource);
        // 创建sqlSessionFactory;sql会话工厂;对象
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        // 通过sqlSessionFactory工厂获取一个会话
        SqlSession sqlSession = sqlSessionFactory.openSession();

        String sqlId = ;com.temp.dao.StudentDao.insertStudent;;

        // 通过会话对象;sqlSession;调用方法来执行sql语句
        int student = sqlSession.insert(sqlId);
        System.out.println(;插入了多少行数据;;;student);
        // 关闭会话
        sqlSession.close();
    }

运行结果;

控制台结果;
Mybatis入门

数据库结果;
Mybatis入门

控制台显示插入成功;而数据库并没有数据插入;所以可以证实了“MyBatis框架是不自动提交事务的”这句话
如果想要插入成功;则需要我们主动调用方法来提交事务;实例如下;

其他代码不动;在测试代码中;关闭会话之前写入提交方法;sqlSession.commit()方法;

// 测试
    ;Test
    public void test() throws IOException {

        // mybatis.xml主配置文件路径是相对于classes文件夹
        String resource = ;mybatis.xml;;
        // 获取主配置文件的输入流
        InputStream inputStream = Resources.getResourceAsStream(resource);
        // 创建sqlSessionFactory;sql会话工厂;对象
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        // 通过sqlSessionFactory工厂获取一个会话
        SqlSession sqlSession = sqlSessionFactory.openSession();

        String sqlId = ;com.temp.dao.StudentDao.insertStudent;;

        // 通过会话对象;sqlSession;调用方法来执行sql语句
        int student = sqlSession.insert(sqlId);
        System.out.println(;插入了多少行数据;;;student);

        // 自动提交
        sqlSession.commit();		// <--- 注 意 点
        // 关闭会话
        sqlSession.close();
    }

数据库Mybatis入门

;4;使用占位符完善index插入

之前的insert语句插入的值是固定的;这次通过占位符来完善一下;顺便再学习一下占位符

<!-- 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=;com.temp.dao.StudentDao;>

    <select id=;selectStudentById; resultType=;com.temp.domain.Student;>
        select * from student where id = #{sid}
    </select>

    <insert id=;insertStudent;>			
    <!-- 
    	传入的是基本数据类型;那么#{}里面的值随便写无所谓;因为就只能传入一个值;里面的值没有意义。
    	而引用类型对象;里面可能包含多个属性;所以#{}里面不能随便填写。
    	
    	#{对象的属性名};表示调用该对象的get方法
    	如;#{name} 表示调用对象的getName()方法
     -->
        insert into student values(default,#{name},#{phone},#{age})
    </insert >

</mapper>

#{对象的属性名};表示调用该对象的get方法
如;#{name} 表示调用对象的getName()方法
所以实体类必须要有get方法

// 实体类	实体类中的属性与数据库表中的字段一一对应;该类用于保存数据库中的数据的;
public class Student {
    private Integer id;
    private String name;
    private String phone;
    private Integer age;

	// 此处省略所有属性的get and set方法

    ;Override
    public String toString() {
        return ;Student{; ;
                ;id=; ; id ;
                ;, name=;; ; name ; ;;; ;
                ;, phone=;; ; phone ; ;;; ;
                ;, age=; ; age ;
                ;};;
    }
}


// 测试
    ;Test
    public void test() throws IOException {

        // mybatis.xml主配置文件路径是相对于classes文件夹
        String resource = ;mybatis.xml;;
        // 获取主配置文件的输入流
        InputStream inputStream = Resources.getResourceAsStream(resource);
        // 创建sqlSessionFactory;sql会话工厂;对象
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        // 通过sqlSessionFactory工厂获取一个会话
        SqlSession sqlSession = sqlSessionFactory.openSession();

        // 创建Student对象
        Student student = new Student();
        student.setName(;黄小明;);
        student.setPhone(;137********;);
        student.setAge(18);

        String sqlId = ;com.temp.dao.StudentDao.insertStudent;;

        // 第一个参数sqlId
        // 第二个参数Student对象;用于把数据给到#{}占位符
        sqlSession.insert(sqlId,student);

        // 自动提交
        sqlSession.commit();
        // 关闭会话
        sqlSession.close();
    }

Mybatis入门

MyBatis框架中重要的类

Resources类
作用;用于读取主配置文件
代码;String resource = “mybatis.xml”;
代码;InputStream inputStream = Resources.getResourceAsStream(resource);

SqlSessionFactoryBuilder类
作用;负责创建SqlSessionFactory对象
代码;SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

SqlSessionFactory接口
SqlSessionFactory是重量级对象;创建此对象需要更多的资源和时间
作用;SqlSessionFactory接口是SqlSession的工厂;用来创建SqlSession对象
方法;
1、openSession();获取一个默认的SqlSession对象;默认需要手动提交事务
2、openSession(Boolean);Boolean类型的参数;表示是否自动提交事务。
true;创建一个自动提交事务的SqlSession对象
false;创建一个需要手动提交事务的SqlSession对象

SqlSession接口
DefaultSqlSession类是SqlSession接口的实现类
Mybatis入门

MyBatis框架的底层就是JDBC

IDEA创建模板

什么是模板?
图片中标出的都是IDEA自带的模板
Mybatis入门

自定义模板

Mybatis入门
Mybatis入门

如下图;表示已经创建模板成功
Mybatis入门

动态代理

dao代理技术由mybatis创建StudentDao接口的实现类Proxy;StudentDaoImpl;
使用框架创建的Proxy代替自己手工写的StudentDaoImpl类的功能;就不需要开发人员写Dao接口的实现类了

使用dao代理要求;

mapper文件中<mapper>标签中的namespace属性必须是dao接口的全限定名称mapper文件中的<select>、<insert>等标签的id属性值必须是dao接口中的方法名称
Mybatis入门

dao代理使用

用法;
SqlSession sqlSession = MyBatisUtil.getSqlSession(); //获取到连接;MyBatisUtil是自定义的类;代码在下方有定义
StudentDao mapper = sqlSession.getMapper(StudentDao.class); // 通过SqlSession对象调用getMapper方法;获取到Proxy代理对象

<?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.temp.dao.StudentDao;>

    <select id=;selectStudentById; resultType=;com.temp.domain.Student;>
        select * from student where id = #{sid}
    </select>

    <insert id=;insertStudent; >
        insert into student values(default,#{name},#{phone},#{age})
    </insert>

</mapper>
// dao接口
public interface StudentDao {
    // 查询Student表;根据ID查找
    Student selectStudentById(Integer sid);

    // 在Student表插入数据
    Integer insertStudent(Student student);
}


// 获取连接的工具类
public class MyBatisUtil {
    
    // 获取一个不会自动提交事务的sql会话;
    public static SqlSession getSqlSession() throws IOException {
        SqlSession sqlSession = getSqlSession(false);
        return sqlSession;
    }
    
    // 获取sql会话,通过传入的参数来确定返回的sql会话是否会自动提交事务
    public static SqlSession getSqlSession(boolean isCommit) throws IOException {
        // mybatis.xml主配置文件路径是相对于classes文件夹
        String resource = ;mybatis.xml;;
        // 获取主配置文件的输入流
        InputStream inputStream = Resources.getResourceAsStream(resource);
        // 创建sqlSessionFactory;sql会话工厂;对象
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        // 通过sqlSessionFactory工厂获取一个会话
        SqlSession sqlSession = sqlSessionFactory.openSession(isCommit);
        return sqlSession;
    }
}


// 测试
    ;Test
    public void test() throws IOException {
		// 通过自定义的工具类来获取sql会话
        SqlSession sqlSession = MyBatisUtil.getSqlSession();
		// 通过SqlSession对象调用getMapper方法;获取到Proxy代理对象
        StudentDao mapper = sqlSession.getMapper(StudentDao.class);
		// 通过代理对象来调用具体的方法
        Student student = mapper.selectStudentById(100);
		// 输出结果
        System.out.println(student);
        // 自动提交
        sqlSession.commit();
        // 关闭会话
        sqlSession.close();
    }

Mybatis入门

参数

用于给SQL语句中的#{属性名}传入参数

parameterType属性

parameterType属性作用;表示传入的值是什么类型的
parameterType属性可以省略;因为mybatis可以通过反射;获取到dao接口中方法的参数类型;所以可以不写


用法;
<select id=“selectStudentById” parameterType=“类的全限定名称” resultType=“com.temp.domain.Student”>
select * from student where id = #{sid}
</select>

parameterType=“类的全限定名称”
如果是类型是四类八种的其中一种;可以写别名。如下;

别名全限定名称intcom.temp.util.Integerbytejava.lang.Bytestringjava.lang.String

#{参数} 占位符的完整语法

#{参数;javaType=参数类的全限定名称;jdbcType=数据库对应字段的类型}
如;<select id=“selectStudentByIdAndName” resultType=“com.temp.domain.Student”>
select * from student where id = #{id,javaType=java.lang.Integer,jdbcType=INTEGER}
and name = #{name,javaType=java.lang.String,jdbcType=VARCHAR}
</select>

参数为一个简单类型

跟上面一样;没有区别

<?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.temp.dao.StudentDao;>

    <select id=;selectStudentById; resultType=;com.temp.domain.Student;>
        select * from student where id = #{sid}
    </select>
</mapper>
// 接口
public interface StudentDao {
    // 查询Student表;根据ID查找
    Student selectStudentById(Integer sid);
}


 // 测试
    ;Test
    public void test() throws IOException {

        SqlSession sqlSession = MyBatisUtil.getSqlSession(true);

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

        Student student = mapper.selectStudentById(100);

        System.out.println(student);
        // 关闭会话
        sqlSession.close();
    }
//

参数为多个简单类型;;Param;

参数有多个;且是简单类型的;可以在接口的形参中使用;Param注解
;Param注解属性;
Value属性;表示该属性在#{}里面的表达方式
Mybatis入门

实例如下;

<?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.temp.dao.StudentDao;>

    <select id=;selectStudentById; resultType=;com.temp.domain.Student;>
        select * from student where id = #{id1} or id = #{id2}
    </select>
</mapper>
// 接口
public interface StudentDao {
    // 查询Student表;根据ID查找
    Student selectStudentById(;Param(value = ;id1;) Integer sid01,;Param(value = ;id2;) Integer sid02);
}


// 测试
    ;Test
    public void test() throws IOException {

        SqlSession sqlSession = MyBatisUtil.getSqlSession(true);

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

        Student student = mapper.selectStudentById(100,101);

        System.out.println(student);
        // 关闭会话
        sqlSession.close();
    }

参数为一个自定义类

<?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.temp.dao.StudentDao;>

<!--
    一个java对象作为接口方法的参数;使用对象的属性作为属性值 #{属性值}
    语法;#{属性值};mybatis调用此对象的属性的getxxx()方法获取属性值;所以该类必须有get方法
    
    如;
	接口方法;参数为;Student
	void select(Student student)

	sql语句的占位符为;#{id}
   那么就会调用Student的getId()方法;获取到值后替换该占位符
-->
    <select id=;selectStudentByObject; resultType=;com.temp.domain.Student;>
        select * from student where id = #{id} and id = #{name}
    </select>
</mapper>

按位传值;不建议使用;

用在多个基本类型的属性

参数位置;dao接口中方法的形参列表;从左往右;参数位置是0,1,2…
格式;#{arg0},#{arg1}
Mybatis入门

Map传值;不建议使用;

dao接口的方法形参是Map类型
语法;#{key}。通过Map对象的key来获取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.temp.dao.StudentDao;>

    <select id=;selectStudentByIdAndName; resultType=;com.temp.domain.Student;>
        select * from student where id = #{id} and name = #{name}
    </select>
</mapper>
//接口
public interface StudentDao {

    Student selectStudentByIdAndName(Map<String,Object> map);
}



// 测试
    ;Test
    public void test() throws IOException {

        SqlSession sqlSession = MyBatisUtil.getSqlSession(true);

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

        HashMap<String, Object> map = new HashMap<>();

        map.put(;id;,100);
        map.put(;name;,;黄某人;);

        Student student = mapper.selectStudentByIdAndName(map);

        System.out.println(student);
        // 关闭会话
        sqlSession.close();
    }

关系图

Mybatis入门

#{}和${}占位符的区别

#{}占位符;mybatis在处理 #{}占位符的时候;使用的是PrepareStatment类;#{}常用作为列值使用
${}占位符;mybatis在处理${}占位符的时候;使用的是Statment类,且不区分数据类型,${}常用作表名或列明
PrepareStatment类;可以解决SQL注入问题
所以;建议使用#{}占位符

两个占位符用法基本相同
不同点;

使用${}占位符;如果dao接口中的方法都是基本类型的;不管有一个还是多个;都必须使用;Param注解;否则报错${}不会给值添加单引号
select * from student where name= #{name}
结果; select * from student where id = ‘黄某人’;运行正常;


select * from student where name = ${name}
结果;select * from student where id = 黄某人;运行报错;

${}常用在表名和列名
#{}常用在列值

#{}和${}一起使用

<?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.temp.dao.StudentDao;>

    <select id=;selectStudentById; resultType=;com.temp.domain.Student;>
        select * from ${tableName} where id = #{id}
    </select>
</mapper>
//接口
public interface StudentDao {

    Student selectStudentById(;Param(value = ;tableName;)String tableName,;Param(value = ;id;) Integer id);
}



 // 测试
    ;Test
    public void test() throws IOException {

        SqlSession sqlSession = MyBatisUtil.getSqlSession(true);

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

        HashMap<String, Object> map = new HashMap<>();


        Student student = mapper.selectStudentById(;student;,100);

        System.out.println(student);
        // 关闭会话
        sqlSession.close();
    }

Mybatis入门

封装MyBatis查询结果

resultType和resultMap只能用在<select>标签中;因为只有查询才会返回数据库的数据。所以<select>需要resultType和resultMap来指定封装的类型;然后把数据封装到一个类里面

自定义别名

注意;MyBatis主配置文件中标签的Mybatis入门
上方图片地方步骤;打开MyBatis主配置文件;按住Ctrl键;鼠标点击配置文件的根标签;查看源代码;可以看到标签之间的顺序

第一种; 在MyBatis主配置文件<typeAliases>;注意顺序;标签中使用<typeAlias>标签声明别名
<?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>
    <settings>
        <setting name=;logImpl; value=;STDOUT_LOGGING;/>	
    </settings>
<!--
	注意;typeAliases和typeAlias 不是同一个标签
		对比如下;;要细心;
		typeAliases
		typeAlias 
-->

<!-- 注意typeAliases标签的顺序 -->
    <typeAliases>
   		<!-- 使用typeAlias标签 -->
        <typeAlias type=;com.temp.domain.Student; alias=;student; />
    </typeAliases>

    <environments default=;development;>
        <environment id=;development;>
            <transactionManager type=;JDBC;/>
            <dataSource type=;POOLED;>
                <property name=;driver; value=;com.mysql.cj.jdbc.Driver;/>
                <property name=;url; value=;jdbc:mysql://localhost:3306/mybatis?useUnicode=true&amp;characterEncoding=utf-8;/>
                <property name=;username; value=;root;/>
                <property name=;password; value=;123456;/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <mapper resource=;com	empdaoStudentDao.xml;/>
    </mappers>
</configuration>
第二种; 在MyBatis主配置文件中<typeAliases>标签中使用<package>标签中声明
<?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>
    <settings>
        <setting name=;logImpl; value=;STDOUT_LOGGING;/>
    </settings>

<!-- 注意typeAliases标签的顺序 -->
    <typeAliases>
    <!-- 使用package标签 -->
        <package name=;com.temp.domain; />
    </typeAliases>

    <environments default=;development;>
        <environment id=;development;>
            <transactionManager type=;JDBC;/>
            <dataSource type=;POOLED;>
                <property name=;driver; value=;com.mysql.cj.jdbc.Driver;/>
                <property name=;url; value=;jdbc:mysql://localhost:3306/mybatis?useUnicode=true&amp;characterEncoding=utf-8;/>
                <property name=;username; value=;root;/>
                <property name=;password; value=;123456;/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <mapper resource=;com	empdaoStudentDao.xml;/>
    </mappers>
</configuration>

两者的区别
一个<typeAlias>标签只能为一个类自定义别名。
而<package>标签可以为一个包里面的所有类加上别名;别名固定为类的名字;不区分大小写;。

两个的优缺点;

一个<typeAlias>可以为一个类自定义别名;但是不能批量的为类自定义别名<package>可以批量的为类添加别名;别名固定是类的名字;不区分大小写;;但是不能自定义别名使用<package>;如果有两个类是同名;那么会发生错误

resultType属性

resultType;表示结果类型;mysql执行sql语句;得到java对象的类型(通过set方法赋值)。
值的两种方式;

java类型的全限定名称别名

<select id=“selectStudentById” resultType=“com.temp.domain.Student”>
select id,name,phone,age from student where id = #{id}
</select>


resultType;现在使用java类型的全限定名称。表示的意思mybatis执行sql;把resultSet中的数据转为Student类型的对象。
mybatis会做以下操作;

调用com.temp.com.domain.Student的无参构造方法来创建对象。
Student student = new Student();同名的列;赋值给同名的属性;通过调用set方法赋值
student.setId(rs.getInt(“id”));
student.setName(rs.getString(“name”));得到java对象;如果dao接口返回值是List集合;mybatis会把student对象放入List集合
注意; resultType中的类;必须有set方法;否则赋值失败

注意;
如果 resultType传入的是Map类型;MyBatis执行sql;会把ResultSet转为Map对象
SQL执行结果;列名作为Map的Key;列值作为Map的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.temp.dao.StudentDao;>

    <select id=;selectStudentById; resultType=;java.util.HashMap;>
        select * from student where id = #{id}
    </select>
</mapper>
//接口
public interface StudentDao {

    HashMap<String,Object> selectStudentById(Integer id);
}




// 测试
    ;Test
    public void test() throws IOException {

        SqlSession sqlSession = MyBatisUtil.getSqlSession(true);

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

        HashMap<String, Object> map = mapper.selectStudentById(100);

        System.out.println(;字段的列名作为Map的Key;列值作为Map的Value;);
        System.out.println(;输出Map结果;; ; map);

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

Mybatis入门

上方查询的只有一个数据;如果有多条数据会报错;因为执行的时候调用的是selectOne()方法
错误示范;

<?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.temp.dao.StudentDao;>

    <select id=;selectStudent; resultType=;java.util.HashMap;>
        select * from student
    </select>
</mapper>
//接口
public interface StudentDao {

    HashMap<String,Object> selectStudent();
}



// 测试
    ;Test
    public void test() throws IOException {

        SqlSession sqlSession = MyBatisUtil.getSqlSession(true);

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

        HashMap<String, Object> map = mapper.selectStudent();

        System.out.println(;字段的列名作为Map的Key;列值作为Map的Value;);
        System.out.println(;输出Map结果;; ; map);

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

Mybatis入门

resultMap属性

resulteMap;结果映射。自定义列名和java对象属性的对应关系。常用在列名和属性名不一致的情况下;当然一致的情况下也是可以使用。

用法;

mapper文件定义<resultMap>标签,指定列名和属性名的对应关系在<select>标签使用resultMap属性;指定<resultMap>标签的id值

实例如下;
下面演示的是列名和属性名一致的情况;不一致的情况也是一样的用法。

<?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.temp.dao.StudentDao;>

<!--
    第一步;resultMap标签中设置列名和属性名的对应关系
    属性id;resultMap映射关系的名称
    属性type;java类型的全限定名称
-->
    <resultMap id=;student; type=;com.temp.domain.Student;>
        <!--
            给主键字段设置映射关系的时候;使用<id>标签;普通字段使用<result>标签

            属性column;表示字段名
            属性property;表示属性名
            以下就是为字段和属性之间添加了映射关系
            <id column=;字段名; property=;java类的属性名; />
         -->

        <id column=;id; property=;sid; />
        <result column=;name; property=;sname; />
        <result column=;age; property=;age; />
        <result column=;phone; property=;phone; />
    </resultMap>

<!-- 第二部在select标签中的resultMap写入<resultMap>标签的id属性值 -->
    <select id=;selectStudent; resultMap=;student;>
        select * from student where id = #{id}
    </select>
</mapper>
//接口
public interface StudentDao {

    Student selectStudent(Integer id);
}



// 实体类
public class Student {
    private Integer sid;
    private String sname;
    private String phone;
    private Integer age;


	// 此处省略set、get、toString方法
}




// 测试
    ;Test
    public void test() throws IOException {

        SqlSession sqlSession = MyBatisUtil.getSqlSession(true);

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

        Student student = mapper.selectStudent(100);


        System.out.println(student);

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

Mybatis入门

网友评论

快盘下载暂未开通留言功能。

关于我们| 广告联络| 联系我们| 网站帮助| 免责声明| 软件发布

Copyright 2019-2029 【快快下载吧】 版权所有 快快下载吧 | 豫ICP备10006759号公安备案:41010502004165

声明: 快快下载吧上的所有软件和资料来源于互联网,仅供学习和研究使用,请测试后自行销毁,如有侵犯你版权的,请来信指出,本站将立即改正。