集合 批量删除mybatis_mybatis

本文详细介绍了MyBatis框架的批量删除操作,并深入讲解了mybatis.cfg.xml配置文件的使用,包括数据库连接、日志管理、环境配置、映射文件加载等内容。同时,提供了CRUD操作的示例,展示了如何使用MyBatis进行数据的增删改查。文章还对比了MyBatis与JDBC的区别,以及MyBatis的缓存机制和ORM思想。
摘要由CSDN通过智能技术生成

@author:杜勇帅

@email:http://820482874qq.com

01【熟悉】mybatis概述

1,什么是mybatis

MyBatis是支持普通SQL查询,存储过程和高级映射的优秀持久层框架。MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及结果集的检索。MyBatis使用简单的XML或注解用于配置和原始映射,将接口和Java的POJOs(Plan Old Java Objects,普通的Java对象)映射成数据库中的记录.

每个MyBatis应用程序主要都是使用SqlSessionFactory实例的,一个SqlSessionFactory实例可以通过SqlSessionFactoryBuilder获得。SqlSessionFactoryBuilder可以从一个xml配置文件或者一个预定义的配置类的实例获得。

用xml文件构建SqlSessionFactory实例是非常简单的事情。推荐在这个配置中使用类路径资源(classpath resource),但你可以使用任何Reader实例,包括用文件路径或file://开头的url创建的实例。MyBatis有一个实用类----Resources,它有很多方法,可以方便地从类路径及其它位置加载资源。

2,orm工具的基本思想

O object

r 关系

m model

无论是用过的hibernate,mybatis,你都可以法相他们有一个共同点:

1. 从配置文件(通常是XML配置文件中)得到 sessionfactory.

2. 由sessionfactory 产生 session

3. 在session 中完成对数据的增删改查和事务提交等.

4. 在用完之后关闭session 。

5. 在Java 对象和 数据库之间有做mapping 的配置文件,也通常是xml 文件。

3,mybatis和JDBC的比较

4482cde8ef39e75ea133494577d037f2.png

02【掌握】mybatis入门配置

下载

https://github.com/mybatis/mybatis-3/releases

918e8da06d2cbe337a25150d06daf5c3.png

https://github.com/mybatis/mybatis-3/tags

d6eb82c14bcf8e4bfd6e4d6b9ef863fd.png

解压及文件说明

6385320a1d49b88b98a4aa0619fda4f4.png

mybatis-xxx.jar是mybatis的核心 jar包

lib里面是辅助jar包

代理包

日志处理包

ognl包

ant包

准备数据库

0adb3d10dc2bc9401eeccc8d8bff0830.png

创建项目

e4189d88cfb955e7d3ab7eed4a755e83.png

efadf9324b9610edf50a6375009c2e38.png

导包

b6fce097913f224838c5648abd886c2d.png

创建db.properties

driverClass=com.mysql.jdbc.Driver

url=jdbc:mysql://127.0.0.1:3306/test

username=root

password=123456

创建mybatis.cfg.xml配置文件

<?xml version="1.0" encoding="UTF-8" ?>

<!DOCTYPE configuration

PUBLIC "-//http://mybatis.org//DTD Config 3.0//EN"

"http://mybatis.org/dtd/mybatis-3-config.dtd">

<!-- 配置 -->

<configuration>

<!-- 解析db.properties -->

<properties resource="db.properties"></properties>

<!-- 环境集合 default 默认使用的数据源 -->

<environments default="mybatis">

<environment id="mybatis">

<!--事务管理器 使用JDBC的事务管理 -->

<transactionManager type="JDBC" />

<!-- 数据源 type类型 -->

<dataSource type="POOLED">

<property name="driver" value="${driverClass}" />

<property name="url" value="${url}" />

<property name="username" value="${username}" />

<property name="password" value="${password}" />

</dataSource>

</environment>

</environments>

<!-- 映射集合 -->

<mappers>

<!-- 代表某一个映射文件 -->

<mapper resource="com/sxt/domain/UserMapper.xml" />

</mappers>

</configuration>

创建User

3978d78d05bc3ebb62aa03cd3d5fe053.png

