#创建数据表
CREATE TABLE `book_info` (
`book_id` int(11) NOT NULL AUTO_INCREMENT,
`book_name` varchar(20) NOT NULL,
`book_author` varchar(20) NOT NULL,
`book_price` int(11) NOT NULL,
`book_pub` varchar(20) NOT NULL,
PRIMARY KEY (`book_id`)
) ENGINE=InnoDB AUTO_INCREMENT=1017 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
#插入数据
INSERT INTO `book_info` VALUES ('1001', '西游记', '吴承恩', '35', '清华大学出版社');
INSERT INTO `book_info` VALUES ('1002', '骆驼祥子', '老舍', '23', '新华出版社');
INSERT INTO `book_info` VALUES ('1003', '哈利比特', 'J.K.罗琳', '41', '人民出版社');
INSERT INTO `book_info` VALUES ('1004', '安徒生童话', '安徒生', '28', '人民文学出版社');
INSERT INTO `book_info` VALUES ('1005', '青铜葵花', '曹文轩', '32', '清华大学出版社');
INSERT INTO `book_info` VALUES ('1007', '红楼梦', '曹雪芹', '45', '人民教育出版社');
INSERT INTO `book_info` VALUES ('1008', '平凡的世界', '路遥', '56', '人民美术出版社');
INSERT INTO `book_info` VALUES ('1009', '1', '1', '1', '1');
INSERT INTO `book_info` VALUES ('1011', '哈哈', '哈', '48', '哈哈出版社');
INSERT INTO `book_info` VALUES ('1012', 'aaa', 'a', '18', 'aaa出版社');
INSERT INTO `book_info` VALUES ('1014', '0', '0', '188', '0');
INSERT INTO `book_info` VALUES ('1015', 'ccc', 'cc', '666', 'cc出版社');
2.3 配置mybatis的配置文件
mybatis会读取改文件的内容 完成连接数据库功能。
XML 配置文件中包含了对 MyBatis 系统的核心设置,包括获取数据库连接实例的数据源 以及决定事务作用域和控制方式的事务管理器。
2.4创建对应的实体类
package com.cys.entity;
/**
* @program: maven-mybatis01
* @description:
* @author: 曹乙山
* @create: 2021-11-30 14:59
**/
public class Book {
private int book_id;
private String book_name;
private String book_author;
private int book_price;
private String book_pub;
public Book() {
}
public Book(int book_id, String book_name, String book_author, int book_price, String book_pub) {
this.book_id = book_id;
this.book_name = book_name;
this.book_author = book_author;
this.book_price = book_price;
this.book_pub = book_pub;
}
public int getBook_id() {
return book_id;
}
public void setBook_id(int book_id) {
this.book_id = book_id;
}
public String getBook_name() {
return book_name;
}
public void setBook_name(String book_name) {
this.book_name = book_name;
}
public String getBook_author() {
return book_author;
}
public void setBook_author(String book_author) {
this.book_author = book_author;
}
public int getBook_price() {
return book_price;
}
public void setBook_price(int book_price) {
this.book_price = book_price;
}
public String getBook_pub() {
return book_pub;
}
public void setBook_pub(String book_pub) {
this.book_pub = book_pub;
}
@Override
public String toString() {
return "Book{" +
"book_id=" + book_id +
", book_name='" + book_name + '\'' +
", book_author='" + book_author + '\'' +
", book_price=" + book_price +
", book_pub='" + book_pub + '\'' +
'}';
}
}
2.5创建操作表的sql映射文件 BookMapper.xml
insert into book_info values(null,#{book_name},#{book_author},#{book_price},#{book_pub})
delete from book_info where book_id=#{book_id}
update book_info set book_name=#{book_name},book_author=#{book_author},book_price=#{book_price},book_pub=#{book_pub} where book_id=#{book_id}
2.6 在配置文件里注册映射文件(写在最下方)
2.7 创建测试类测试对应sql语句
2.7.1 引入测试类依赖
junitjunit4.13test
2.7.2 在测试类中测试已映射的sql语句
@Test
public void test01() throws IOException {
/*
SqlSessionFactoryBuilder:这个类可以被实例化、使用和丢弃,一旦创建了 SqlSessionFactory,就不再需要它了。
SqlSessionFactory:SqlSessionFactory 一旦被创建就应该在应用的运行期间一直存在,没有任何理由丢弃它或重新创建另一个实例。
SqlSession:每个线程都应该有它自己的 SqlSession 实例。
SqlSession 提供了在数据库执行 SQL 命令所需的所有方法。
可以通过 SqlSession 实例来直接执行已映射的 SQL 语句。
因此前三行代码目的便是创建出来Sqlsession,以便于执行已映射的SQL语句
*/
Reader reader = Resources.getResourceAsReader("Mybatis.xml");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
SqlSession session = sqlSessionFactory.openSession();
/*
selectOne(s,o) s: 映射文件的namespace.方法标签的id o:实参
*/
Book book = session.selectOne("Mapper.BookMapper.SelectOne",1001);
System.out.println(book);
}
@Test
public void test03() throws IOException {
Reader reader = Resources.getResourceAsReader("Mybatis.xml");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
SqlSession session = sqlSessionFactory.openSession();
Book book = new Book(0,"ccc","cc",18,"cc出版社");
int row = session.insert("Mapper.BookMapper.AddBook",book);
System.out.println("影响行数:"+row);
session.commit();
/*
session.commit(): 提交事务 查询是从数据库中查出数据,因此可以不提交事务,但增、删、改操作会对数据库造成改动,因此需要手动提交数据。
若在SqlSession session = sqlSessionFactory.openSession(true); 里面加了true则可以完成自动提交事务,不需要手动提交。
*/
}
执行结果:
至此,MyBatis初级使用结束,下面是实际开发中如何使用MyBatis。
3.使用Dao层开发
3.1 为什么使用Dao层开发
在上面的映射文件中的 namespace 与sql语句的 id 都是随便写,然后在测试的时候使用namespace+id的方式定位到具体sql语句,并结合固定的方法:selectOne()、selectList()等等,由于我们习惯于自己命名自己的sql方法名,因此在实际开发中 我们会引入Dao层来增强代码的可读性使逻辑更加清晰。
package com.aaa.qy145.ten.cys.dao;
import com.aaa.qy145.ten.cys.entity.Book;
import java.util.List;
/**
* @program: maven-mybatis08
* @description:
* @author: 曹乙山
* @create: 2021-12-02 08:36
**/
public interface BookDao {
int addBook(Book book);
int deleteBook(int id);
int updateBook(Book book);
List selectAll(Book book);
}
3.3对应的 sql映射文件
insert into book_info values (null,#{book_name},#{book_author},#{book_price},#{book_pub})
update book_info set book_name=#{book_name},book_author=#{book_author},book_price=#{book_price},book_price=#{book_pub}
delete from book_info where book_id=#{book_id}
3.4在mybatis.xml中注册sql映射文件
3.5在测试类中测试
@Test
public void test01(){
Reader reader = null;
try {
reader = Resources.getResourceAsReader("mybatis.xml");
} catch (IOException e) {
e.printStackTrace();
}
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
SqlSession session = sqlSessionFactory.openSession();
Book book = new Book(0,"人间失格","太宰治",15,"xx出版社");
/*
session.getMapper(Dao接口名.class) 可以返回一个Dao接口的实体类
通过 实体类.方法名(参数) 即可调用自己命名的方法
*/
BookDao bookDao = session.getMapper(BookDao.class);
int row = bookDao.addBook(book);
System.out.println("影响行数:"+row);
session.commit();
}
在使用Eclipse进行开发的时候,出现了如下的问题:
Description Resource Path Location TypeThe project was not built due to "A resource exists with a different case: '/SeenTaoImp_zhV2/bin/seentao'.&
var grid = $('#datagrid');
var options = grid.datagrid('getPager').data("pagination").options;
var curr = options.pageNumber;
var total = options.total;
var max =