目录
1、Mybatis简介
1.1.什么是Mybatis
1.2 持久化
1.3 持久层
2、第一个Mybatis程序
2.1 搭建环境,创建数据库
2.2 创建一个模块
2.3 编写代码
2.4.遇到的问题及解决方式
1、Mybatis简介 1.1.什么是Mybatis
MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Ordinary Java Object,普通的 Java对象)映射成数据库中的记录。
1.2 持久化持久化(Persistence),即把数据(如内存中的对象)保存到可永久保存的存储设备中(如磁盘)。持久化的主要应用是将内存中的对象存储在数据库中,或者存储在磁盘文件中、XML数据文件中等等。
持久化是将程序数据在持久状态和瞬时状态间转换的机制。
JDBC就是一种持久化机制。文件IO也是一种持久化机制。
1.3 持久层其功能主要是负责数据库的访问,简单的说法就是实现对数据表的Select(查询),Insert(插入),Update(更新),Delete(删除)等 *** 作。如果要加入ORM的元素,那么就会包括对象和数据表之间的mapping,以及对象实体的持久化。
Dao层、Service层、Controller层,完成持久化工作的代码块,层界限十分明显
MVC模式:
Model层(模型层)
View层(显示层)
Controller层(控制层)
Model层分为Dao层和service层
service层:主要负责业务处理,比如取得连接,关闭数据库、事务回滚,一些复杂的逻辑业务放到service层。
dao层:负责访问数据库进行数据的 *** 作,取得结果集,之后将结果集的数据取出给service层或封装到VO类对象之后返回给service层。
Controller层:控制层,主要功能是处理用户发送的请求。
View层:显示层,主要负责实现数据
在实际开发中dao层要先定义自己的 *** 作标准接口,为了解耦合。
1.4 为什么需要MyBatis
优点:
我们可以通过XML配置或者Java注解配置的方式来配置SQL语句,参数,以及结果及类型等等,不需要频繁地修改源代码, 提高了代码的维护性和扩展性, 更重要的是我们可以完成持久层(DAO)的零实现. 所谓的零实现,就是不用写实现类代码,直接使用接口就可以 *** 作数据库.极大地提高了代码的扩展性和维护性。
灵活:Mybatis不会对应用程序或者数据库的现有设计强加任何影响,sql写在xml文件中,便于统一管理和优化,通过sql语句可以满足数据库 *** 作的所有需求。
接触sql与程序代码的耦合:提供dao层,将业务逻辑和数据库访问逻辑分离,使系统设计更清晰,更易于维护,更容易单元测试。
提供映射标签,支持对象与数据库的orm字段映射
提供xml标签,支持编写动态SQL
CREATE DATAbase `mybatis`; 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');
1.新建项目
2.创建一个普通的maven项目
3.删除src目录 (就可以把此工程当做父工程了,然后创建子工程)
4.导入maven依赖
2.2 创建一个模块mysql mysql-connector-java8.0.21 org.mybatis mybatis3.5.2 junit junit4.12
编写mybatis的核心配置文件
编写mybatis工具类
public class MybatisUtils { private static SqlSessionFactory sqlSessionFactory; static{ try { String resource = "mybatis-config.xml"; InputStream inputStream = Resources.getResourceAsStream(resource); sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); } catch (IOException e) { e.printStackTrace(); } } //可以从SqlSessionFactory中获得 SqlSession 的实例. // SqlSession 提供了在数据库执行 SQL 命令所需的所有方法。 public static SqlSession getSqlSession(){ return sqlSessionFactory.openSession(); } }2.3 编写代码
实体类
package com.kuang.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 + ''' + '}'; } }
Dao接口
public interface UserMapper { ListgetUserList(); }
接口实现类 (由原来的UserDaoImpl转变为一个Mapper配置文件)
编写测试类配置
public class UserMapperTest { @Test public void test(){ SqlSession sqlSession =MybatisUtils.getSqlSession(); UserMapper userDao =sqlSession.getMapper(UserMapper.class); List2.4.遇到的问题及解决方式userList =userDao.getUserList(); for (User user : userList) { System.out.println(user); } sqlSession.close(); } }
配置连接池时,mysql8版本应将"com.mysql.jdbc.Driver"修改为"com.mysql.cj.jdbc.Driver",未指定serverTimezoneMaven导出资源问题。(约定大于配置,在pom.xml中加入)
3.CRUD 3.1 namespacesrc/main/resources ***.xml src/main/java ***.xml true
namespace中包名要和Dao/Mapper接口的包名一致。
3.2 select选择,查询语句:
id:对应namespace中的方法名resultType:Sql语句执行的返回值!parameterType:参数类型。
1.编写接口
//根据ID查询用户 User getUserById(int id);
2.编写对应的mapper中的sql语句
3.编写测试类
@Test public void getUserById(){ SqlSession sqlSession = MybatisUtils.getSqlSession(); UserMapper mapper = sqlSession.getMapper(UserMapper.class); User user = mapper.getUserById(1); System.out.println(user); sqlSession.close(); }3.3insert
1、在UserMapper接口中添加对应的方法
//添加一个用户 int addUser(User user);
2、在UserMapper.xml中添加insert语句
insert into mybatis.user(id,name,pwd) values (#{id},#{name},#{pwd})
3、测试
@Test public void addUser(){ SqlSession sqlSession = MybatisUtils.getSqlSession(); UserMapper mapper = sqlSession.getMapper(UserMapper.class); int res = mapper.addUser(new User(5, "jojo", "123456")); //提交事务 sqlSession.commit(); sqlSession.close(); }
注意点:增、删、改 *** 作需要提交事务!
我们一般使用update标签进行更新 *** 作,它的配置和select标签差不多!
//修改一个用户 int updateUser(User user);
2、编写对应的配置文件
update mybatis.user set name = #{name},pwd=#{pwd} where id=#{id};
3、测试
@Test public void testUpdateUser() { SqlSession session = MybatisUtils.getSession(); UserMapper mapper = session.getMapper(UserMapper.class); User user = mapper.selectUserById(1); user.setPwd("asdfgh"); int i = mapper.updateUser(user); System.out.println(i); session.commit(); //提交事务,重点!不写的话不会提交到数据库 session.close(); }3.5 delete
1、同理,编写接口方法
//根据id删除用户 int deleteUser(int id);
2、编写对应的配置文件SQL
delete from user where id = #{id}
3、测试
@Test public void deleteUser(){ SqlSession sqlSession = MybatisUtils.getSqlSession(); UserMapper mapper = sqlSession.getMapper(UserMapper.class); mapper.deleteUser(4); //提交事务 sqlSession.commit(); sqlSession.close(); }
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)