mybatis是什么
mybatis是一个帮助程序员专注与编写sql语句, 简化其他操作, 同时也对程序的员的sql语句编写能力有一定要求。他具体工作是:将从数据库查询得到的数据生成所需要的java对象;将java对象中的数据用sql持久化到数据库中。通俗点就是来回封装转换
myBatis运行逻辑
- SqlMapConfig.xml 是主配置文件
- Mapper 是映射通常一个映射对应一个dao层的实现类 一般也对应一个表
- sqlSessionFactory 是mybatis 和 java 间的封装和对象转换 生成sqlSession
- sqlSession 增删改查语句写在其中 执行依赖executor
- 其中最后面的 executor 和 mappedStatement 是执行器和声明(是预编译声明的一个子类)【这个跟我们一般用不到,他们在底层自己执行了】
用到的jar包 (推荐用maven 直接导入)
导入mybatis
<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.6</version>
</dependency>
导入mybatis的依赖日志
其中commons-logging 是日志门面 规范了日志 像一个接口 log4j是日志实现
<!-- https://mvnrepository.com/artifact/commons-logging/commons-logging -->
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.2</version>
</dependency>
<!-- https://mvnrepository.com/artifact/log4j/log4j -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
mysql 和 druid 连接池
<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.28</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.alibaba/druid -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.2.8</version>
</dependency>
配置文件
log4j.properties (文件名不能变)
log4j.rootLogger=Debug, stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n
sqlMapConfig.xml (主配置文件 文件名随便)
其中setting里面的设置
- 日志实现
- 懒加载
- 缓存
- 矩阵传输
- 数据库下滑线命名 自动映射成为 驼峰命名法 (camel_case - > camelCase)
下面的设置就是链接池的设置 数据库url username password 可以看我的操作数据库的文章
链接如下:https://blog.csdn.net/little_wolf_yyds/article/details/134380252
<?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的全局参数设置,基本用来进行MyBatis的优化处理 -->
<settings>
<setting name="logImpl" value="LOG4J"/>
<setting name="lazyLoadingEnabled" value="true"/>
<setting name="aggressiveLazyLoading" value="false"/>
<setting name="cacheEnabled" value="true"/>
<setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>
<!-- 以下配置不需掌握,和Spring整合后,以下配置将被废除 -->
<environments default="mysqlEnv">
<environment id="mysqlEnv">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="url"
value="jdbc:mysql://localhost:3306/mybatis?useSSL=false&serverTimezone=Hongkong"/>
<property name="username" value="root"/>
<property name="password" value=""/>
</dataSource>
</environment>
</environments>
</configuration>
实施数据库操作
准备表
举例子 : worker表 并且在 java 当中创建对应的 java bean 来封装
java 创建一个运行类
InputStream inputStream = Resources.getResourceAsStream("sqlMapConfig.xml");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession sqlSession = sqlSessionFactory.openSession();
List<Worker> workers = sqlSession.selectList("myWorker.queryAll");
for (Worker worker : workers) {
System.out.println(worker);
}
System.out.println("----------------------------------------------");
Worker worker = sqlSession.selectOne("myWorker.QueryById", "9001");
System.out.println(worker);
sqlSession.close();
resources文件夹
WorkerMapper.xml 中写sql语句 来操作数据库
其中namespace 是自己定义的名字 java运行类中调用 xx.方法id 后面给他需要的参数
resulrtType parameterYype 分别是 返回值类型 和 参数类型
四个操作 insert delete update 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="myWorker">
<select id="queryAll" resultType="com.wolf.bean.Worker">
select * from worker
</select>
<select id="QueryById" resultType="com.wolf.bean.Worker" parameterType="string">
select * from worker where wid = #{value}
</select>
</mapper>
改操作没有返回值不用写, 但是他用了我们自己写的bean封装的 所以传给他的参数是自己worker的实例类 #{}中的参数是bean里面的对应的参数 一个字默认就是value
<update id="updateSexById" parameterType="com.wolf.bean.Worker">
update worker set sex = #{sex} where wid = #{wid}
</update>
在sqlMapConfig 文件下 配置
用mybatis实现mapper接口动态代理(重点)
用配置文件来实现代理
代理要保证一定的一致性
一个接口 一个配置文件 名字一致 路径也要一致
配置文件里面的namespace 对应的是接口的位置
mapper namespace="com.wolf.mapper.WorkerMapper02">
主配置文件的变化
在sqlMapConfig中 配置要代理的类 的路径 所以是class 不是 resource
package也好理解就是把进行需要代理的mapper整个包都加载上
但是注意要是像如此重复配置了 就会报错的 所以两种选一种操作
org.apache.ibatis.binding.BindingException: Type interface com.wolf.mapper.WorkerMapper02 is already known to the MapperRegistry.
<mappers>
<mapper resource="WorkerMapper01.xml"/>
<mapper class="com.wolf.mapper.WorkerMapper02"/>
<package name="com.wolf.mapper"/>
</mappers>
用接口实现代理(重点中的重点)
直接在接口上 加上对应操作的四个注释中的一个 括号里面写好sql语句 #{} ${} 用法也都一样
@Select("select * from worker where wname = #{wname}")
public Worker QueryByName(String name);
test类
//读取配置文件 最后生成 sqlsession
InputStream inputStream = Resources.getResourceAsStream("sqlMapConfig.xml");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession sqlSession = sqlSessionFactory.openSession();
//代理
WorkerMapper02 mapper = sqlSession.getMapper(WorkerMapper02.class);
List<Worker> workers = mapper.queryAll();
for (Worker worker : workers) {
System.out.println(worker);
}
System.out.println("----------------------------------------------");
Worker worker = mapper.QueryById("9001");
System.out.println(worker);
System.out.println("----------------------------------------------");
Worker worker1 = mapper.QueryByName("牛魔王");
System.out.println(worker1);
sqlSession.close();
运行结果
DEBUG [main] - Logging initialized using 'class org.apache.ibatis.logging.commons.JakartaCommonsLoggingImpl' adapter.
DEBUG [main] - Logging initialized using 'class org.apache.ibatis.logging.log4j.Log4jImpl' adapter.
DEBUG [main] - PooledDataSource forcefully closed/removed all connections.
DEBUG [main] - PooledDataSource forcefully closed/removed all connections.
DEBUG [main] - PooledDataSource forcefully closed/removed all connections.
DEBUG [main] - PooledDataSource forcefully closed/removed all connections.
DEBUG [main] - Class not found: org.jboss.vfs.VFS
DEBUG [main] - JBoss 6 VFS API is not available in this environment.
DEBUG [main] - Class not found: org.jboss.vfs.VirtualFile
DEBUG [main] - VFS implementation org.apache.ibatis.io.JBoss6VFS is not valid in this environment.
DEBUG [main] - Using VFS adapter org.apache.ibatis.io.DefaultVFS
DEBUG [main] - Find JAR URL: file:/E:/JavaProgram/myBatis_P/target/classes/com/wolf/mapper
DEBUG [main] - Not a JAR: file:/E:/JavaProgram/myBatis_P/target/classes/com/wolf/mapper
DEBUG [main] - Reader entry: WorkerMapper02.class
DEBUG [main] - Reader entry: WorkerMapper02.xml
DEBUG [main] - Listing file:/E:/JavaProgram/myBatis_P/target/classes/com/wolf/mapper
DEBUG [main] - Find JAR URL: file:/E:/JavaProgram/myBatis_P/target/classes/com/wolf/mapper/WorkerMapper02.class
DEBUG [main] - Not a JAR: file:/E:/JavaProgram/myBatis_P/target/classes/com/wolf/mapper/WorkerMapper02.class
DEBUG [main] - Reader entry: ���� 4
DEBUG [main] - Find JAR URL: file:/E:/JavaProgram/myBatis_P/target/classes/com/wolf/mapper/WorkerMapper02.xml
DEBUG [main] - Not a JAR: file:/E:/JavaProgram/myBatis_P/target/classes/com/wolf/mapper/WorkerMapper02.xml
DEBUG [main] - Reader entry: <?xml version="1.0" encoding="UTF-8"?>
DEBUG [main] - Checking to see if class com.wolf.mapper.WorkerMapper02 matches criteria [is assignable to Object]
DEBUG [main] - Opening JDBC Connection
DEBUG [main] - Created connection 1472465.
DEBUG [main] - Setting autocommit to false on JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@1677d1]
DEBUG [main] - ==> Preparing: select * from worker
DEBUG [main] - ==> Parameters:
DEBUG [main] - <== Total: 9
Worker{wid='4792a048-5e5d-11e9-9dc0-28d244d68b7c', wname='令狐冲', age=50, sex='男'}
Worker{wid='4792a048-5e5d-11e9-9dc0-28d244d68b8c', wname='111', age=11, sex='男'}
Worker{wid='50f14e17-5e5d-11e9-9dc0-28d244d68b7c', wname='杨过', age=50, sex='男'}
Worker{wid='5af9f088-5e5d-11e9-9dc0-28d244d68b7c', wname='至尊宝', age=50, sex='男'}
Worker{wid='68c8d109-5e5d-11e9-9dc0-28d244d68b7c', wname='萧峰', age=50, sex='男'}
Worker{wid='6c6f2776-5e5d-11e9-9dc0-28d244d68b7c', wname='段誉', age=50, sex='男'}
Worker{wid='6fa801d8-5e5d-11e9-9dc0-28d244d68b7c', wname='虚竹', age=50, sex='男'}
Worker{wid='9001', wname='牛魔王', age=500, sex='男'}
Worker{wid='9d05ac22-5e5c-11e9-9dc0-28d244d68b7c', wname='郭靖', age=50, sex='男'}
----------------------------------------------
DEBUG [main] - ==> Preparing: select * from worker where wid = ?
DEBUG [main] - ==> Parameters: 9001(String)
DEBUG [main] - <== Total: 1
Worker{wid='9001', wname='牛魔王', age=500, sex='男'}
DEBUG [main] - Resetting autocommit to true on JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@1677d1]
DEBUG [main] - Closing JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@1677d1]
DEBUG [main] - Returned connection 1472465 to pool.
----------------------------------------------
DEBUG [main] - ==> Preparing: select * from worker where wname = ?
DEBUG [main] - ==> Parameters: 牛魔王(String)
DEBUG [main] - <== Total: 1
Worker{wid='9001', wname='牛魔王', age=500, sex='男'}
DEBUG [main] - Resetting autocommit to true on JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@1534f01b]
DEBUG [main] - Closing JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@1534f01b]
DEBUG [main] - Returned connection 355790875 to pool.
想要了解更多mybatis的 朋友可以看一下 本人的myBatis 进阶篇