一款优秀的持久层框架,支持自定义SQL、存储过程以及高级映射
免除了几乎所有JDBC代码以及设置参数和获取结果集的工作(JDBC的封装)
可通过简单的XML或注解配置和映射原始类型、接口和Java POJO(Plain Old Java Objects,普通老式Java对象)操作数据库
引入MyBatis和JDBC依赖
编写对应实体类和数据库信息
编写dao层接口
- public interface UserDao {
- // 查询所有用户信息
- List<User> selUser();
- }
dao层内配置与接口相关的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标签:一个接口对应一个mapper-->
- <!--namespace(指定接口位置(全类名))-->
- <mapper namespace="com.xxx.dao.UserDao">
- <!--不同功能标签封装不同操作(对应接口)-->
- <!--select:查询-->
- <!--update:更新-->
- <!--delete:删除-->
- <!--insert:插入-->
- <!--对接口中每一个抽象方法编写对应操作-->
- <!--id属性:绑定对应接口方法名-->
- <!--resultType:指定对应接口的实体类-->
- <select id="selUser" resultType="com.xxx.dao.modle.User">
- <!--接口要执行的SQL语句放在标签中-->
- SELECT * FROM user;
- </select>
- </mapper>
在src文件下配置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:指定环境(根据environment的id属性) -->
- <environments default="development">
- <!-- environment:环境(可配置多个) -->
- <!-- id:环境命名 -->
- <environment id="development">
- <transactionManager type="JDBC"/>
- <!-- dataSource:数据源 -->
- <dataSource type="POOLED">
- <!-- property:数据库连接信息 -->
- <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
- <property name="url"
- value="jdbc:mysql://localhost:3306/user?useUnicode=true&characterEncoding=UTF8&serverTimezone=UTC"/>
- <property name="username" value="root"/>
- <property name="password" value="123456"/>
- </dataSource>
- </environment>
- </environments>
- <mappers>
- <!-- mapper:接口对应的配置文件 -->
- <!-- resource:.xml资源路径 -->
- <mapper resource="com/xxx/dao/UserDao.xml"/>
- </mappers>
- </configuration>
应用MyBatis
- public static void main(String[] args) throws Exception {
- // 默认在src下读取文件
- InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");
- // 工厂模式:解析InputStream,生产sqlSession对象
- SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
- // SqlSession对象:放所有myBaits生成的DAO层接口的实现
- SqlSession sqlSession = sqlSessionFactory.openSession();
- // 获取指定的接口实现
- UserDao userDao = sqlSession.getMapper(UserDao.class);
- // 多态调用方法
- List<User> users = userDao.selUser();
- for (User user : users) {
- System.out.println(user);
- }
- // 更新类需要提交事务(sqlSession.commit();)
- // sqlSessoin是个资源,使用完毕后必须进行关闭
- sqlSession.close();
- }
接口(删除指定用户)
- // @Param:对参数取别名
- Integer deleteUser(@Param("id")Integer id);
接口对应的xml配置
- <delete id="deleteUser">
- <!-- XML配置通过#{"别名"}在SQL语句上取值 -->
- DELETE FROM user WHERE uid = #{id}
- </delete>
注册mapper的配置文件(对应Dao接口的XML配置文件)
- <configuration>
- <mappers>
- <!-- 1、资源路径(resource):/分割 -->
- <mapper resource="com/xxx/dao/UserDao.xml"/>
- <!-- 2、类路径(class):.分割 -->
- <mapper class="com.xxx.dao.UserDao"/>
- <!-- 3、扫描包:引入dao层所有XML文件 -->
- <package name="com.xxx.dao"/>
- </mappers>
- </configuration>
可以引入外部的properties文件
外部建立properties文件
- driver=com.mysql.cj.jdbc.Driver
- url=jdbc:mysql://localhost:3306/user?useUnicode=true&characterEncoding=UTF8
- username=root
- password=123456
properties:引入properties文件(mybatis-config.xml)
- <configuration>
- <!-- 默认在src下找文件 -->
- <properties resource="db.properties"></properties>
- </configuration>
通过${K}取值(mybatis-config.xml)
- <property name="driver" value="${driver}"/>
- <property name="url" value="${url}"/>
- <property name="username" value="${username}"/>
- <property name="password" value="${password}"/>
实体类取别名后,可直接使用别名(mybatis-config.xml)
- <!-- typeAlias:对类取别名、type:java类型 (全类名)alias:别名(随意取)-->
- <typeAliases>
- <typeAlias type="com.xxx.dao.modle.User" alias="user"/>
- </typeAliases>
- <!-- 扫包式:包中所有的实体类别名为驼峰式 -->
- <typeAliases>
- <package name="com.xxx.dao.modle"/>
- </typeAliases>
使用标签自定义别名(不常用)
- // 手动自定义别名
- @Alias("user")
- public class User {
- private Integer id;
- private String name;
- }
记录系统运行过程(mybatis-config.xml)
- <configuration>
- <settings>
- <setting name="logImpl" value="STDOUT_LOGGING"/>
- </settings>
- </configuration>
1、引入log4j依赖(log4j.jar)
2、在全局配置文件中开启log4j的日志
- <configuration>
- <settings>
- <setting name="logImpl" value="LOG4J"/>
- </settings>
- </configuration>
3、src中引入log4j配置文件(log4j.properties)
- ### 设置###
- log4j.rootLogger = debug,stdout,D,E
- ### 输出信息到控制台 ###
- log4j.appender.stdout = org.apache.log4j.ConsoleAppender
- log4j.appender.stdout.Target = System.out
- log4j.appender.stdout.layout = org.apache.log4j.PatternLayout
- log4j.appender.stdout.layout.ConversionPattern = [%-5p] %d{yyyy-MM-dd HH:mm:ss,SSS} method:%l%n%m%n
- ### 输出DEBUG 级别以上的日志到=D://logs/error.log ###
- log4j.appender.D = org.apache.log4j.DailyRollingFileAppender
- log4j.appender.D.File = D://logs/log.log
- log4j.appender.D.Append = true
- log4j.appender.D.Threshold = DEBUG
- log4j.appender.D.layout = org.apache.log4j.PatternLayout
- log4j.appender.D.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n
- ### 输出ERROR 级别以上的日志到=D://logs/error.log ###
- log4j.appender.E = org.apache.log4j.DailyRollingFileAppender
- log4j.appender.E.File =D://logs/error.log
- log4j.appender.E.Append = true
- log4j.appender.E.Threshold = ERROR
- log4j.appender.E.layout = org.apache.log4j.PatternLayout
- log4j.appender.E.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n
将数据库中的表中记录转为(映射)java实体类的对象
MyBatis自动将表中数据转为JAVA实体类对象
前提:(数据库)字段名与(实体类)属性名一致
方案一
SQL语句中为提取字段取别名
- public class User {
- private Integer uId;
- private String uName;
- private String uAge;
- }
- <select id="getAllStudent" resultType="student">
- <!-- 为提取字段取别名 -->
- SELECT u_id uId,u_name uName,u_age uAge FROM user;
- </select>
方案二
setting:开启驼峰命名转换
- <configuration>
- <settings>
- <!-- 例:u_id(数据库) == uId(实体类) -->
- <setting name="mapUnderscoreToCamelCase" value="true"/>
- </settings>
- </configuration>
方案三
手动映射(对应接口的xml - mapper标签下)
- <resultMap type="user" id="myuser">
- <!--id:指定主键映射规则-->
- <!--column:指定(数据库)字段列-->
- <!--property:指定(实体类)属性对象-->
- <id column="u_id" property="uId"/>
- <!--result:指定非主键映射规则-->
- <!--column:指定(数据库)字段列-->
- <!--property:指定(实体类)属性对象-->
- <result column="u_name" property="uName"/>
- </resultMap>
查询语句中通过resultMap属性引入手动映射自定义id
- <!--id属性:绑定对应接口方法名-->
- <!--resultMap:指定resultMap自定义id-->
- <select id="AllUser" resultMap="myuser">
- SELECT * FROM student;
- </select>