目录结构
所需jar包
https://download.csdn.net/download/weixin_44201223/89160447?spm=1003.2166.3001.6637.1
1.创建数据表(book)
# 创建book表
create table book(
id int auto_increment primary key,
name varchar(255) ,
price double ,
num int
);
2.mybatis.xml配置文件
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"https://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<environments default="development">
<!-- 声明可以使用的环境(如:开发环境(development),测试环境(testing),生产环境
(production),三个环境是系统开发的三个阶段:开发->测试->上线,其中生产环境也就是通常说的真实环境) -->
<environment id="development">
<!-- 使用原生 JDBC 事务 -->
<transactionManager type="JDBC"></transactionManager>
<!-- POOLED数据源的配置, property配置JDBC四个变量-->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/数据库"/>
<property name="username" value="root"/>
<property name="password" value="密码"/>
</dataSource>
</environment>
</environments>
<!-- MyBatis查找映射文件 -->
<mappers>
<mapper resource="dao/mapper/BookMapper.xml">
</mapper>
</mappers>
</configuration>
3.JDBCUtil封装
public class JDBCUtil {
public static SqlSession getSqlSession() throws Exception{
//1.通过Resources查找全局mybatis配置文件
InputStream inputStream = Resources.getResourceAsStream("mybatis.xml");
//2.使用SqlSessionFactoryBuilder的使用工厂设计模式
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream );
//3.生成SqlSession
SqlSession sqlSession= sqlSessionFactory.openSession();
//4.返回SqlSession
return sqlSession;
}
public static void close(SqlSession session){
//资源关闭
session.close();
}
}
4.实体类(BookModel)
private int id;
private String name;//书的名称
private double price;//书的价格
private int num;//书的数量
public BookModel() {
}
public BookModel(String name, double price, int num) {
this.name = name;
this.price = price;
this.num = num;
}
public BookModel(int id, String name, double price, int num) {
this.id = id;
this.name = name;
this.price = price;
this.num = num;
}
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 double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
public int getNum() {
return num;
}
public void setNum(int num) {
this.num = num;
}
@Override
public String toString() {
return "BookModel{" +
"id=" + id +
", name='" + name + '\'' +
", price=" + price +
", num=" + num +
'}';
}
5.dao层接口
//增删改默认返回类型为int,不需要设置
/**
* 添加图书
* @param bookModel:添加类型
* @return 1表示成功,0表示失败
*/
int insertBook(BookModel bookModel);
/**
* 修改图书
* @param bookModel:修改对象,以id为条件
* @return 1表示成功,0表示失败
*/
int updateBook(BookModel bookModel);
/**
* 根据id删除数据
* @param id:删除数据的id
* @return 1表示成功,0表示失败
*/
int delectBook(int id);
/**
* 查看所有信息
* @return :添加到集合中返回
*/
List<BookModel> findAll();
/**
* 查询指定数据
* @param map:根据书的名称,书的价格
* @return
*/
BookModel findBook(Map<String,Object> map);
/**
* 分页查询:返回当前页的数据
* @param map 传入参数为查询第几页,一页显示条数)
* @return
*/
List<BookModel> getBookListByPagePraram(Map<String,Integer> map);
6.dao层映射文件
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="dao.BookDao">
<!-- id:指定dao方法名
parameterType:传参类型
resultType:返回值类型
-->
<!-- 添加 -->
<insert id="insertBook" parameterType="model.BookModel">
insert into book(name, price, num) values(#{name},#{price},#{num})
</insert>
<!-- 修改 -->
<update id="updateBook" parameterType="model.BookModel">
update book set name = #{name} where id = #{id}
</update>
<!-- 删除(根据id) -->
<delete id="delectBook" parameterType="int">
delete from book where id = #{id}
</delete>
<!-- 查询所有 -->
<select id="findAll" resultType="model.BookModel">
select * from book
</select>
<!-- 查询(根据书的名称和书的价格 -->
<select id="findBook" parameterType="map" resultType="model.BookModel">
select * from book where name = #{name} and price = #{price}
</select>
<!-- 分页查询 -->
<select id="getBookListByPagePraram" parameterType="map" resultType="model.BookModel">
select * from book limit 2,2
</select>
</mapper>
7.测试类
public class BookAppMain {
public static void main(String[] args) throws Exception{
//insertBook();
//updateBook();
//delectBook(3);
//findBookAll();
//findBook();
//getBookListByPagePraram(2,2);
}
//添加
public static void insertBook() throws Exception{
//获取SqlSession对象
SqlSession sqlSession = JDBCUtil.getSqlSession();
//初始化BookModel
BookModel bookModel = new BookModel("斗破苍穹", 211, 1);
//指定dao方法,传入BookModel实例,返回1/0
int row = sqlSession.insert("dao.BookDao.insertBook",bookModel);
//把最终的sql真正执行,必须添加,添加后才能在数据库中显示成功操作的数据
sqlSession.commit();
//释放资源
JDBCUtil.close(sqlSession);
}
//修改
public static void updateBook() throws Exception{
//获取SqlSession对象
SqlSession sqlSession = JDBCUtil.getSqlSession();
//初始化BookModel
BookModel bookModel = new BookModel();
bookModel.setId(3);
bookModel.setName("一人之下");
//未设置参数,保留原来数据
sqlSession.update("dao.BookDao.updateBook",bookModel);
//提交到数据库
sqlSession.commit();
//释放资源
JDBCUtil.close(sqlSession);
}
//删除
public static void delectBook(int id) throws Exception{
//获取SqlSession对象
SqlSession sqlSession = JDBCUtil.getSqlSession();
//根据id删除
sqlSession.delete("dao.BookDao.delectBook",id);
//提交到数据库
sqlSession.commit();
//释放资源
JDBCUtil.close(sqlSession);
}
//查看所有
public static void findBookAll() throws Exception{
//获取SqlSession对象
SqlSession sqlSession = JDBCUtil.getSqlSession();
//查询到所有BookModel实例,映射到集合中
//.selectList()返回值则为一个集合列表
//.selectOne()返回值一个 Object 对象,返量一条数据或是一个变量值如 int...
//.selectMap()查询结果中通过某列的值取到这行数据,通过 Map<key,resultType 控制>
List<BookModel> list = sqlSession.selectList("dao.BookDao.findAll");
//遍历集合
for (BookModel book : list){
System.out.println(book);
}
//查询操作可以不执行commit()方法
//sqlSession.commit();
//释放资源
JDBCUtil.close(sqlSession);
}
//根据名称和价格查看
public static void findBook() throws Exception{
//获取SqlSession对象
SqlSession sqlSession = JDBCUtil.getSqlSession();
//设置需要查询对象
Map<String,Object> map = new HashMap<>();
map.put("name", "斗罗大陆1");
map.put("price", 58.0);
//根据name,price查询
BookModel bookModel = sqlSession.selectOne("dao.BookDao.findBook",map);
//查询操作可以不执行commit()方法
//sqlSession.commit();
System.out.println(bookModel);
//释放资源
JDBCUtil.close(sqlSession);
}
//分页查询
public static void getBookListByPagePraram(Integer pageName,Integer pageSize) throws Exception{
SqlSession sqlSession = JDBCUtil.getSqlSession();
Map<String, Integer> map = new HashMap<>();
Integer pageStart = (pageName - 1);
map.put("pageStart",pageStart);
map.put("pageSize",pageSize);
List<BookModel> list = sqlSession.selectList("dao.BookDao.getBookListByPagePraram", map);
for (BookModel bookModel : list ){
System.out.println("第" + pageName + "页:" + bookModel);
}
}
}
typeAliases 别名
自定义某个类别名
类型别名是为 Java 类型命名一个短的名字。它只和 XML 配置有关, 只用来减少类完全限定名的多余部分。在mybatis.xml设置typeAliases,注意放置位置顺序
<typeAliases>
<typeAlias type="类的路径" alias="别名"/>
</typeAliases>
设置别名测试
mybatis.xml添加typeAliases
把model.BookModel路径起别名为Book
<typeAliases>
<typeAlias type="model.BookModel" alias="Book"/>
</typeAliases>
在BookMapper.xml中使用别名
<!-- <select id="findAll" resultType="model.BookModel">-->
<select id="findAll" resultType="Book">
select * from book;
</select>
包下所有类命名为别名
给某个包下所有类起别名,别名为类名,不区分大小写, mybatis.xml 中配置
<!-- 加入包下的类名作为传递的别名 -->
<typeAliases>
<package name="包的路径"/>
</typeAliases>
XXMapper.xml 中通过类名引用对应的 resultType=“User” 或是 resultType=“user”,不用在写包的路径
接口绑定
让创建好的对应接口与 mapper.xml 对应(对应是指:BookDao与BookrMapper.xml一一对应),由 mybatis 生成接口的实现类,通过调用接口对象获取到 Bookmapper.xml 中编写的 sql 方法。
框架的spring与mybatis结合正是使用此方式
//修改上面添加方法,使用接口绑定方式
public static void insertBook2() throws Exception{
SqlSession sqlSession = JDBCUtil.getSqlSession();
BookModel bookModel = new BookModel("大头儿子小头爸爸", 211, 1);
//int row = sqlSession.insert("dao.BookDao.insertBook",bookModel);
//接口绑定,绑定上路径地址,文件地址更改时,自动变更
BookDao mapper = sqlSession.getMapper(BookDao.class);
//相当于调用接口实现类方法一样,直接调用方法,添加参数
int row = mapper.insertBook(bookModel);
//把最终的sql真正执行,必须添加,添加后才能在数据库中显示成功操作的数据
sqlSession.commit();
System.out.println(row > 0 ? "添加成功" : "添加失败");
JDBCUtil.close(sqlSession);
}