mybatis mysql crud_MyBatis-简单CRUD

1. 概述

MyBatis是一个ORM的数据库持久化框架

MyBatis与JDBC与JPA之间的区别:

jdbc:是最原生操作数据库的方式,更接近底层,所以执行效率高,但是需要手写SQL,会出现很多重复性代码,开发效率低!

jpa:是对jdbc的封装,直接调用api就能完成对应的CRUD,所以它的开发效率很高,但是,SQL语句是自动生成,性能不好控制,它的执行效率很低!

MyBatis:开发效率比jdbc高,执行效率比jpa高,把SQL语句从java代码中抽取出来,方便维护。并且修改SQL时不用修改java代码,不用手动设置参数和对结果集的处理,使操作数据库变得更加简单!

2. 使用

①:导包

②:创建jdbc.properties

username=root

password=112334

driver=com.mysql.jdbc.Driver

url=jdbc:mysql:///mybatis

③:创建全局的配置文件Mybatis-config.xml

/p>

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

④:创建domain和dao

⑤:创建实体映射文件,局部配置文件名称为接口名.xml,主要用来写SQL

一个简单的查询SQL:

/p>

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

SELECT * FROM product

mapper:根。

namespace:命令空间 (用来确定唯一) ,写接口的全限定名!

select : 表示这是一个查询的功能。

id:用来确定这条sql语句的唯一。

具体执行的sql语句通过namespace +.+ id。

parameterType : 传入的参数类型,请参见文档。

resultType : 返回的结果类型,全限定类名。

⑥:在==全局配置文件==中引入映射的配置文件

⑦:测试

@Override

public List selectAll() throws Exception {

//1.把配置文件转换为io流

InputStream stream = Resources.getResourceAsStream("mybatis-config.xml");

//2.获取SqlSessionFactory对象

SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(stream);

//3.获取sqlSession对象

SqlSession sqlSession = sqlSessionFactory.openSession();

//4.查询(匿名空间加id)

String statement = "com.hanfengyi._01hello.dao.IProductDao.queryAll";

List products = sqlSession.selectList(statement);

return products;

}

3. MyBatis三大核心对象

SqlSessionFactoryBuilder:主要用来创建SqlSessionFactory

SqlSessionFactory:是一个重量级对象,内部存储了xml的配置文件信息,二级缓存,连接池对象,在当前应用系统中应该只有一个SqlSessionFactory对象。所以不能轻易销毁,应该随着toncat的启动而创建,随着tomcat的关闭而销毁。

SqlSession:一个轻量级对象,内部 存储连接对象,一级缓存,应该使一个线程来获取一个SqlSession,存在于一次请求与响应,他是线程不安全的。

4. 抽取工具类

public class MybatisHelper {

private static SqlSessionFactory sqlSessionFactory =null;

static {

try {

InputStream stream = Resources.getResourceAsStream("mybatis-config.xml");

sqlSessionFactory = new SqlSessionFactoryBuilder().build(stream);

} catch (IOException e) {

System.out.println("加载配置文件失败");

}

}

public static SqlSession getSession(){

return sqlSessionFactory.openSession();

}

}

5. 添加的操作

INSERT INTO product (productName, dir_id, salePrice, supplier, brand, cutoff, costPrice)

VALUES (#{productName},#{dir_id},#{salePrice},#{supplier},#{brand},#{cutoff},#{costPrice})

{}表示一个占位符,MyBatis 会将 SQL 中的 #{}替换成“?” 如果传入的是对象,#{}中的值应该是对象的bean属性,且必须与数据库的字段名一 一对应!

在执行添加的操作时,应该返回主键,useGeneratedKeys是否返回主键,keyColumn="id"把数据库id对应的值返回,keyProperty="id"对应的实体类属性名id

@Override

public void insertOne(Product product) {

SqlSession session =null;

try {

session = MybatisHelper.getSession();

String statement = "com.hanfengyi._01hello.dao.IProductDao.insert";

session.insert(statement,product);

} catch (Exception e) {

if(session!=null)

session.rollback();

e.printStackTrace();

}finally {

if(session!=null)

session.close();

}

}

mybatis默认开启了事务,如果执行增删改,必须提交事务

6. MySQL存储引擎

MYISAM:不支持事务,也不支持事务回滚,性能高,安全性低。

INNODB:支持事务,支持事务回滚,性能低,安全性高。

7. log4j日志

创建log4j的配置文件,log4j.properties,名字必须一致,因为底层调用!

###全局 配置根

##log4j常见的日志等级: trace

log4j.rootLogger = ERROR,console

##输出局部的日志信息 打印的日志等级要大于或者等于trace等级

log4j.logger.com.hanfengyi=trace

##打印的日志规则 日志信息打印在控制台里面

log4j.appender.console = org.apache.log4j.ConsoleAppender

log4j.appender.console.Target = System.out

##你打印的日志是有一定格式的

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

##讲解详细布局规则

log4j.appender.console.layout.ConversionPattern=%d %p [%c] - %m%n

8. 很重要的细节

8.1:使用别名

resultType:返回的类型,需要写全限定名,很麻烦,创建一个别名来替代他!

在==全局配置文件==Mybatis-config.xml中配置

这样映射文件中就可以这样写:

SELECT * FROM product WHERE id = #{id}

8.2:自定义映射规则

经常会发生当数据库中的列名与domain中的属性名不一致,此时就需要自定义映射规则!

resultMap:表示结果映射。id表示唯一命名,type表示需要返回的结果类型。

标签仅用于当数据库表中的主键名与domain中的主键不一致的情况下。

针对其他属性

引用自定义的映射规则 resultType要改为resultMap

SELECT * FROM product

8.3:映射器

使用mybatis的映射器,namespace必须是接口名。且接口中的方法必须与id值一致,这样在调用一个方法时,它会自动根据接口名.方法名去找到合适的SQL语句。

/p>

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

INSERT INTO t_employee (name,age,sex) VALUES (#{name},#{age},#{sex})

@Test

public void test(){

SqlSession session =null;

try {

session = MybatisHelper.getSession();

Employee employee = new Employee();

employee.setName("cxk");

employee.setSex(true);

employee.setAge(12);

//使用映射器--获取映射器

EmployeeMapper mapper = session.getMapper(EmployeeMapper.class);

mapper.save(employee);

//提交事务

session.commit();

} catch (Exception e) {

e.printStackTrace();

//发生异常,回滚事务

if(session!=null)

session.rollback();

}finally {

if(session!=null)

session.close();

}

}

8.4:抽取SQL

对重复的SQL语句进行抽取,再使用标签引用

name,age,sex

AND name LIKE CONCAT("%",#{name},"%")

AND SEX = #{sex}

AND age>=#{minAge}

#{name},#{age},#{sex}

如果使用模糊查询,对%的拼接方式有两种,一种是"%"#{name}"%"一种是:CONCAT("%",#{name},"%"),推荐使用第二种方式,更加标准!

在mybatis中 小于,推荐使用第二种!

简化后的代码:

INSERT INTO t_employee ( ) VALUES ()

8.5: 批量添加和删除

DELETE FROM t_employee WHERE id in

#{e}

DELETE FROM t_employee WHERE id in

#{e.id}

INSERT INTO t_employee () VALUES

(#{e.name},#{e.age},#{e.sex})

INSERT INTO t_employee () VALUES

(#{e.name},#{e.age},#{e.sex})

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值