认识MyBatis

    xiaoxiao2022-07-03  131

    一.认识MyBatis

    MyBatis就是一个ORM框架(操作数据库)

    面试题

    MyBatis与Hibernate的区别

    MyBatis自己写SQL,性能更好控制

    MyBatis与JDBC的区别

    MyBatis只需要关注SQL,其它完成了封装

    #与$的区别

    #(接收普通参数,预编译,性能好,安全性高),$正好相反

    二.Mybatis的基本配置

    导包(核心,依赖包,数据库驱动包)有表,有domain核心配置文件 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"> <configuration> <!-- 每个环境都代表对应一个数据库连接 environments:环境(们) --> <!--引入 db.properties文件--> <properties resource="db.properties" /> <environments default="development"> <!-- 真实数据库环境【用户】 --> <environment id="development"> <transactionManager type="JDBC" /> <!--dataSource:数据源(连接池) --> <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> <mappers> <!-- 读取SQL的映射文件 --> <mapper resource="wltyx/nyybw/domain/ProductMapper.xml" /> </mappers> </configuration> 创建映射文件 XxxMapper.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"> <!-- namespace:命名空间(一个domain对应一个这个xml) --> <mapper namespace="wltyx.nyybw.domain.ProductMapper"> <!-- 如果到时候想找到这条SQL: namespace+id 等会要找到它:wltyx.nyybw.domain.ProductMapper.findOne parameterType:代表传参类型 long -> Long _long -> long resultType:返回的某一个条数的类型(必需写全限定名) --> <select id="findOne" parameterType="long" resultType="wltyx.nyybw.domain.Product" > select * from product where id = #{id} </select> </mapper> 完成功能 //SqlSessionFactoryBuilder -> SqlSessionFactory -> SqlSession @Override public Product findOne(Long id) { try { //1.读取核心配置文件 Reader reader = Resources.getResourceAsReader("mybatis-config.xml"); //2.创建一个对象:SqlSessionFactory 相当于咱们JPA:EntityManagerFactory // SqlSessionFactoryBuilder:构造者模式 SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(reader); //3.创建一个对象:SqlSession 相当于当前JPA:EntityManager SqlSession session = factory.openSession(); //4.session操作数据库(读取数据) /** * 方式中有两个值: * 第一个值(statement):找SQL的字符串 */ Product product = session.selectOne("wltyx.nyybw.domain.ProductMapper.findOne",id); return product; } catch (Exception e) { //注意,不要用IO异常(很多错看不出来) e.printStackTrace(); } return null; }

    三.MyBatisCRUD

    MyBatisUtil

    public class MyBatisUtil { private MyBatisUtil(){} private static SqlSessionFactory sessionFactory; //在静态代码块中创建SqlSessionFactory对象 static { try { sessionFactory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsReader("mybatis-config.xml")); } catch (Exception e) { e.printStackTrace(); } } //返回SqlSession对象 public static SqlSession openSession(){ return sessionFactory.openSession(); } }

    3.2 CRUD的关键代码

    session.insert("wltyx.nyybw.domain.ProductMapper.save", product); session.update("wltyx.nyybw.domain.ProductMapper.update", product); session.delete("wltyx.nyybw.domain.ProductMapper.delete",id); Product product = session.selectOne("wltyx.nyybw.domain.ProductMapper.findOne",id); List<Product> products = session.selectList("wltyx.nyybw.domain.ProductMapper.findAll"); 增删改需要提交事务

    四.注意点与细节

    4.1 添加时需要id

    useGeneratedKeys:是否要返回idkeyColumn:数据库中的主键对应的列keyProperty:domain中对应的主键属性id返回到传过来的对象中 <insert id="save" parameterType="product" useGeneratedKeys="true" keyColumn="id" keyProperty="id"> ...

    4.2 别名

    内置别名(文档中有)自定义别名 mybatis-config.xml\别名不区别大小写注意它的配置顺序(如果配置错误会有提示) <!-- 配置别名 --> <typeAliases> <!-- 配置一个别名(不区分大小写) --> <!--<typeAlias type="wltyx.nyybw.domain.Product" alias="product" />--> <package name="wltyx.nyybw.domain" /> </typeAliases>

    4.3 日志管理

    在资源根目录创建:log4j.properties

    #log4j.properties(日志文件:) # ERROR错误的日志 WARN:警告 INFO:普通信息 DEBUG:调试日志 TRACE:日志 log4j.rootLogger=ERROR, stdout #log4j.rootLogger=NONE #把左边包名改成你自己的包名 log4j.logger.wltyx.nyybw=TRACE # 日志打印到控制台中 log4j.appender.stdout=org.apache.log4j.ConsoleAppender # 日志打印的一种格式(可以灵活地指定布局模式) log4j.appender.stdout.layout=org.apache.log4j.PatternLayout # 日志打印的格式是什么样子的 %d:日期 %p:优先级 %c:类的全名 %m:输出的结果 %n:换行 log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - %m%n

    4.4 列名与属性名不一致

    添加与修改在相应位置修改名称即可查询需要创建一个resultMap使用的时候返回结果必需是resultMap <!-- 准备一个映射(ORM)配置 resultMap:结果映射 --> <resultMap id="productMapper" type="product"> <!--如果是主键不一致,使用id这个标签--> <id column="id" property="id" /> <!-- result:某一个属性的映射 column:列名(表中) property:属性名(对象中) --> <result column="dir_id" property="dirId" /> </resultMap> <!-- 查询所有数据 --> <select id="findAll" resultMap="productMapper" > select * from product </select>
    最新回复(0)