MyBatis官方文档连接地址;https://mybatis.org/mybatis-3/zh/index.html
创建Student表;并且添加数据
<!-- 在pom文件中的<build>标签中添加一下配置 -->
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.xml</include>
<include>**/*.properties</include>
</includes>
</resource>
</resources>
<!-- 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>
包结构如下;
注意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 ;
;};;
}
}
在接口同包下创建Mapper文件
注意;com.temo包打错了;应该是com.temp
<!-- 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>
在资源配置文件夹创建MyBates.xml
注意;com.temo包打错了;应该是com.temp
<!-- 主配置文件名;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&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>
-->
// 测试
;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();
}
MyBatis框架是不自动提交事务的;通过下面的步骤二来证实这句话
在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&characterEncoding=utf-8;/>
<property name=;username; value=;root;/>
<property name=;password; value=;123456;/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource=;com empdaoStudentDao.xml;/>
</mappers>
</configuration>
<!-- 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框架又会把打开自动提交
<!-- 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框架是不自动提交事务的”这句话
如果想要插入成功;则需要我们主动调用方法来提交事务;实例如下;
其他代码不动;在测试代码中;关闭会话之前写入提交方法;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();
}
数据库
之前的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();
}
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框架的底层就是JDBC
什么是模板?
图片中标出的都是IDEA自带的模板
如下图;表示已经创建模板成功
dao代理技术由mybatis创建StudentDao接口的实现类Proxy;StudentDaoImpl;
使用框架创建的Proxy代替自己手工写的StudentDaoImpl类的功能;就不需要开发人员写Dao接口的实现类了
使用dao代理要求;
mapper文件中<mapper>标签中的namespace属性必须是dao接口的全限定名称mapper文件中的<select>、<insert>等标签的id属性值必须是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();
}
用于给SQL语句中的#{属性名}传入参数
parameterType属性作用;表示传入的值是什么类型的
parameterType属性可以省略;因为mybatis可以通过反射;获取到dao接口中方法的参数类型;所以可以不写
用法;
<select id=“selectStudentById” parameterType=“类的全限定名称” resultType=“com.temp.domain.Student”>
select * from student where id = #{sid}
</select>
parameterType=“类的全限定名称”
如果是类型是四类八种的其中一种;可以写别名。如下;
#{参数;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注解属性;
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=;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}
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在处理 #{}占位符的时候;使用的是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();
}
resultType和resultMap只能用在<select>标签中;因为只有查询才会返回数据库的数据。所以<select>需要resultType和resultMap来指定封装的类型;然后把数据封装到一个类里面
第一种; 在MyBatis主配置文件<typeAliases>;注意顺序;标签中使用<typeAlias>标签声明别名注意;MyBatis主配置文件中标签的
上方图片地方步骤;打开MyBatis主配置文件;按住Ctrl键;鼠标点击配置文件的根标签;查看源代码;可以看到标签之间的顺序
<?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&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&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>可以批量的为类添加别名;别名固定是类的名字;不区分大小写;;但是不能自定义别名使用<package>;如果有两个类是同名;那么会发生错误
一个<typeAlias>标签只能为一个类自定义别名。
而<package>标签可以为一个包里面的所有类加上别名;别名固定为类的名字;不区分大小写;。
两个的优缺点;
resultType;表示结果类型;mysql执行sql语句;得到java对象的类型(通过set方法赋值)。
值的两种方式;
<select id=“selectStudentById” resultType=“com.temp.domain.Student”>
调用com.temp.com.domain.Student的无参构造方法来创建对象。
select id,name,phone,age from student where id = #{id}
</select>
resultType;现在使用java类型的全限定名称。表示的意思mybatis执行sql;把resultSet中的数据转为Student类型的对象。
mybatis会做以下操作;
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();
}
上方查询的只有一个数据;如果有多条数据会报错;因为执行的时候调用的是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();
}
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();
}