创建UserMapper.xml

507875f14a049016ba6cbdd7288f1f9c.png

测试

package com.sxt.test;

import java.io.InputStream;

import java.util.List;

import org.apache.ibatis.session.SqlSession;

import org.apache.ibatis.session.SqlSessionFactory;

import org.apache.ibatis.session.SqlSessionFactoryBuilder;

public class TestMain {

public static void main(String[] args) {

SqlSessionFactoryBuilder factoryBuilder=new SqlSessionFactoryBuilder();

InputStream stream=TestMain.class.getClassLoader().getResourceAsStream("mybatis.cfg.xml");

System.out.println(stream);

//1,创建sqlSessionFactory

SqlSessionFactory sqlSessionFactory = factoryBuilder.build(stream);

//2,从sqlSessionFactory里面得到sqlSession

SqlSession session = sqlSessionFactory.openSession();

//3,使用sqlSession调用mybatis的api

List<Object> selectList = session.selectList("com.sxt.domain.UserMapper.selectAllUser");

for (Object object : selectList) {

System.out.println(object);

}

}

}

03【掌握】mybatisCRUD

配置日志管理

创建log4j.properties

# Global logging configuration

log4j.rootLogger=DEBUG, stdout

# MyBatis logging configuration...

log4j.logger.org.mybatis.example.BlogMapper=TRACE

# Console output...

log4j.appender.stdout=org.apache.log4j.ConsoleAppender

log4j.appender.stdout.layout=org.apache.log4j.PatternLayout

log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n

创建log4j.properties

419c455ca939cc57e058045baeabf55c.png

创建MyBatisUtils

/**

* 工具类

* @author LJH

*

*/

public class MyBatisUtils {

static SqlSessionFactoryBuilder factoryBuilder=new SqlSessionFactoryBuilder();

static SqlSessionFactory sqlSessionFactory=null;

static{

InputStream stream=TestMain.class.getClassLoader().getResourceAsStream("mybatis.cfg.xml");

System.out.println(stream);

//1,创建sqlSessionFactory

sqlSessionFactory = factoryBuilder.build(stream);

}

/**

* 得到sqlSession

*/

public static SqlSession getSqlSession() {

return sqlSessionFactory.openSession();

}

/**

* 关闭session

*/

public static void close(SqlSession session) {

session.close();

}

}

创建UserMapper.xml

<?xml version="1.0" encoding="UTF-8" ?>

<!DOCTYPE mapper

PUBLIC "-//http://mybatis.org//DTD Mapper 3.0//EN"

"http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="com.sxt.domain.UserMapper">

<!-- 添加 -->

<insert id="insertUser" parameterType="com.sxt.domain.User">

