概述
1.什么是Mybatis?
(1)Mybatis是一个半ORM(对象关系映射)框架,它内部封装了JDBC,开发时只需要关注SQL语句本身,不需要花费精力去处理加载驱动、创建连接、创建statement等繁杂的过程。程序员直接编写原生态sql,可以严格控制sql执行性能,灵活度高。
(2)MyBatis 可以使用 XML 或注解来配置和映射原生信息,将 POJO映射成数据库中的记录,避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。
(3)通过xml 文件或注解的方式将要执行的各种 statement 配置起来,并通过java对象和 statement中sql的动态参数进行映射生成最终执行的sql语句,最后由mybatis框架执行sql并将结果映射为java对象并返回。(从执行sql到返回result的过程)。
MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生类型、接口和 Java 的 POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。
2.什么是持久层?
Dao层,Service层,Controller层…
完成持久化工作的代码块
层界限十分明显。
持久是相对于瞬时来说的, 持久层,可以理解成数据 保存在数据库或者硬盘一类可以保存很长时间的设备里面,不像放在内存中那样断电就消失了,也就是把数据存在持久化设备上 ,你想一下内存中的数据断电就没有了,硬盘的数据 是否会像内存中的数据一样断电消失么?当然不会。
3.mybatis的作用
- 帮助程序员将数据存入数据库中
- 传统的JDBC代码太复杂了。简化。框架。自动化。
- 不用Mybatis也可以。更容易上手,技术没有高低之分
4.Mybatis的缺点:
- SQL语句的编写工作量较大,尤其当字段多、关联表多时,对开发人员编写SQL语句的功底有一定要求。
- SQL语句依赖于数据库,导致数据库移植性差,不能随意更换数据库。
5.Mybatis和Hibernate区别:
(1)Mybatis和hibernate不同,它不完全是一个ORM(对象关系映射)框架,因为MyBatis需要程序员自己编写Sql语句。
(2)Mybatis直接编写原生态sql,可以严格控制sql执行性能,灵活度高,非常适合对关系数据模型要求不高的软件开发,因为这类软件需求变化频繁,一但需求变化要求迅速输出成果。但是灵活的前提是mybatis无法做到数据库无关性,如果需要实现支持多种数据库的软件,则需要自定义多套sql映射文件,工作量大。
(3)Hibernate对象/关系映射(ORM)能力强,数据库无关性好,对于关系模型要求高的软件,如果用hibernate开发可以节省很多代码,提高效率。
6.#{} ,${} 的区别:
#{} :预编译处理,相当于PreparedStatement中的占位符。
${}:字符串替换,会替换成变量的值。
#{}可以有效的解决SQL注入的问题。
=======================================================================
第一个Mybatis程序的编写:
1.搭建数据库实验环境:
CREATE DATABASE /*!32312 IF NOT EXISTS*/`mybatis` /*!40100 DEFAULT CHARACTER SET utf8 */;
USE `mybatis`;
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
`id` INT(20) NOT NULL,
`name` VARCHAR(30) DEFAULT NULL,
`pwd` VARCHAR(30) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=INNODB DEFAULT CHARSET=utf8;
INSERT INTO `user`(`id`,`name`,`pwd`) VALUES (1,'狂神','123456'),(2,'张三','abcdef'),(3,'李四','987654');
2.创建一个普通的maven项目:
pom.xml:导入maven依赖
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.kuang</groupId>
<artifactId>ssm-mybatis-study</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<!--单元测试-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
</dependency>
<!--mybatis的包-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>8.0.16</version>
</dependency>
<!--连接数据库的驱动包-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.47</version>
</dependency>
</dependencies>
<build>
<!--希望maven在导出项目的时候,能够将我们的配置及资源导出-->
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>false</filtering>
</resource>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>false</filtering>
</resource>
</resources>
</build>
</project>
3.代码的编写:
3.1 pojo 实体类的编写:
public class User {
private int id;
private String name;
private String pwd;
public User() {
}
public User(int id, String name, String pwd) {
this.id = id;
this.name = name;
this.pwd = pwd;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPwd() {
return pwd;
}
public void setPwd(String pwd) {
this.pwd = pwd;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", name='" + name + ''' +
", pwd='" + pwd + ''' +
'}';
}
}
3.2 Dao层接口 UserMapper的编写:
public interface UserMapper {
//获取所有的User
List<User> getUser();
}
3.3 Dao层userMapper.xml配置文件的编写:
在MyBatis的xml页面中:
id:就是接口中对应的方法名
resultType:Sql语句执行的返回值!
<?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">
<!--mapper中的namespace 标签:对应mapper接口的类-->
<mapper namespace="com.xbf.dao.UserMapper">
<!--select标签对应执行sql的查询语句 id对应映射接口中的方法的名字 parameterType : 参数类型! -->
<!--属性: resultType:返回结果的类型-->
<!--select标签的中间部分,写sql语句-->
<select id="selectUser" resultType="com.xbf.pojo.User">
select * from user
</select>
<!--增加用户-->
<insert id="addUser" parameterType="com.xbf.pojo.User">
insert into user (id,name,pwd) values (#{id},#{name},#{pwd})
</insert>
<!--删除user 通过id删-->
<delete id="deleteUserById">
delete from user where id=#{id}
</delete>
<!--改-->
<update id="modify" parameterType="com.xbf.pojo.User">
update user set pwd=#{pwd},name=#{name} where id=#{id}
</update>
<!--查-->
<select id="getUserById" resultType="com.xbf.pojo.User">
select * from user where id=#{id}
</select>
</mapper>
3.4在src/resources 下的database.properties的编写:
driver=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/mybatis?serverTimezone=UTC
username=root
password=1234567890
在src/resources 下的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>
<properties resource="database.properties"/>
<!--配置环境 这里可以有多套环境 default是代表默认的那一套环境-->
<environments default="development">
<!--环境的id 即环境的名字-->
<environment id="development">
<!--transactionManager 事务管理,type:JDBC-->
<transactionManager type="JDBC"></transactionManager>
<!--dataSource:数据源-->
<dataSource type="POOLED">
<!--xml中 不允许使用 ? 得用 & 替换-->
<property name="driver" value="${driver}"></property>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
</dataSource>
</environment>
</environments>
<!--关联映射文件-->
<mappers>
<mapper resource="com/jing/dao/userMapper.xml"/>
</mappers>
</configuration>
4.工具类(主要为了获取SqlSessionFactory)
//目的为了获得SqlSessionFactory
public class MybatisUtils {
private static SqlSessionFactory sqlSessionFactory;
static {
try {
//在maven中所有的资源文件都在resources下,我们一般可以直接拿到
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
} catch (IOException e) {
e.printStackTrace();
}
}
public static SqlSessionFactory getSqlSessionFactory() {
return sqlSessionFactory;
}
}
5.测试类的编写
public class UserMapperTest {
@Test
//获取user
public void testSelectUser(){
//1.拿到sqlSessionFactory对象
SqlSessionFactory sqlSessionFactory= MybatisUtils.getSqlSessionFactory();
//2.通过sqlSessionFactory对象 openSession() 创建一个sqlSession
SqlSession sqlSession = sqlSessionFactory.openSession();
//3.通过sqlSession 获得mapper对象,参数为映射文件中对应的接口类的class对象
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
//4.通过mapper对象来执行操作
List<User> users = mapper.selectUser();
//关闭资源
sqlSession.close();
//输出结果
System.out.println(users);
}
@Test
//增
public void addTest(){
User user=new User("4","张三","250");
SqlSession sqlSession = MybatisUtils.getSqlSessionFactory().openSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
mapper.addUser(user);
//提交事务
sqlSession.commit();
//关闭资源
sqlSession.close();
}
@Test
//删
public void deleteTest(){
SqlSession sqlSession = MybatisUtils.getSqlSessionFactory().openSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
mapper.deleteUserById(4);
//提交事务
sqlSession.commit();
sqlSession.close();
}
//改
@Test
public void midifyTest(){
User u=new User("2","沙雕","250");
SqlSession sqlSession = MybatisUtils.getSqlSessionFactory().openSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
mapper.modify(u);
sqlSession.commit();
sqlSession.close();
}
//查
@Test
public void selectTest(){
SqlSession sqlSession = MybatisUtils.getSqlSessionFactory().openSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
User u = mapper.getUserById(2);
System.out.println(u);
}
}
项目结构:
测试结果:
[User{id=1, name='狂神', pwd='123456'},
User{id=2, name='沙雕', pwd='250'},
User{id=3, name='李四', pwd='987654'},
User{id=4, name='张三', pwd='250'}]
5.万能map
假设,我们的实体类,或者数据库中的表,字段或者参数过多,我们应当考虑使用Map!
(1)编写接口
int addUser2(Map<String,Object> map);
(2).编写对应mapper中的SQL语句
<insert id="addUser2" parameterType="map">
insert into mybatis.user (id, pwd) values (#{userid},#{passWord});
</insert>
(3).测试
@Test
public void addUser2(){
SqlSession sqlSession = MybatisUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
Map<String, Object> map = new HashMap<String, Object>();
map.put("userid",5);
map.put("passWord","2222333");
mapper.addUser2(map);
sqlSession.close();
}
6.模糊查询
//1. Java代码执行的时候,传递通配符 % %
List<User> userList = mapper.getUserLike("%李%");
//2. 在sql拼接中使用通配符!
select * from mybatis.user where name like "%"#{value}"%"
(增删改查的注意事项:)
1.事务:
增删改需要进行事物的提交!
增删改需要进行事物的提交!!
增删改需要进行事物的提交!!!
2.参数问题:
如果是基本类型可以省略不写,而引用类型必须是: 包名+类名。
最后
以上就是微笑钢笔为你收集整理的Mybatis学习(一)使用idea和mybatis编写第一个程序的全部内容,希望文章能够帮你解决Mybatis学习(一)使用idea和mybatis编写第一个程序所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复