这篇笔记课程来自B站的尚硅谷杨博超老师的课程
第一个:mybatis_helloworld模板
一.MyBatis下载
1 、驱动类 driver-class-nameMySQL 5 版本使用 jdbc5 驱动,驱动类使用: com.mysql.jdbc.DriverMySQL 8 版本使用 jdbc8 驱动,驱动类使用: com.mysql.cj.jdbc.Driver2 、连接地址 urlMySQL 5 版本的 url :jdbc:mysql://localhost:3306/ssmMySQL 8 版本的 url :jdbc:mysql://localhost:3306/ssm?serverTimezone=UTC否则运行测试用例报告如下错误:java.sql.SQLException: The server time zone value 'Öйú±ê׼ʱ¼ä' is unrecognized orrepresents more
2.创建maven工程
<dependencies>
<!-- Mybatis核心 -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.7</version>
</dependency><!-- junit测试 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency><!-- MySQL驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.16</version>
</dependency>
</dependencies>
<?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/ssm?
serverTimezone=UTC"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</dataSource>
</environment>
</environments>
<!--引入映射文件-->
<mappers>
<package name="mappers/UserMapper.xml"/>
</mappers>
</configuration>
4.创建mapper接口
public interface UserMapper {
/**
* 添加用户信息
*/
int insertUser();
}
5.创建MyBatis的映射文件
![](https://i-blog.csdnimg.cn/blog_migrate/571331ccefb686f8d15d1530097d2c30.png)
namespace="com.atguigu.mybatis.mapper.UserMapper"保持一致
![](https://i-blog.csdnimg.cn/blog_migrate/a0cb363493e73e79079ed43d78c17e72.png)
![](https://i-blog.csdnimg.cn/blog_migrate/4623a0e64a074e5ed4077fe9f7fbd336.png)
调用流程:当我们在调用mapper接口(UserMapper)中的方法(insertUser)的时候,就会根据mapper接口的全类名(com.atguigu.mybatis.mapper.UserMapper),而找到我们的映射文件,然后在根据我们当前要调用的方法的方法名((insertUser))来找到我们当前的sql语句,然后来获取我们标签中的sql 语句 insert into t_user values(null,'admin','123456',23,'男','12345@qq.com')从而执行这个sql
课堂笔记
<!-- mapper接口和映射文件要保证两个一致: 1、mapper接口的全类名和映射文件的namespace一致 2、mapper接口中的方法的方法名要和映射文件中的sql的id保持一致 -->
5.2 引入mybatis的映射文件
<mapper resource="mappers/UserMapper.xml"/>
先用mybatis-config.xml在访问mappers 然后在访问UserMapper.xml
6. 通过junit测试功能
public class MyBatisTest {
@Test
public void testInsert() throws IOException {
//获取核心配置文件的输入流
InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
//获取SqlSessionFactoryBuilder对象
SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
//获取SqlSessionFactory对象
SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(is);
//获取sql的会话对象SqlSession(不会自动提交事务),是MyBatis提供的操作数据库的对象
// SqlSession sqlSession = sqlSessionFactory.openSession();
//获取sql的会话对象SqlSession(会自动提交事务),是MyBatis提供的操作数据库的对象
SqlSession sqlSession = sqlSessionFactory.openSession(true);
//获取UserMapper的代理实现类对象
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
//调用mapper接口中的方法,实现添加用户信息的功能
int result = mapper.insertUser();
//提供sql以及的唯一标识找到sql并执行,唯一标识是namespace.sqlId 用得少
/*int result = sqlSession.insert("com.atguigu.mybatis.mapper.UserMapper.insertUser");*/
System.out.println("结果:"+result);
//提交事务
//sqlSession.commit();
//关闭SqlSession
sqlSession.close();
}
}
SqlSession :代表 Java 程序和 数据库 之间的 会话 。( HttpSession 是 Java 程序和浏览器之间的会话)SqlSessionFactory :是 “ 生产 ”SqlSession 的 “ 工厂 ” 。工厂模式:如果创建某一个对象,使用的过程基本固定,那么我们就可以把创建这个对象的相关代码封装到一个 “ 工厂类 ” 中,以后都使用这个工厂类来 “ 生产 ” 我们需要的对象。
7.加入log4j日志功能
<!-- log4j 日志 --><dependency><groupId> log4j </groupId><artifactId> log4j </artifactId><version> 1.2.17 </version></dependency>
②加入log4j的配置文件
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
<appender name="STDOUT" class="org.apache.log4j.ConsoleAppender">
<param name="Encoding" value="UTF-8" />
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%-5p %d{MM-dd HH:mm:ss,SSS}
%m (%F:%L) \n" />
</layout>
</appender>
<logger name="java.sql">
<level value="debug" />
</logger>
<logger name="org.apache.ibatis">
<level value="info" />
</logger>
<root>
<level value="debug" />
<appender-ref ref="STDOUT" />
</root>
</log4j:configuration>
日志的级别
查看源码:主要查看insert方法底层的实现
过程:f7 进入方法中 (在实践操作中进行调试后源码和视频的不太相同 所以这个内容还不是很明白,以下图片是视频图片)
f8 往下走
进入invoke方法
f7进入方法中
f8往下走
f8往下走
alt+f9 跳过
工具类
public class SqlSessionUtil {
public static SqlSession getSqlSession(){
SqlSession sqlSession = null;
try {
//获取核心配置文件的输入流
InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
//获取SqlSessionFactoryBuilder
SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
//获取SqlSessionFactory
SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(is);
//获取SqlSession对象
sqlSession = sqlSessionFactory.openSession(true);
} catch (IOException e) {
e.printStackTrace();
}
return sqlSession;
}
}
三. MyBatis的增删改查
修改:
UserMapper
/**
* 修改用户信息
*/
void updateUser();
UserMapper.xml
<!--void updateUser();-->
<update id="updateUser">
update t_user set username='root',password='123' where id = 3
</update>
MyBatisTest
@Test
public void testUpdate(){
SqlSession sqlSession = SqlSessionUtil.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
mapper.updateUser();
sqlSession.close();
}
删除:
UserMapper
/**
* 删除用户信息
*/
void deleteUser();
UserMapper.xml
<!--void deleteUser();-->
<delete id="deleteUser">
delete from t_user where id = 3
</delete>
MyBatisTest
@Test
public void testDelete(){
SqlSession sqlSession = SqlSessionUtil.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
mapper.deleteUser();
sqlSession.close();
}
查询:
根据id查询用户信息
UserMapper
/**
* 根据id查询用户信息
* @return
*/
User getUserById();
UserMapper.xml
<!--User getUserById();-->
<!--
resultType:设置结果类型,即查询的数据要转换为的java类型
resultMap:自定义映射,处理多对一或一对多的映射关系
-->
<select id="getUserById" resultType="com.atguigu.mybatis.pojo.User">
select * from t_user where id = 1
</select>
MyBatisTest
/*根据id查询用户信息*/
@Test
public void testGetUserById(){
SqlSession sqlSession = SqlSessionUtil.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
User user = mapper.getUserById();
System.out.println(user);
}
查询所有的用户信息
UserMapper
/**
* 查询所有的用户信息
* @return
*/
List<User> getAllUser();
UserMapper.xml
<!--List<User> getAllUser();-->
<select id="getAllUser" resultType="com.atguigu.mybatis.pojo.User">
select * from t_user
</select>
MyBatisTest
@Test
public void testGetAllUser(){
SqlSession sqlSession = SqlSessionUtil.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
List<User> list = mapper.getAllUser();
list.forEach(System.out::println);
}
四 .核心配置文件详解
<!-- MyBatis核心配置文件中的标签必须要按照指定的顺序配置: properties?,settings?,typeAliases?,typeHandlers?, objectFactory?,objectWrapperFactory?,reflectorFactory?, plugins?,environments?,databaseIdProvider?,mappers? -->
1.核心配置文件详解之environments
mybatis-config.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>
<!--
environments:配置连接数据库的环境
属性:
default:设置默认使用的环境的id(测试/开发)
-->
<environments default="development">
<!--开发环境-->
<environment id="development">
<!--
environment:设置一个具体的连接数据库的环境
属性:
id:设置环境的唯一标识,不能重复(开发/测试)
-->
<!--
transactionManager:设置事务管理器
属性:
type:设置事务管理的方式
type="JDBC|MANAGED"
JDBC:表示使用JDBC中原生的事务管理方式
(自动提交我们可以手动开启和关闭,我们也可以手动的提交和回滚事物,我们创建出来的sqlsession可以自动提交,也可以不自动提交,通过sqlsession里面的
commit()手动提交,)
MANAGED:被管理,例如Spring
-->
<transactionManager type="JDBC"/>
<!--
dataSource:设置数据源
属性:
type:设置数据源的类型
type="POOLED|UNPOOLED|JNDI"
POOLED:表示使用数据库连接池
UNPOOLED:表示不使用数据库连接池
JNDI:表示使用上下文中的数据源
-->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/ssm?serverTimezone=UTC"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</dataSource>
</environment>
<!--测试环境-->
<environment id="test">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/ssm?serverTimezone=UTC"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</dataSource>
</environment>
</environments>
<!--引入映射文件-->
<mappers>
<mapper resource="mappers/UserMapper.xml"/>
</mappers>
</configuration>
2.核心配置文件详解之properties
jdbc.properties
jdbc.driver=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/ssm?serverTimezone=UTC
jdbc.username=root
jdbc.password=123456
在mybatis-config.xml文件引入jdbc.properties文件
<!--引入properties文件,此后就可以在当前文件中使用${key}的方式访问value-->
<properties resource="jdbc.properties" />
在mybatis-config.xml文件修改
<!--开发环境-->
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</dataSource>
</environment>
测试:
1.核心配置文件详解之typeAliases
第一种方式设置别名:假设取别名为abc如下:
mybatis-config.xml
<!--
typeAliases:设置类型别名,即为某个具体的类型设置一个别名
在MyBatis的范围中,就可以使用别名表示一个具体的类型
-->
<typeAliases>
<!--
type:设置需要起别名的类型
alias:设置某个类型的别名
-->
<typeAlias type="com.atguigu.mybatis.pojo.User" alias="abc"></typeAlias>
</typeAliases>
UserMapper.xml
<!--List<User> getAllUser();-->
<select id="getAllUser" resultType="abc">
select * from t_user
</select>
测试
第二种方式设置别名
mybatis-config.xml
<!--
typeAliases:设置类型别名,即为某个具体的类型设置一个别名
在MyBatis的范围中,就可以使用别名表示一个具体的类型
-->
<typeAliases>
<!--
type:设置需要起别名的类型
alias:设置某个类型的别名
这里面没有alias 因为有默认的别名,即类名且不区分大小写
-->
<!--若不设置alias,当前的类型拥有默认的别名,即类名且不区分大小写-->
<!--<typeAlias type="com.atguigu.mybatis.pojo.User"></typeAlias>-->
</typeAliases>
UserMapper.xml
//因为不区分大小写 所以User或user都可以 不过建议写成类名,也就是User
//因为写成类名更加直观 因为后面的实体太多 一张表对应一张实体类,对应一个mapper接口,对应
//一个映射文件 因为表越多 实体类就会越多 如果给每一张表都给他设置别人的话 太多了 所以这个也不建议写 可用第三种方式
<!--List<User> getAllUser();-->
<select id="getAllUser" resultType="user">
select * from t_user
</select>
或
<!--List<User> getAllUser();-->
<select id="getAllUser" resultType="User">
select * from t_user
</select>
测试:
第三种方式设置别名
mybatis-config.xml
<!--
typeAliases:设置类型别名,即为某个具体的类型设置一个别名
在MyBatis的范围中,就可以使用别名表示一个具体的类型
-->
<typeAliases>
<!--
type:设置需要起别名的类型
alias:设置某个类型的别名
-->
<!--通过包设置类型别名,指定包下所有的类型将全部拥有默认的别名,即类名且不区分大小写-->
<package name="com.atguigu.mybatis.pojo"/>
</typeAliases>
UserMapper.xml
<!--List<User> getAllUser();-->
<select id="getAllUser" resultType="User">
select * from t_user
</select>
测试:
3 .核心配置文件详解之mappers
resources/com/atguigu/mybatis/mapper
在resources下面新建一个包com/atguigu/mybatis/mapper
然后把原来在mappers下面的映射文件UserMapper.xml放到resources/com/atguigu/mybatis/mapper
mybatis-config.xml
<!--引入mybatis的映射文件-->
<mappers>
<!--<mapper resource="mappers/UserMapper.xml"/>-->
<!--
以包的方式引入映射文件,但是必须满足两个条件:
1、mapper接口和映射文件所在的包必须一致
2、mapper接口的名字和映射文件的名字必须一致
-->
<package name="com.atguigu.mybatis.mapper"/>
</mappers>
测试:
<!-- 以包的方式引入映射文件,但是必须满足两个条件: 1、mapper接口和映射文件所在的包必须一致 2、mapper接口的名字和映射文件的名字必须一致 -->
mapper接口和映射文件虽然包的名字一样 可是不在同一个目录下,如何保证他们所在的包一致
其实这二目录里面的内容加载之后是在同一个目录下的
P18
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>
<!--
MyBatis核心配置文件中的标签必须要按照指定的顺序配置:
properties?,settings?,typeAliases?,typeHandlers?,
objectFactory?,objectWrapperFactory?,reflectorFactory?,
plugins?,environments?,databaseIdProvider?,mappers?
-->
<!--引入properties文件,此后就可以在当前文件中使用${key}的方式访问value-->
<properties resource="jdbc.properties" />
<typeAliases>
<!--实体类 所在的包,通过包设置类型别名,指定包下所有的类型将全部拥有默认的别名,即类名且不区分大小写-->
<package name=""/>
</typeAliases>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</dataSource>
</environment>
</environments>
<!--引入mybatis的映射文件-->
<mappers>
<package name=""/>
</mappers>
</configuration>
sqlMapConfig
5.映射文件模板
<?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="">
</mapper>
EmployeeMapper.xml
P19
第二个模板:mybatis_parameter
一 .使用模板搭建Mybatis框架 com.atguigu.mybatis
第一步:创建mybatis_parameter
第二步: 从mybatis_helloworld的resources中复制jdbc.properties和log4j.xml到mybatis_parameter的resources中
第三步:创建核心配置文件
第四步:创建Mapper接口
com.atguigu.mybatis.mapper.UserMapper
第五步:创建映射文件
com/atguigu/mybatis/mapper
mapper接口和映射文件是相对应的,所以namespace应该和mapper接口的全类名一致
第六步:创建实体类
从mybatis_helloworld的pojo中复制User到mybatis_parameter的pojo中(也可以自己写实体类)
第七步 找到核心配置文件mybatis-config.xml
在设置类型别名地方,写在实体类所在的包
<typeAliases>
<!--实体类 所在的包,通过包设置类型别名,指定包下所有的类型将全部拥有默认的别名,即类名且不区分大小写-->
<package name="com.atguigu.mybatis.pojo"/>
</typeAliases>
在引入映射文件的地方,写上映射文件所对应的包
<!--引入mybatis的映射文件 映射文件据对对应的包-->
<mappers>
<package name="com.atguigu.mybatis.mapper"/>
</mappers>
以上内容为B站的尚硅谷杨博超老师的课程P001-p019的笔记 如有不足 请评论指导