MyBatis是一个支持普通SQL查询,存储过程和高级映射的优秀持久层框架。MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及对结果集的检索封装。MyBatis可以使用简单的XML或注解用于配置和原始映射,将接口和Java的POJO(Plain Old Java Objects,普通的Java对象)映射成数据库中的记录。
简单概括: 更加简化jdbc代码,简化持久层,sql语句从代码中分离,利用反射,将表中数据与java bean 属性一一映射即ORM(Object Relational Mapping 对象关系映射)
新建Java项目,导入核心java包与mybatis依赖jar包。
在项目下新建一个lib文件夹,把需要的架包复制到lib文件夹中。选中所有的jar包,右键build path->add to build path 即可。
mybatis提供两种配置文件, 核心配置文件 mybatis-config.xml或mybatis.xml 与 SQL映射文件mapper.xml。
1.在src下新建一个mybatis-config.xml文件。
2.去mybatis的官网(https://mybatis.org/mybatis-3/zh/getting-started.html),拷代码,粘贴复制到mybatis-config.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"> <!--mybatis的配置--> <configuration> <!--数据源的配置s 可以有多个--> <environments default="development"> <!--某一个具体的数据源环境--> <environment id="development"> <!--事务的控制--> <transactionManager type="JDBC"/> <!--数据源 连接池--> <dataSource type="POOLED"> <!--驱动--> <property name="driver" value="${driver}"/> <!--url--> <property name="url" value="${url}"/> <property name="username" value="${username}"/> <property name="password" value="${password}"/> </dataSource> </environment> </environments> <mappers> </mappers> </configuration>3.填入value值,这里以Oracle数据库为例:
<dataSource type="POOLED"> <!--驱动--> <property name="driver" value="oracle.jdbc.driver.OracleDriver"/> <!--url--> <property name="url" value="jdbc:oracle:thin:@localhost:1521:XE"/> <property name="username" value="SCOTT"/> <property name="password" value="TIGER"/> </dataSource>到这里mybatis核心配置文件就加载好了。
1.先要与数据库中的表对应,建立一个对应的类,比如类名为Dept。
2.在这个类的包下,建立一个DeptMapper.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="org.mybatis.example.BlogMapper"> <select id="selectBlog" resultType="Blog"> select * from Blog where id = #{id} </select> </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.shsxt.pojo.DeptMapper"> <!--查询语句,可以先不写--> <select id="selectDept" resultType="com.shsxt.pojo.Dept"> select * from dept where deptno = #{deptno} </select> </mapper>注意:不要忘记mybatis核心xml文件中的mapper配置。
3.在mybatis-config.xml中的mappers标签下添加DeptMapper.xml映射文件的路径
<mappers> <mapper resource="com/shsxt/pojo/DeptMapper.xml"/> </mappers>在另一个包下新建一个测试类:
public class Mybatis001 { public static void main(String[] args) throws Exception{ String resource = "mybatis-config.xml"; InputStream inputStream = Resources.getResourceAsStream(resource); //在mybatis中要使用SqlSession的对象来进行 SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); SqlSession sqlSession = sqlSessionFactory.openSession(); System.out.println(sqlSession); //测试代码 //释放资源 sqlSession.close(); inputStream.close(); } }如果输出了sqlsession对象的地址,则mybatis环境搭建成功。
日志是应用软件中不可缺少的部分,Apache的开源项目log4j是一个功能强大的日志组件,提供方便的日志记录。在apache网站:jakarta.apache.org/log4j可以免费下载到Log4j最新版本的软件包。
分为五个级别: DEBUG(人为调试信息)、INFO(普通信息)、WARN(警告)、ERROR(错误)、FATAL(系统错误)这五个级别是有顺序的,DEBUG < INFO < WARN < ERROR < FATAL,分别用来指定这条日志信息的重要程度,明白这一点很重要。
Log4j有一个规则:只输出级别不低于设定级别的日志信息,假设Loggers级别设定为INFO,则INFO、WARN、ERROR和FATAL级别的日志信息都会输出,而级别比INFO低的DEBUG则不会输出。
1.导包,上面已经导过了。
2.在src下新建一个 log4j.properties文件。
3.把下面的代码考入其中。
# Set root category priority to INFO and its only appender to CONSOLE. log4j.rootCategory=INFO, CONSOLE # log4j.rootCategory=INFO, CONSOLE, LOGFILE # CONSOLE is set to be a ConsoleAppender using a PatternLayout. log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout log4j.appender.CONSOLE.layout.ConversionPattern=- %m %c %l %d{yyyy-MMddHH:mm:ss}%n # LOGFILE is set to be a File appender using a PatternLayout. log4j.appender.LOGFILE=org.apache.log4j.FileAppender log4j.appender.LOGFILE.File=e:/test.log log4j.appender.LOGFILE.Append=true log4j.appender.LOGFILE.layout=org.apache.log4j.PatternLayout log4j.appender.LOGFILE.layout.ConversionPattern=- %m %l%n一个是在控制台(CONSOLE)输出,一个是在磁盘输出(LOGFILE)。你自己可以选择输出位置。
settings用于设置 MyBatis 在运行时的行为方式, 例如:缓存, 延迟加载, 日志等。
mybatis-config.xml核心配置文件下面的子目录必须按照以下顺序写:
(properties?,settings?,typeAliases?,typeHandlers?,objectFactory?,objectWrapperFactory?,reflectorFactory?,plugins?,environments?,databaseIdProvider?,mappers?)"。
<!-- settings标签 --> <settings> <!-- 设置MyBatis使用log4j日志支持 --> <setting name="logImpl" value="LOG4J"/> </settings>mybatis核心配置文件中添加properties标签,指定加载外部的properties文件,注意定义位置。
<!-- 加载外部的properties文件 --> <properties resource="db.properties"/>获取properties文件中数据时候,要通过${}的方式获取。
<dataSource type="POOLED"> <!--驱动--> <property name="driver" value="${driver}"/> <!--url--> <property name="url" value="${url}"/> <property name="username" value="${username}"/> <property name="password" value="${password}"/> </dataSource>注意:这里的value值要和db.properties里的值保持一致
用于给java类型定义别名,方便在配置文件中使用。
注意typeAliases标签在核心配置文件下的位置。
<typeAliases>< typeAliastype="com.shsxt.pojo.User"alias="u"/> </typeAliases>别名为类名。
<typeAliases> <package name="com.shsxt.pojo"/><!-- 包下所有的类默认类名 --> </typeAliases>别名配置好之后,我们的映射文件DeptMapper.xml下的查询语句的返回值类型,直接写类名就行。
<!--之前的写法--> <select id="selectDept" resultType="com.shsxt.pojo.Dept"> select * from dept where deptno = #{deptno} </select> <!--用过别名之后的写法--> <select id="selectDept" resultType="Dept"> select * from dept where deptno= 20 </select>下面是一些为常见的 Java 类型内建的类型别名。它们都是不区分大小写的,注意,为了应对原始类型的命名重复,采取了特殊的命名风格。
selectOne(“命名空间.id”) 用于查询单条数据,返回一个数据, 如果没有查到返回null。
DeptMapper.xml映射文件下: <!--查询部门编号为20的部门信息--> <select id="selectDept" resultType="Dept">//resultType是返回值类型,后面会详解 select * from dept where deptno= 20 </select> 测试类下: Dept dept = sqlSession.selectOne("om.shsxt.pojo.DeptMapper.selectDept"); System.out.println(dept);selectList(“命名空间.id”) 用户查询多条数据情况,返回一个List集合, 没有查到数据返回空集合,不是null。
DeptMapper.xml映射文件下: <!--查询所有的部门信息 集合,存放的就一个一个的Dept对象--> <select id="selectDeptAll" resultType="Dept"> select * from dept </select> 测试类下: List<Dept> depts = sqlSession.selectList("com.shsxt.pojo.DeptMapper.selectDeptAll"); depts.forEach(System.out::println);//方法引用selectMap(“命名空间.id”,key的字段名) 用于查询多条记录情况, 返回Map集合, 需要指定那个属性作为key, sql查询结果作为value,指定的字段值作为key, 如果查不到, 返回一个空map集合,不是null
DeptMapper.xml映射文件下: <!--查询所有的部门信息 集合,存放的就一个一个的Dept对象--> <select id="selectDeptMap" resultType="Dept"> select * from dept </select> 测试类下: /** * 查询所有的部门信息 集合,存放的就一个一个的Dept对象 selectMap 无序 */ Map<Integer, Dept> depts = sqlSession.selectMap("com.shsxt.pojo.DeptMapper.selectDeptMap", "deptno"); depts.forEach((t,u)->{ System.out.println(t + "--" + u); });如果执行的是条件查询,DML,需要在调用方法的时候传递参数,此时, 可以在sql标签中通过parameterType属性指定参数的类型(别名|权限定名). 而在sql语句,通过#{}的方式获取参数。
多个参数传递时, 由于sqlSession中提供的查询方法,只允许传递一个sql参数, 因此可以对多个参数进行封装,可以对象,集合,数组…
数组:
DeptMapper.xml映射文件下: <!--查询10部门和20部门还有30部门的部门信息 继续用map也可以--> <select id="selectByC" resultType="Dept" > select * from dept where deptno in /*遍历一个array集合, 每一个当前的元素都放入item-> e 在遍历开始 ( 结束 ) 每一个元素之间用 每一个元素之间用,分割*/ <foreach collection="array" item="e" open="(" close=")" separator=","> #{e} </foreach> </select> 测试类下: Integer[] arr = {10,20,30}; List<Dept> depts = sqlSession.selectList("com.shsxt.pojo.DeptMapper.selectByC", arr); depts.forEach(System.out::println);list:
DeptMapper.xml映射文件下: <select id="selectByD" resultType="Dept" parameterType="list"> select * from dept where deptno in /*遍历一个array集合, 每一个当前的元素都放入item-> e 在遍历开始 ( 结束 ) 每一个元素之间用 每一个元素之间用,分割*/ <foreach collection="list" item="e" open="(" close=")" separator=","> #{e} </foreach> </select> 测试类下: Integer[] arr = {10,20,30}; List<Integer> list = Arrays.asList(arr); List<Dept> depts = sqlSession.selectList("com.shsxt.pojo.DeptMapper.selectByD", list); depts.forEach(System.out::println);基本数据类型(包装类) 、 String 、Date 、JavaBean 、List Map 、List-Map。
封装好之后,在测试类只需要写:
//获取sqlSession SqlSession sqlSession = MyBatisUtils.getSqlSession(); //释放资源 MyBatisUtils.close(sqlSession);