MyBatis基础

mybatis
1.传统的jdbc
加载驱动
获取链接connection
获取预处理对象statement
设置sql (采用占位符,防止sql注入)
给占位符设置值
执行获取结果集
对结果集进行封装
释放资源

问题:

  1. 频繁的创建链接、释放资源 造成了系统资源的浪费。 --> 数据库连接池
  2. sql语句在java代码中,造成后期维护不易。
  3. 占位符设置值 存在硬编码。where语句里条件不固定,造成维护不易

SELECT * FROM user WHERE 1=1 AND id =’’ AND name LIKE ’%x%’ AND age =11
If(id != null){
Sql += “ and id=’’ ”
}
If(name != null){
Sql += “ and name like ‘’ ”
}
4. 对结果集的解析封装 存在硬编码
不用框架的话,我们完全可以自己实现这种封装。反射思想。(数据表的元信息)
表User —>name
实体类:User.java name setName getName ||
name(规则:列名首字母大写Name,再加上set或get前缀“setName”。通过反射获取实体类中的setName()方法)
name 列值:张三
获取表中name的值:操作User实体类,getName方法,通过表的元信息的映射获取user的name的值。
(实体类和Map是可以相互转化的,非常简单方便。)
List --> List |${u.name} ${u[name]}
异形表的封装:1、VO层:视图的类(多张表的集合)。业务层和视图层传输数据的层。
2、Map(列作为key)。多张表封装到一个map中。
持久化层、Dao层和业务层之后的交互–>实体类
2.ORM简介
Object Relational Mapping: 对象关系映射。
简单的理解为:ORM是通过 使用描述对象和数据库之间的映射关系的 元数据,将程序中的 对象自动的持久化到关系型数据库中。
hibernate、mybatis
3.mybatis架构
mybatis是一个ORM框架,是一个基于Java的持久层框架。持久层:基于Dao层封装的框架。
mybatis会对jdbc的操作过程进行封装,使得开发者只需要关注SQL本身,而无需去花费精力去处理 注册驱动、获取链接、设置参数、结果集解析、 释放资源等工作,可以简化jdbc开发成本。60%左右
(DBUtils工具类看作一个ORM实现(需要用户实体类的属性和表的列一一对应。Select表名))

4.mybatis环境搭建
1.新建java项目,项目名:mybatis01,导入jar包 mybatis-3.2.7.jar junit
2.配置log4j.properties 打印日志

Global logging configuration

log4j.rootLogger=DEBUG, stdout

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
3.配置mybatis全局配置文件(mybatis.xml)

<?xml version="1.0" encoding="UTF-8"?> 4、测试mybatis连接 测试代码:

public class MybatisConnectionTest {

public static void main(String[] args) throws IOException {
	//1.加载mybatis运行环境,io流的方式去读取配置文件
	InputStream resourceAsStream = Resources.getResourceAsStream("mybatis.xml");// 项目的(编译之后的)根路径
	//2.获取工厂类,作用:完成数据库操作会话。长连接
	SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
	//3.操作数据库
	SqlSession session = sqlSessionFactory.openSession();
	System.out.println(session);// 相当于connection
	//4.释放数据库
	session.close();
}

}

5.入门案例
0、在数据库中创建测试表user。
CREATE TABLE user (
id int(11) NOT NULL AUTO_INCREMENT,
username varchar(32) NOT NULL COMMENT ‘用户名称’,
birthday date DEFAULT NULL COMMENT ‘生日’,
sex char(1) DEFAULT NULL COMMENT ‘性别’,
address varchar(256) DEFAULT NULL COMMENT ‘地址’,
PRIMARY KEY (id)
) ENGINE=InnoDB AUTO_INCREMENT=18 DEFAULT CHARSET=utf8;
INSERT INTO user(username,birthday,sex,address) VALUES (‘jack1’, ‘2019-03-20’, ‘男’, ‘上海’);
INSERT INTO user(username,birthday,sex,address) VALUES (‘jack2’, ‘2019-03-20’, ‘男’, ‘上海’);
INSERT INTO user(username,birthday,sex,address) VALUES (‘jack3’, ‘2019-03-20’, ‘男’, ‘上海’);
1、 pojo对象 User.java
public class User {

private int id;

private String username;

private Date birthday;

private String sex;

private String address;
.......
  1. 映射文件UserMapper.xml<?xml version="1.0" encoding="UTF-8"?>
  1. 配置映射mybatis.xml文件
<!-- 加载映射文件 -->
<mappers>
	<mapper resource="UserMapper.xml"/>
</mappers>

3、简单测试

4、单元测试
定义单例工厂类:

单元测试UserMTest.java:

6.会话工厂与会话
SqlSessionFactory: 会话工厂。通过全局配置文件创建的,由SqlSessionFactoryBuild对象创建。
作用:创建会话。
特点:会话工厂一旦创建,就会在应用程序的执行期间一直存在。我们就不需要重复的来创建这个 会话工厂了。所以我们应该 把它的实现方式设计为 单例模式的。

SqlSession: 会话。 作用:操作数据库。
特点:线程不安全的。应该把会话声明为局部的。

7.全局配置文件的其他配置
起别名mybatis.xml配置文件中:

<typeAliases>
	<!-- type: 指的是要被定义别名的类 的全限定名 
		alias: 自定义的别名-->
	<!-- <typeAlias type="com.cbb.pojo.User" alias="user"/> -->
	