insert into user(name,age,email) values(#{name},#{age},#{email})

</insert>

<!-- 修改-->

<update id="updateUser" parameterType="com.sxt.domain.User">

update user set name=#{name},age=#{age},email=#{email} where id=#{id}

</update>

<!-- 删除 -->

<delete id="deleteUser" parameterType="java.lang.Integer">

delete from user where id=#{value}

</delete>

<!-- 查询一个 -->

<select id="queryUserById" resultType="com.sxt.domain.User" parameterType="java.lang.Integer">

select * from user where id=#{value}

</select>

<!-- 全查询 -->

<select id="queryAllUser" resultType="com.sxt.domain.User">

select * from user

</select>

</mapper>

测试

public class TestMain {

public static void main(String[] args) {

// addUser(new User("小明", 22, "123131231@qq.com"));

// updateUser(new User(13, "小张", 18, "88888@zlh.com"));

// deleteUser(12);

// User user = queryUserById(13);

// System.out.println(user);

List<User> list = queryAllUser();

for (User user : list) {

System.out.println(user);

}

}

/**

* 添加

*/

public static void addUser(User user) {

// 1,得到session

SqlSession sqlSession = MyBatisUtils.getSqlSession();

// 2,调用API执行添加

// sqlSession.insert("com.sxt.domain.UserMapper.insertUser");//如果数据在sql里面定死了就可以使用

sqlSession.insert("com.sxt.domain.UserMapper.insertUser", user);

// 3,提交事务

sqlSession.commit();

// 4,关闭session

sqlSession.close();

}

/**

* 修改

*/

public static void updateUser(User user) {

// 1,得到session

SqlSession sqlSession = MyBatisUtils.getSqlSession();

// 2,调用API执行添加

// sqlSession.update("com.sxt.domain.UserMapper.insertUser");//如果数据在sql里面定死了就可以使用

sqlSession.update("com.sxt.domain.UserMapper.updateUser", user);

// 3,提交事务

sqlSession.commit();

// 4,关闭session

sqlSession.close();

}

/**

* 删除

*/

public static void deleteUser(Integer id) {

// 1,得到session

SqlSession sqlSession = MyBatisUtils.getSqlSession();

// 2,调用API执行添加

// sqlSession.delete("com.sxt.domain.UserMapper.insertUser");//如果数据在sql里面定死了就可以使用

sqlSession.delete("com.sxt.domain.UserMapper.deleteUser", id);

// 3,提交事务

sqlSession.commit();

// 4,关闭session

sqlSession.close();

}

/**

* 查询一个

*/

public static User queryUserById(Integer id) {

// 1,得到session

SqlSession sqlSession = MyBatisUtils.getSqlSession();

// 2,调用API执行添加

Object one = sqlSession.selectOne("com.sxt.domain.UserMapper.queryUserById", id);

// ,关闭session

sqlSession.close();

return (User) one;

}

/**

* 全查询

*/

public static List<User> queryAllUser() {

// 1,得到session

SqlSession sqlSession = MyBatisUtils.getSqlSession();

// 2,调用API执行添加

List<User> list= sqlSession.selectList("com.sxt.domain.UserMapper.queryAllUser");

// ,关闭session

sqlSession.close();

return list;

}

}

04【掌握】mybatisCRUD使用代理模式

创建UserMapper

7768393925f8d75f3ec4e1299aa1ec5f.png

创建UserMapper.xml

<?xml version="1.0" encoding="UTF-8" ?>

<!DOCTYPE mapper

PUBLIC "-//http://mybatis.org//DTD Mapper 3.0//EN"

"http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<!-- 如果使用代理那么namespace必须UserMapper接口的完全限定名-->

<mapper namespace="com.sxt.dao.UserMapper">

<!-- 添加 -->

<insert id="insertUser" parameterType="com.sxt.domain.User">

insert into user(name,age,email) values(#{name},#{age},#{email})

</insert>

<!-- 修改-->

<update id="updateUser" parameterType="com.sxt.domain.User">

update user set name=#{name},age=#{age},email=#{email} where id=#{id}

</update>

<!-- 删除 -->

<delete id="deleteUser" parameterType="java.lang.Integer">

delete from user where id=#{value}

</delete>

<!-- 查询一个 -->

<select id="queryUserById" resultType="com.sxt.domain.User" parameterType="java.lang.Integer">

select * from user where id=#{value}

</select>

<!-- 全查询 -->

<select id="queryAllUser" resultType="com.sxt.domain.User">

select * from user

</select>

</mapper>

创建mybatis.cfg.xml

<?xml version="1.0" encoding="UTF-8" ?>

<!DOCTYPE configuration

PUBLIC "-//http://mybatis.org//DTD Config 3.0//EN"

"http://mybatis.org/dtd/mybatis-3-config.dtd">

<!-- 配置 -->

<configuration>

<!-- 解析db.properties -->

<properties resource="db.properties"></properties>

<!-- 配置日志输出形式 -->

<settings>

<setting name="logImpl" value="LOG4J"/>

</settings>

<!-- 环境集合 default 默认使用的数据源 -->

<environments default="mybatis">

<environment id="mybatis">

<!--事务管理器 使用JDBC的事务管理 -->

<transactionManager type="JDBC" />

<!-- 数据源 type类型 -->

<dataSource type="POOLED">

<property name="driver" value="${driverClass}" />

<property name="url" value="${url}" />

<property name="username" value="${username}" />

<property name="password" value="${password}" />

</dataSource>

</environment>

</environments>

<!-- 映射集合 -->

<mappers>

<!-- 代表某一个映射文件 -->

<mapper resource="com/sxt/dao/UserMapper.xml" />

</mappers>

</configuration>

测试

a35681cae4015d939f2b2439435a4ec9.png

04【掌握】核心配置文件详解

mybatis.cfg.xml

<configuration>

<!--environments 指mybatis可以配置多个环境 default指向默认的环境

每个SqlSessionFactory对应一个环境environment

-->

<environments default="development">

<environment id="development">

<!-- JDBC – 这个配置直接使用JDBC 的提交和回滚功能。它依赖于从数据源获得连接来管理

事务的生命周期。

• MANAGED – 这个配置基本上什么都不做。它从不提交或者回滚一个连接的事务。而是让

容器(例如:Spring 或者J2EE 应用服务器)来管理事务的生命周期

-->

<transactionManager type="JDBC"/>

<!--

数据源类型:

UNPOOLED – 这个类型的数据源实现只是在每次需要的时候简单地打开和关闭连接。

POOLED – 这个数据源的实现缓存了JDBC 连接对象,用于避免每次创建新的数据库连接时都初始

化和进行认证,加快程序响应。并发WEB 应用通常通过这种做法来获得快速响应。

JNDI – 这个数据源的配置是为了准备与像Spring 或应用服务器能够在外部或者内部配置数据

源的容器一起使用,然后在JNDI 上下文中引用它

-->

<dataSource type="POOLED">

<property name="driver" value="com.mysql.jdbc.Driver" />

<property name="url" value="jdbc:mysql://localhost:3306/test" />

<property name="username" value="root" />

<property name="password" value="123456" />

</dataSource>

</environment>

</environments>

<mappers>

<!-- 定义映射SQL语句文件。 -->

<mapper resource="cn/sxt/entity/UserMapper.xml"/>

</mappers>

</configuration>

别名的优化

c071120202d487d4f5284d5adb97c036.png

2ea1257d3d9edcc4ecd794f2830118b5.png

参数类型优化

雷哥真理:在mybatis的xxxxMapper.xml里面所有的parameterType都可以不写

05【掌握】XyzMapper.xml详解

DML数据操作语言

DDL 数据定义语言

DCL 数据控制语言

DQL 数据查询语言

mapper

Mapper :定义了对应的数据库操作的语句,完成对数据库的不同操作进隔离(区分)

Namespace属性=“自定义”

注意:同一个命令空间里面的子节点ID不能重复

要不然报

d9bf8056ad26494df7cd836fa69f61f9.png

select

存放查询的sql

<select id="queryAllUser" resultType="com.sxt.domain.User">

select id as uid ,name as uname,age as uage,email as uemail from user

</select>

相关属性

resultType 代表sql之后完成之对应的方法的返回值的类型

如果返回的是单个对象就直接是方法的返回值类型User

如果返回的是多个对象就是方法返回值类型的集合里面的数据类型List<User>

timeout:执行sql的超时时间

resultMap:见下面

ResultMap

当sql执行出来的子段和自定义类型里面的属性名不对应时,就要使用ResulstMap让两个不同名称的值有关系

46607ef531483a800f45ffef66728783.png

insert

parameterType 方法的参数类型 可以不写

6b3b60eda7ace783f576aa2a88140ef2.png

update

f949319b4647630adf3b4f464669e7dd.png

delete

44ee07f75e8d81f136a7c1e2b75c849d.png

占位符

# 代表使用PreparedStatement

$ 代表使用Statement

delete from user where name =?

delete from user where name ="(delete from user)"

06【掌握】模糊查询

like

对参数值进行改造

UserMapper

82a7e04b541fd90b14d546af5c01b74a.png

UserMapper.xml

34816c272be0d4a0b683c1b80fb55e7d.png

测试

1ff0a5e533ed609ffdd6565a9ba9ea76.png

使用${不推荐}

UserMapper

5936422edb20a1019ee6e461291c3fbf.png

UserMapper.xml

6bb4869ec194d7ea22d9b1e1a3875baf.png

测试

19915c1a80cfd8171d7c80aa366d9885.png

使用#{推荐}

UserMapper

be0a810ad6cd9dd8e916f461a3bd5947.png

UserMapper.xml

88355a9d6e0c02dca4b49aa27344ce5f.png

测试

5cdd00987770df8f3fa8e59e0cca5bf6.png

使用CONCAT函数【低版本的mybatis里面推荐】

UserMapper

40c07aea40ee725dc6fb9e99680459d0.png

UserMapper.xml

5c31aa192750a65e37b288d21af15d33.png

测试

0d2ff0cc6b680faf0a2043d774631d09.png

使用BIND

UserMapper

40c07aea40ee725dc6fb9e99680459d0.png

UserMapper.xml

3fc508709ad77778694b011225f3187c.png

测试

0d2ff0cc6b680faf0a2043d774631d09.png

07【掌握】分页的实现

分页语法

int currentPage=1

int pageSize=10;

mysql

select * from 表名 limit (currentPage-1)*pageSize,pageSize;

oracle --rownum

SELECT T1.* FROM

(SELECT ROWNUM AS RN,T1.* FROM

(select * from 表名 where 条件 order by 字段名 ) T1 WHERE

ROWNUM<pageSzie*currentPage ) T2

WHERE T2.RN> (currentPage-1)*pageSize

方法1

UserMapper

ef2d55ef96e7d9062760441513b36250.png

UserMapper.xml

307a4786b608e6ca13465951331492a7.png

测试

c0c3bad446a5713466498d09244e8b2a.png

方法2 RowBounds

UserMapper

d1c97e2046e6d5c94f96f4b5cf8b5ca9.png

UserMapper.xml

33299a6fc6e9c0242a932c91bcc9ed5c.png

测试

85ef999a1140cca9d244ab3314cdfecd.png

08【掌握】阿里的分页插件

下载

pageheper

http://central.maven.org/maven2/com/github/pagehelper/pagehelper/5.1.8/

jsqlparser

http://central.maven.org/maven2/com/github/jsqlparser/jsqlparser/1.3/

9945129666bb6b4f196ecb77f25d85c3.png

导入jar包

740f1eb74fc1856f25066ecf4b185a88.png

创建UserMapper

700d3d1a0baa2f6314d5e31c602b6c5d.png

创建UserMapper.xml

0da2280d2942958061c9adb4b126cfac.png

修改mybatis.cfg.xml配置插件

0bf15ebc6cb562a221f537e9059a6c09.png

测试

d5188a259db049e82df59ddc8a891f4e.png

10【掌握】SQL片段

作用:提高sql的复用度

6b007d73001b166e383bcb8ece85d2f1.png

11【掌握】动态sql

where

1913a0b740d272da65e35e5cede0fe46.png

if

32fc1954edd0a9467028e5bac0358ea9.png

choose (when, otherwise)

9eea6d48463163a1482b73365d6ce3d9.png

foreach

39a08f326b3a482001c6465f92174b2b.png

2e6866bc26010096987cac45cb5b676f.png

set

03db00c78f9a313a7c38fda804f373f6.png

trim

5eaa985e39dbe55829e45930f6e554e3.png

12【掌握】关联表的处理

join

准备工作

创建数据库

179c2ce4ddf88f960887b4bec7abdd03.png

61a3f645f7dea8551dae6f25707b3180.png

59c3635f440ccf963f4a2c326d2f723e.png

创建Emp

e9f70d9605ceb6a9b8db5888a3bfb66a.png

创建EmpMapper

7efcc3c3714a125627b9ed3cff720545.png

创建EmpMapper.xml

<?xml version="1.0" encoding="UTF-8" ?>

<!DOCTYPE mapper

PUBLIC "-//http://mybatis.org//DTD Mapper 3.0//EN"

"http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<!-- 如果使用代理那么namespace必须UserMapper接口的完全限定名 -->

<mapper namespace="com.sxt.dao.EmpMapper">

<select id="queryAllEmp" resultType="com.sxt.domain.Emp">

select * from sys_emp

</select>

</mapper>

创建Dept

598b7228f214c253fa8cb9946d8b4e1a.png

创建DeptMapper

781467360559050fa4e01dfe3c344729.png

创建DeptMapper.xml

ce08f0c79ed9322db8859c90dc8eca85.png

修改mybatis.cfg.xml

48c00f3f2596e43754cb883c1f828bd4.png

2,处理多对一的关系[查员工的同时查询部门信息]

实现方式1给Emp加属性

修改Emp

a05f48985c182f4128481a8707177606.png

修改EmpMapper.xml

a7b65200a0507b87aaebc3b1fc3ae82e.png

测试

fb87dc303dbac8f8358b0bdff6acb9f0.png

实现方式2使用ResultMap

修改Emp

fe2729bd7de7107b53315f7fe32dbbf4.png

修改EmpMapper.xml

a402f383c92da691fb6938efa32a7b9c.png

实现方式3使用ResultMap另一种办法

EmpMapper.xml

383438635d110e324608f9be1cd8f663.png

DeptMapper

6b1548d4a40a2711ebfb8cb7824efcbf.png

DeptMapper.xml

e939f3cc1f707234f0f123a929e9d1f0.png

3,处理一对多的关系[查部门同时查询员工信息]

查询方式1ReslutMap

修改Dept

0c57c6ed31225581d2373918034a4ffc.png

修改DeptMapper

be3efd915797921e7ad9866071c0b05a.png

修改DeptMapper.xml

7cc6f37ef7aeae1cb2581f95579344b0.png

测试

fc5c54fef71b97891126653bf9f63abd.png

查询方式2ReslutMap

修改DeptMapper.xml

6a55a6079295938dcad9e272bca3305c.png

修改EmpMapper.xml

81ed4480380fc20162d6a0ad21ef9c85.png

测试

5ade1dab38ff10207c939714ff1512b2.png

13【掌握】使用注解实现mybatis

实现单表的CRUD

创建User

16502828ea95dfd79701c9daa47ca186.png

创建UserMapper

public interface UserMapper {

@Insert(value="insert into user(name,age,email) values(#{name},#{age},#{email})")

public void insertUser(User user);

@Update(value="update user set name=#{name},age=#{age},email=#{email} where id=#{id}")

public void updateUser(User user);

@Delete(value="delete from user where id=#{value}")

public void deleteUser(Integer id);

@Select(value="select * from user where id=#{value}")

public User queryUserById(Integer id);

@Select("select * from user")

public List<User> queryAllUser(User user);

}

修改mybatis.cfg.xml

dea307e4ed30e843e856eba60db6fe12.png

测试

0f1cdfc4d9aba696c656f5e79c84111a.png

实现多对一

创建EmpMapper

public interface EmpMapper {

// @Select("select * from sys_emp")

// @Select(value="select * from sys_emp")

@Select(value="select * from sys_emp inner join sys_dept using(deptid)")

// @Results(value= {

// @Result(property="empid",column="empid",id=true),

// @Result(property="empname",column="empname"),

// @Result(property="sex",column="sex"),

// @Result(property="age",column="age"),

// @Result(property="hiredate",column="hiredate"),

// @Result(property="dept",javaType=Dept.class,column="deptid",one=@One(

// select="com.sxt.dao.DeptMapper.queryDeptByDeptId"

// ))

// })

@ResultMap(value="BaseResultMap2")

public List<Emp> queryAllEmp();

}

创建EmpMapper.xml

<?xml version="1.0" encoding="UTF-8" ?>

<!DOCTYPE mapper

PUBLIC "-//http://mybatis.org//DTD Mapper 3.0//EN"

"http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<!-- 如果使用代理那么namespace必须UserMapper接口的完全限定名 -->

<mapper namespace="com.sxt.dao.EmpMapper">

<resultMap type="com.sxt.domain.Emp" id="BaseResultMap">

<id property="empid" column="empid" />

<result property="empname" column="empname" />

<result property="sex" column="sex" />

<result property="age" column="age" />

<result property="hiredate" column="hiredate" />

<!-- 设置Emp类里面的dept属性的关联方式 property代表Emp里面的属性名 javaType代表Emp里面dept的类型 -->

<association property="dept" column="deptid"

javaType="com.sxt.domain.Dept"

select="com.sxt.dao.DeptMapper.queryDeptByDeptId">

</association>

</resultMap>

<resultMap type="com.sxt.domain.Emp" id="BaseResultMap2">

<id property="empid" column="empid" />

<result property="empname" column="empname" />

<result property="sex" column="sex" />

<result property="age" column="age" />

<result property="hiredate" column="hiredate" />

<!-- 设置Emp类里面的dept属性的关联方式 property代表Emp里面的属性名 javaType代表Emp里面dept的类型 -->

<association property="dept"

javaType="com.sxt.domain.Dept">

<id property="deptid" column="deptid" />

<result property="deptname" column="deptname" />

<result property="deptremark" column="deptremark" />

</association>

</resultMap>

</mapper>

创建DeptMapper

7de35b3fc9fc2fe1ca5332bc7d768961.png

创建DeptMapper.xml

<?xml version="1.0" encoding="UTF-8" ?>

<!DOCTYPE mapper

PUBLIC "-//http://mybatis.org//DTD Mapper 3.0//EN"

"http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="com.sxt.dao.DeptMapper">

<select id="queryDeptByDeptId" resultType="com.sxt.domain.Dept">

select * from sys_dept

where deptid=#{value}

</select>

</mapper>

实现一对多

修改DeptMapper

public interface DeptMapper {

public Dept queryDeptByDeptId(Integer deptid);

// @Select("select * from sys_dept")

@Select("select * from sys_dept left join sys_emp using(deptid)")

// @Results(value={

// @Result(property="deptid",column="deptid",id=true),

// @Result(property="deptname",column="deptname"),

// @Result(property="deptremark",column="deptremark"),

// @Result(property="emps",column="deptid",javaType=HashSet.class,many=@Many(

// select="com.sxt.dao.EmpMapper.queryEmpsByDeptId"))

// })

@ResultMap(value="BaseResultMap")

public List<Dept> queryAllDept();

}

修改DeptMapper.xml

<?xml version="1.0" encoding="UTF-8" ?>

<!DOCTYPE mapper

PUBLIC "-//http://mybatis.org//DTD Mapper 3.0//EN"

"http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="com.sxt.dao.DeptMapper">

<select id="queryDeptByDeptId" resultType="com.sxt.domain.Dept">

select * from sys_dept

where deptid=#{value}

</select>

<resultMap type="com.sxt.domain.Dept" id="BaseResultMap">

<id property="deptid" column="deptid" />

<result property="deptname" column="deptname" />

<result property="deptremark" column="deptremark" />

<!--

property指com.sxt.domain.Dept里面emps的属性

javaType指emps属性的类型

ofType:指emps里面存放的数据类型

-->

<collection property="emps" javaType="java.util.HashSet" ofType="com.sxt.domain.Emp">

<id property="empid" column="empid" />

<result property="empname" column="empname" />

<result property="sex" column="sex" />

<result property="age" column="age" />

<result property="hiredate" column="hiredate" />

</collection>

<!-- <collection property="emps" javaType="java.util.HashSet" ofType="com.sxt.domain.Emp"

select="com.sxt.dao.EmpMapper.queryEmpsByDeptId" column="deptid" >

</collection> -->

</resultMap>

</mapper>

修改EmpMapper.xml

<!-- 根据部门ID查询员信息 -->

<select id="queryEmpsByDeptId" resultType="com.sxt.domain.Emp">

select * from sys_emp where deptid=#{value}

</select>

14【掌握】缓存

一级缓存【默认开启】

缓存范围为sqlSession

二级缓存【要手动开启】

缓存范围为sqlSessionFactory

80d9168669fd76933c520b1b71eb3f8b.png

15【熟悉】mybatis和Hibernate的比较

hibernate的特点

映射关系 实体类和属性名和数据表的字段名去映射

hibernate不能写sql语句 纯面向对象 但要写hql语句

数据库sys_user

select * from sys_user

User ----sys_user

from User

hibernate的速度相对慢一点

hibernate crud

save(user)

mybatis的特点

映射关系 实体类和属性名和查询结果的字段名去映射

Mybatis 半自动化模式操作数据,hibenate完全面向对象操作数据

Mybatis运行的性能高于hibernate的性能

Mybatis开发速度低于hibernate的开发速度

Mybatis应用在互联网项目的开发,Hibernate用在传统的MIS系统开发

16【掌握】mybatis逆向工程

http://central.maven.org/maven2/org/mybatis/generator/mybatis-generator-core/1.3.7/

1,什么是逆向工程

MyBatis的一个主要的特点就是需要程序员自己编写sql,那么如果表太多的话,难免会很麻烦,所以mybatis官方提供了一个逆向工程,可以针对单表自动生成mybatis执行所需要的代码(包括mapper.xml、mapper.java、po..)。一般在开发中,常用的逆向工程方式是通过数据库的表生成代码。

2,使用逆向工程

使用MyBatis的逆向工程,需要导入逆向工程的jar包,我用的是mybatis-generator-core-1.3.2.jar,下面开始总结一下MyBatis逆向工程的使用步骤。

3,创建项目并导包

fc5e6802d896b46e4f793d9db998daa5.png

4,配置xml文件

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE generatorConfiguration

PUBLIC "-//http://mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"

"http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">

<generatorConfiguration>

<!-- 数据库驱动 -->

<classPathEntry location="lib/mysql-connector-java-5.1.20-bin.jar" />

<context id="testTables" targetRuntime="MyBatis3">

<commentGenerator>

<property name="suppressDate" value="true" />

<!-- 是否去除自动生成的注释 true:是 : false:否 -->

<property name="suppressAllComments" value="true" />

</commentGenerator>

<!--数据库链接URL,用户名、密码 -->

<jdbcConnection driverClass="com.mysql.jdbc.Driver"

connectionURL="jdbc:mysql://localhost/test" userId="root" password="123456">

</jdbcConnection>

<!-- 默认false,把JDBC DECIMAL 和 NUMERIC 类型解析为 Integer,为 true时把JDBC DECIMAL 和

NUMERIC 类型解析为java.math.BigDecimal 主要是针对oracle数据库-->

<javaTypeResolver>

<property name="forceBigDecimals" value="false" />

</javaTypeResolver>

<!-- 生成模型的包名和位置 -->

<javaModelGenerator targetPackage="com.sxt.domain"

targetProject="src">

<property name="enableSubPackages" value="true" />

<!-- 从数据库返回的值被清理前后的空格 -->

<property name="trimStrings" value="true" />

</javaModelGenerator>

<!-- 生成映射文件的包名和位置 -->

<sqlMapGenerator targetPackage="com.sxt.mapper"

targetProject="src">

<!-- enableSubPackages:是否让schema作为包的后缀 -->

<property name="enableSubPackages" value="true" />

</sqlMapGenerator>

<!-- 生成DAO的包名和位置 -->

<javaClientGenerator type="XMLMAPPER"

targetPackage="com.sxt.mapper" targetProject="src">

<!-- enableSubPackages:是否让schema作为包的后缀 -->

<property name="enableSubPackages" value="true" />

</javaClientGenerator>

<!-- 要生成的表 tableName是数据库中的表名或视图名 domainObjectName是实体类名 -->

<table tableName="sys_user" domainObjectName="User"

enableCountByExample="false" enableUpdateByExample="false"

enableDeleteByExample="false" enableSelectByExample="false"

selectByExampleQueryId="false">

</table>

</context>

</generatorConfiguration>

4,创建生成类

public class TestGenerator {

public static void generator() throws Exception{

List<String> warnings = new ArrayList<String>();

boolean overwrite = true;

//指定 逆向工程配置文件

File configFile = new File("xml/config4.xml");

ConfigurationParser cp = new ConfigurationParser(warnings);

Configuration config = cp.parseConfiguration(configFile);

DefaultShellCallback callback = new DefaultShellCallback(overwrite);

MyBatisGenerator myBatisGenerator = new MyBatisGenerator(config,

callback, warnings);

myBatisGenerator.generate(null);

}

public static void main(String[] args) throws Exception {

generator();

System.out.println("生成完成,请刷新项目");

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值