MyBatis入门知识
Posted wings丶xh
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MyBatis入门知识相关的知识,希望对你有一定的参考价值。
1.什么是MyBatis?
MyBatis是一个ORM的数据库持久化框架,是Java的持久层框架 ,Mybatis是一个支撑框架,它以映射sql语句orm方式来数据库持久化操作。
数据库持久化:把内存中数据保存到数据库中。
数据持久化就是将内存中的数据模型转换为存储模型。
常见的数据持久有:磁盘持久化和数据库持久化。
数据库持久化是数据持久化的其中一种,就是把内存中的数据保存到数据库中。
2.MyBatis与传统jdbc的比较
jdbc:
1.重复代码比较多;
2.封装对象比较麻烦;
3.没有性能控制,如果要提高效率,需要自己写缓存(一级缓存、二级缓存)
mybatis:
1.易于上手和掌握;
2.没有太多重复代码;
3.sql写在xml里,便于统一管理和优化;
4.解除sql与程序代码的耦合;
5.提供映射标签,支持对象与数据库的orm字段关系映射;
6.提供对象关系映射标签,支持对象关系组建维护;
7.提供xml标签,支持编写动态sql。
3.如何使用MyBatis
(1) 导入jar包;
使用任何框架都离不开jar包的引入,今天我们只是对MyBatis做基本的认识以及相关的比较简单的CRUD等测试,所以我们不需要建立Maven项目,只需要建立普通java项目,所需要的jar包如下图所示:
(2) 配置相关文件,如:MyBatis-Config.xml / jdbc.properties / UserMapper.xml
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> <!--引入jdbc.propeties文件--> <properties resource="jdbc.properties" /> <!-- 环境们 (很多环境的意思) default:默认使用哪一个环境(必需对应一个环境的id) --> <!--MyBatis自定义别名--> <typeAliases> <package name="cn.itsource.domain"/> <package name="cn.itsource.query"/> <!--<typeAlias type="cn.itsource.domain.User"/>--> </typeAliases> <environments default="development"> <!-- 一个环境 id:为这个环境取唯一一个id名称 --> <environment id="development"> <!-- 事务管理 type:JDBC(支持事务)/MANAGED(什么都不做) --> <transactionManager type="JDBC" /> <!-- 数据源, 连接池 type(POOLED):MyBatis自带的连接池 --> <dataSource type="POOLED"> <!-- 连接数据库的参数 --> <property name="driver" value="${jdbc.driverClassName}" /> <property name="url" value="${jdbc.url}" /> <property name="username" value="${jdbc.username}" /> <property name="password" value="${jdbc.password}" /> </dataSource> </environment> </environments> <!-- 这个mappers代表的是相应的ORM映射文件 --> <mappers> <mapper resource="cn/itsource/domain/UserMapper.xml" /> </mappers> </configuration>
jdbc.properties:
jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql:///mybatis
jdbc.username=root
jdbc.password=root
(3) 测试
4.MyBatis完成CRUD
新增:
1 @Override 2 public void save(User user) throws IOException { 3 //读取配置文件 4 Reader reader = Resources.getResourceAsReader("MyBatis-Config.xml"); 5 //得到SqlSessionFactory 6 SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader); 7 SqlSession sqlSession = sqlSessionFactory.openSession(); 8 //调用方法 namespace+id 9 sqlSession.insert("cn.itsource.dao.IUserDao.save", user); 10 //提交 11 sqlSession.commit(); 12 }
修改:
1 @Override 2 public void update(User user) throws IOException { 3 Reader reader = Resources.getResourceAsReader("MyBatis-Config.xml"); 4 SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader); 5 SqlSession sqlSession = sqlSessionFactory.openSession(); 6 sqlSession.update("cn.itsource.dao.IUserDao.update", user); 7 sqlSession.commit(); 8 }
删除:
1 @Override 2 public void delete(Long id) throws IOException { 3 Reader reader = Resources.getResourceAsReader("MyBatis-Config.xml"); 4 SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader); 5 SqlSession sqlSession = sqlSessionFactory.openSession(); 6 sqlSession.delete("cn.itsource.dao.IUserDao.delete", id); 7 sqlSession.commit(); 8 }
查询所有:
1 @Override 2 public List<User> findAll() throws IOException { 3 //读取配置文件 4 Reader reader = Resources.getResourceAsReader("MyBatis-Config.xml"); 5 SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader); 6 SqlSession sqlSession = sqlSessionFactory.openSession(); 7 List<User> list = sqlSession.selectList("cn.itsource.dao.IUserDao.findAll"); 8 return list; 9 }
查询单条:
1 public User findOne(Long id) throws IOException { 2 Reader reader = Resources.getResourceAsReader("MyBatis-Config.xml"); 3 SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader); 4 SqlSession sqlSession = MyBatisUtils.INSTANCE.getSqlSession(); 5 User user = sqlSession.selectOne("cn.itsource.dao.IUserDao.findOne", id); 6 return user; 7 }
以上写法重复代码比较多,其实每个Dao的方法都要获取SQLSession,并且使用完都要关闭,对象获取和关闭等操作都应该交给工具处理。因此,我们可以抽取一个工具类,在这里我使用的是枚举类:
1 package cn.itsource.utils; 2 3 import org.apache.ibatis.io.Resources; 4 import org.apache.ibatis.session.SqlSession; 5 import org.apache.ibatis.session.SqlSessionFactory; 6 import org.apache.ibatis.session.SqlSessionFactoryBuilder; 7 8 import java.io.IOException; 9 import java.io.Reader; 10 11 /** 12 * MyBatis工具类 13 */ 14 public enum MyBatisUtils { 15 16 INSTANCE; 17 18 private static SqlSessionFactory sqlSessionFactory; 19 20 static { 21 try { 22 Reader reader = Resources.getResourceAsReader("MyBatis-Config.xml"); 23 sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader); 24 } catch (IOException e) { 25 e.printStackTrace(); 26 throw new RuntimeException("读取配置文件错误:" + e.getMessage()); 27 } 28 } 29 30 public SqlSession getSqlSession() { 31 return sqlSessionFactory.openSession(); 32 } 33 34 }
将工具类抽取成功之后,我们只需要调用这个工具类就可以获取到SqlSession对象了。例如:
1 @Override 2 public void save(User user) throws IOException { 3 SqlSession sqlSession = MyBatisUtils.INSTANCE.getSqlSession(); 4 sqlSession.insert("cn.itsource.dao.IUserDao.save", user); 5 sqlSession.commit(); 6 }
5.MyBatis使用的一些细节
(1)主键
<insert id="save" parameterType="User" useGeneratedKeys="true" keyColumn="id" keyProperty="id"> insert into t_user(name) values(#{name}) </insert>
(2)日志log4j怎么使用
# 日志输出级别 输出到控制
log4j.rootLogger=ERROR, stdout
#log4j.rootLogger=NONE
log4j.logger.cn.itsource=TRACE
# 输出到控制台的配置信息
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
# 输出到控制台的 格式类
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - %m%n
(3)MyBatis中的别名
内置别名:
自定义别名:
<typeAliases> <!--
配置单独类 <typeAlias type="cn.itsource.domain.User" alias="user"></typeAlias> --> <!--配置包--> <package name="cn.itsource.domain"></package> </typeAliases>
(4)#与$的区别
① $ {id} 找的类参数类的里面 getId这个方法,如果有 就不会报错,没有就会报错
② # 占位符,$ 拼接字符串形式 -- 比较重要点
userMapper.xml update t_user set name=${name} where id=#{id} 生成语句 update t_user set name=xxx where id=?
$ 拼接字符串方式 --Statement --存在sql注入问题
\'# 占位符 -- PreparedStatement
③ 平时使用比较多还是 #{id}
④ $一般使用在orderby + limit 上面,其他情况下就是使用#
6.批量操作
1 <!--批量删除--> 2 <delete id="deleteBatch" parameterType="list"> 3 delete from t_user where id in 4 <foreach collection="list" item="id" open="(" separator="," close=")"> 5 #{id} 6 </foreach> 7 </delete> 8 <!--批量新增--> 9 <insert id="saveBatch" parameterType="list"> 10 insert into t_user(name) values 11 <foreach collection="list" item="user" separator=","> 12 (#{user.name}) 13 </foreach> 14 </insert>
7.MyBatis的动态sql
1 <!-- 批量插入: 2 parameterType:传入参数是:java.util.List的类型的; 3 对传入的list进行foreach循环:取出值填入插入的values中: 4 collection="list":这个不能修改,表示传入的一个list类似于一个key是list,得到传入的list集合 5 index="index":每一次遍历的序号 6 item="item":每次遍历的这个对象别名,可以修改 7 separator=",":每遍历一次后的分隔符 8 --> 9 <!--高级查询--> 10 <sql id="whereSql"> 11 <where> 12 <if test="name!=null"> 13 and name like #{name} 14 </if> 15 <if test="age!=null"> 16 and age=#{age} 17 </if> 18 </where> 19 </sql> 20 <select id="queryAll" parameterType="userQuery" resultType="User"> 21 select * from t_user 22 <include refid="whereSql"/> 23 </select>
以上是关于MyBatis入门知识的主要内容,如果未能解决你的问题,请参考以下文章