	<!-- 批量起别名  name:包。
		会扫描配置的包下的所有的类然后 批量的起别名。  别名为 类名(首字母大写或者小写都可以)-->
	<package name="com.cbb.pojo"/>
</typeAliases>

使用,可把resultType="com.cbb.pojo.User"替换为resultType=“user”:

select * from user where id = #{id}

-----》

select * from user where id = #{id}

通常使用,直接使用类名作为别名。
作业
我爱登录的t_user表 新增、修改、删除、 查询(根据名字模糊查询、查询出生日在2010年~2019年中间的用户,并且2010和2019是通过占位符设置)

8.传统的dao开发方法
新建项目,项目名:mybatis02
dao接口 daoImpl实现 映射文件
优化数据库配置mybatis.xml








jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://127.0.0.1:3306/mybatis?characterEncoding=utf-8
jdbc.username=root
jdbc.password=root

9.动态代理实现方式
新建项目,项目名:mybatis03
Mapper 接口开发方法只需要程序员编写 Mapper 接口(相当于 Dao 接口),
由Mybatis 框架根据接口定义创建接口的动态代理对象,代理对象的方法体同上边 Dao 接口实现类方法。

规范要求: 1.mapper.xml映射文件 和 mapper接口的名字 必须一致。 2.mapper.xml映射文件的 namespace 与 接口 的类全路径相同 3.mapper.xml映射文件的 statement的id 与 接口的方法名相同 4.mapper.xml映射文件 的参数类型parameterType 与 接口方法的 参数类型相同 5.mapper.xml映射文件 的输出结果类型 与 接口方法的 返回类型相同

9.1 parameterType(输入类型)
• java简单类型 int、String #{占位符的方式,任意字符}
• pojo自定义对象 #{pojo的属性名}
• hashmap类型 #{map的key}

select * from user where sex = #{sex} and address like concat ("%",# {address},"%") • 多参数的情况 /*public List selectByParams(@Param("sex")String sex, @Param("address")String address);*/ public List selectByParams(String sex, String address); select * from user where sex = #{0} and address like concat ("%",#{1},"%") 9.2 resultType(输出类型) java简单类型的 :比如String pojo自定义对象:比如com.cbb.pojo.User 或别名User hashmap类型: 比如: resultType="map" 9.3 resultMap(输出类型) resultType:在指定pojo对象接收 映射的结果集时, 需要要将 pojo对象的属性名 和 数据库表的字段名要一致。 如果有不一致的,则查询的该字段为null。 解决此问题: 方案一:给sql查询的字段 as 别名, 别名和pojo对象的属性名一致 SELECT carId carId, name carName , userId userId from car 方案二:使用resultMap类型。 select * from car 如果使用resultMap 来处理这种简单的 名字不一致的问题的时候,可以在 resultMap里 只去配置这个 名字不一致的字段 (或者),名字一致的可以省略掉。

9.4 复杂映射问题
resultMap: 除了能够解决上述的 名字不一致的问题外,还可以解决映射复杂的pojo 问题,比如一对多的关系。













参考:(扩展知识,不做掌握)

9.5 动态sql
通过mybatis提供的各种标签方法实现动态拼接sql。

select * from user and sex = #{sex} and address like concat ("%",#{address},"%") 修改集合的写法: update user username = #{username} , sex = #{sex} , address= #{address} , where id = #{id} 批量删除写法: delete from user where id in #{id}

9.6 示例
0、mybatis环境搭建,参考4。
省略。
1、数据表关系,增加car表。
CREATE TABLE car (
carId int(11) NOT NULL AUTO_INCREMENT,
name varchar(255) DEFAULT NULL,
userId varchar(255) DEFAULT NULL,
PRIMARY KEY (carId)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;

2、增加car表对应的实体类Car。
public class Car {

private int carId;

private String carName;//汽车的名字,属性名 与表字段名不一致

private int userId;
.....

拷贝User类
3、创建dao接口
dao接口:CarMapper.java UserMapper.java

CarMapper.java

4、在com.cbb.mapper包下,创建映射文件
CarMapper.xml
UserMapper.xml
CarMapper.xml
resultMap对应的VO类:UserVo.java
public class UserVo extends User{

private List<Car> cars;//一对多  一个人可能会有 多个汽车

public List<Car> getCars() {
	return cars;
}

public void setCars(List<Car> cars) {
	this.cars = cars;
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值