用自己的话来说:框架就是一些半成品的软件,就是一组组件,供你完成你你要做的项目
技术的整合
框架一般处于低层应用平台,和高层业务逻辑之间的中间层
实现了软件中的"高内聚,低耦合"的现象,把问题分开来控制,易于控制,易于延展,易于资源的分配,mvn就是常见的分层开发的思想
开发者只需 要关注SQL语句部分,可以通过配置文件和注解的方式告诉它,采用ORM解决实体和数据之间的映射关系(也就是类中的属性名=表中的字段名)
1、数据库链接创建、释放频繁造成系统资源浪费从而影响系统性能,如果使用数据库链接池可解决此问题。
2、Sql 语句在代码中硬编码,造成代码不易维护,实际应用 sql 变化的可能较大,sql 变动需要改变 java
代码。
3、使用 preparedStatement 向占有位符号传参数存在硬编码,因为 sql 语句的 where 条件不一定,可能
多也可能少,修改 sql 还要修改代码,系统不易维护。
4、对结果集解析存在硬编码(查询列名),sql 变化导致解析代码变化,系统不易维护,如果能将数据库记
录封装成 pojo 对象解析比较方便。
官网:http://www.mybatis.org/mybatis-3/zh/getting-started.html###
如果使用 Maven 来构建项目,则需将下面的 dependency 代码置于 pom.xml 文件中:
dao层
package org.westos.dao;
import org.westos.domain.QueryVO;
import org.westos.domain.User;
import java.util.List;
public interface IUserDao {
//查询所有的用户,返回的是一个集合
List findAll();
//添加用户操作,不用返回
void insertUser(User user);
//跟新用户,不用返回啥
void updateUser(User user);
//根据id删用户,不用返回啥
void deleteUserById(Integer id);
//根据id查询单个用户,返回的是用户
User seleteUserById(Integer id);
//根据姓名进行模糊查询,查询的是一个集合
List linkSeleteByUsername(String username);
//用聚合函数进行查询所有用户的个数
int seleteUserNumber();
//在一个QueryVO中维护者User这个类
List seleteUserByVO(QueryVO vo);
}
domain
package org.westos.domain;
import java.io.Serializable;
import java.util.Date;
/**
* @Author: ShenMouMou
* @CreateTime: 2019-07-05 15:10
* @Description:西部开源教育科技有限公司
*/
/*
* //查询所有用户的方法
//ORM:对象关系映射(Object Relational Mapping,简称ORM)是通过使用描述对象和数据库之间映射的元数据,将面向对象语言程序中的对象自动持久化到关系数据库中。
//一个Java类 和 一张表之间的对应关系 类中的属性名和表中的字段名保持一致,然后你操作这个类的对象,就相当于你在操作这张表
//你现在要做的就是,把类中的属性的数据类型以及名称和表中的字段名和数据类型保持一致
* */
public class User implements Serializable {
private Integer id;
private String username;
private Date birthday;
private String sex;
private String address;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", username='" + username + '\'' +
", birthday=" + birthday +
", sex='" + sex + '\'' +
", address='" + address + '\'' +
'}';
}
}
package org.westos.domain;
import org.westos.domain.User;
/**
* @description:
* @author: @李小白
* @create: 2019-09-19 16:57
*/
public class QueryVO {
//创建一个类,类中维护这另外一个类,并且在接口中提供查询的方法
User user;
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
}
接口的映射文件
SELECT LAST_INSERT_ID();
insert into user(username, birthday, sex, address) values (#{username},#{birthday},#{sex},#{address});
update user set username=#{username},birthday=#{birthday},sex=#{sex},address=#{address} where id=#{id};
delete from user where id=#{uid};
核心映射文件
测试文件
package org.westos.dao;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.westos.domain.QueryVO;
import org.westos.domain.User;
import java.io.IOException;
import java.io.InputStream;
import java.io.Reader;
import java.util.Date;
import java.util.List;
/**
* @description:
* @author: @李小白
* @create: 2019-09-19 14:35
*/
public class MyTest {
SqlSession sqlSession;
InputStream in;
@Before
public void befor() throws IOException {
//加载核心的配置文件
in = Resources.getResourceAsStream("SqlMapConfig.xml");
//创建对象
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in);
//打开对象
sqlSession = factory.openSession();
}
@Test
public void testFindAll() {
//获取接口的代理对象的字节码文件
IUserDao userDao = sqlSession.getMapper(IUserDao.class);
//执行操作对象
List list = userDao.findAll();
for (User user : list) {
System.out.println(user);
}
}
// 添加用户,同时要加上log4j.properties
//在添加完用户之后,获取自增长的键id的值
@Test
public void testInsertUser(){
IUserDao userDao = sqlSession.getMapper(IUserDao.class);
User user = new User();
user.setUsername("李强娜");
user.setBirthday(new Date());
user.setSex("女");
user.setAddress("陕西渭南");
userDao.insertUser(user);
//数据的增删改都需进行提交一下
sqlSession.commit();
//子啊保存之后获取自增长键的值
Integer id = user.getId();
System.out.println(id);
}
//更新用户
@Test
public void testUpdateUser(){
IUserDao userDao = sqlSession.getMapper(IUserDao.class);
User user = new User();
user.setId(72);
user.setUsername("李小娜");
user.setSex("男");
user.setBirthday(new Date());
user.setAddress("美国");
userDao.updateUser(user);
//提交
sqlSession.commit();
//显示
List list = userDao.findAll();
for (User user1 : list) {
System.out.println(user1);
}
}
@Test
public void testDeltedUserById(){
IUserDao userDao = sqlSession.getMapper(IUserDao.class);
//删除用户
userDao.deleteUserById(70);
userDao.deleteUserById(69);
userDao.deleteUserById(68);
//提交用户
sqlSession.commit();
//方便显示
List list = userDao.findAll();
for (User user1 : list) {
System.out.println(user1);
}
}
//根据用户查询单个id,只要是查询的就要有返回
@Test
public void testSeleteUserById(){
IUserDao userDao = sqlSession.getMapper(IUserDao.class);
User user = userDao.seleteUserById(73);
User user2 = userDao.seleteUserById(65);
User user3 = userDao.seleteUserById(70);
System.out.println(user);
System.out.println(user2);
System.out.println(user3);
}
@Test
//根据姓名进行模糊查询
public void TestLikeUserByUsername(){
IUserDao userDao = sqlSession.getMapper(IUserDao.class);
List list = userDao.linkSeleteByUsername("%李%");
for (User user : list) {
System.out.println(user);
}
}
//用聚合函数进行查询用户的个数
@Test
public void testCountUser(){
IUserDao userDao = sqlSession.getMapper(IUserDao.class);
int i = userDao.seleteUserNumber();
System.out.println(i);
}
@Test
public void testQueryVOByUsername(){
IUserDao dao = sqlSession.getMapper(IUserDao.class);
User user = new User();
user.setUsername("%沈%");
QueryVO queryVO = new QueryVO();
//把User对象设置给VO
queryVO.setUser(user);
List list = dao.seleteUserByVO(queryVO);
for (User user1 : list) {
System.out.println(user1);
}
}
@After
public void after() throws IOException {
in.close();
sqlSession.close();
}
}