- Mybatis的增、删、改、查操作
- 学习lombok、pagehelper、logback插件的使用
第一章 Tomcat
1.1什么是Tomcat
- web项目容器
2.1目录结构
2.2启动/关闭
第二章 xml
xml
- DOM:解析小文件,按需解析
- SAX:解析大型文件,一次解析全部内容
作用:
- 存储配置信息,作为配置文件使用
第三章 Mybatis
3.1 什么是mybatis
MyBatis 是支持普通 SQL 查询,存储过程和高级映射的优秀持久层框架。MyBatis 消除了几乎所有的 JDBC 代码和参数的手工设置以及结果集的检索。MyBatis 使用简单的 XML 或注解用于配置和原始映射,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java 对象)映射成数据库中的记录。
3.2基本操作步骤
(1)在src同级目录下新建lib包,导入依赖包,并将项目包路径 添加到项目中。
- mysql连接依赖包
- mybatis依赖包
(2)在项目的src下创建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>
<!-- 配置数据库环境 default 默认使用哪一个环境(开发环境,测试黄静,生产环境) -->
<environments default="development">
<!-- 具体的环境,可以有多个 -->
<environment id="development">
<!-- 事务管理器 JDBC采用JDBC的事务管理 -->
<transactionManager type="JDBC"/>
<!--
POOLED:采用连接池技术连接数据 C3P0 DBCP Druid
采用连接池技术管理连接,目的是提高连接的效率
-->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<!-- 字符集这一块容易导致错误的发生 (&) 代替了&相当于转义字符 -->
<!-- 内容:ip地址,端口号,字符集设置;要保证三码一致,即eclipse编码 数据库编码 连接时编码三个要一一致 -->
<property name="url" value="jdbc:mysql://localhost:3306/woniumall?useUnicode=true&characterEncoding=utf8&serverTimezone=UTC"/>
<!-- 连接数据库的用户 -->
<property name="username" value="root"/>
<!-- 用户的密码 -->
<property name="password" value="tiger"/>
</dataSource>
</environment>
</environments>
<mappers>
<!-- <mappers>
加载编写SQL语句的xml文件 ,新建一个包存放,引用时要使用全类名
<mapper resource="com/woniuxy/mapper/UserMapper.xml"/>
</mappers> -->
</configuration>
运行程序,如果能得到factory对象,表明连接数据库成功
(3) 创建mapper.xml文件,用于编写SQL语句,为统一管理mapper文件,创建一个专门的mapper包
<?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">
<!-- namespace 命名空间、包名 用来区分不同的SQL语句 -->
<mapper namespace="abc">
<!-- id:SQL语句的唯一标识符,同一个命名空间中不能有名字相同的id
parameterType:参数类型,如果没有参数可以不要
resultType:将查询出来的数据自动封装成什么类型的对象,指定类型名字时必须是类型全名 包名.类名
-->
<select id="allUser" resultType="com.woniuxy.entity.User">
select * from mall_user
</select>
</mapper>
(4)创建entity类,创建一个entity包存放
public class User {
//实体类的属性名需要与数据库中的字段名一致,否则无法获得相应的字段信息(会返回null)
private int id;
private String account;
private String password;
private String email;
private String avatar; //头像
private int score;
private Date regtime;
private String status;
//自己添加上setter、getter、toString方法
}
(5) 修改主配置文件mybatis-config.xml
,并加载mapper文件,在主配置文件的<mapper></mappers>
标签中添加
<!-- 加载编写SQL语句的xml文件 自动从src下寻找文件 -->
<mapper resource="com/woniuxy/mapper/UserMapper.xml"/>
(6)修改测试类,创建SQLsession对象,用于执行SQL语句
public class Test {
public static void main(String[] args) throws Exception {
//1.加载mybatis主配置文件
//getResourceAsStream默认会到src目录下寻找文件
InputStream inputStream =
Resources.getResourceAsStream("mybatis-config.xml");
System.out.println(inputStream);
//2.创建SqlSessionFactory工厂 用于创建session
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(inputStream);
//只要能够获取到factory对象,那么就说明连接上数据库了
System.out.println(factory);
/*后添加的步骤*/
//3.创建SQLsession对象 作用类似于connection
SqlSession sqlSession = factory.openSession();
//4.调用SQL语句执行查询
List<User> users = sqlSession.selectList("abc.allUser");
System.out.println(users);
sqlSession.close();
}
}
note:mybatis只支持单参数传递
3.3 增、删、改查操作
(1)增、删、改
-
新建一个映射文件放在专门存放映射文件的包下,用于书写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="aaa"> //增、删、查、改操作的SQL语句 </mapper>
-
新建一个实体类用于存放映射信息,其中属性名需要与数据库中字段名一致,否则查询不到内容
- 在此引入
lombok
插件简化代码
@Data //1.setter、getter、toString 使用lombok时使用的注解 @NoArgsConstructor //无参构造 @AllArgsConstructor //全参构造器 @Accessors(chain=true) //开启链式表达式 可以在一个对象上连续使用get、set方法 public class Category { private int id; private String name; private String status; //分类状态 private String navable; //是否是在下拉菜单中显示 }
- 在此引入
-
在映射文件中书写具体的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="aaa"> <!-- 增删改时可以不定义返回类型,将其封装 --> <insert id="addCategory" parameterType="Category"> insert into mall_category values(default,#{name},#{status},#{navable}) </insert> <!-- 更新一条记录 --> <update id="updataNameById" parameterType="Category"> update mall_category set name=#{name} where id=#{id} </update> <!-- 删除一条记录 --> <delete id="deleteById" parameterType="Category"> delete from mall_category where id = #{id} </delete> </mapper>
-
将映射文件路径添加到mybatis主配置文件的
<mappers></mappers>
,每映射一个表就要创建一个映射的实体类,并要在主配置文件中添加该实体类的路径<mappers> <!-- 加载编写SQL语句的xml文件 --> <mapper resource="com/woniuxy/mapper/GoodsMapper.xml"/> </mappers>
-
编写测试类测试操作是否在成功
public static void main(String[] args) throws IOException { //1.加载配置文件 InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml"); //2.创建工厂 SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(inputStream); System.out.println(factory); //3.创建SQLsession 会话 SqlSession session = factory.openSession(); //insert 插入一条记录 Category category = new Category().setName("管理").setStatus("1").setNavable("n"); session.insert("aaa.addCategory",category); //update 更新一条记录 Category category2 = new Category().setId(6).setName("行政管理"); session.update("aaa.updataNameById", category2); //detele 删除一条记录 Category category3 = new Category().setId(6); session.delete("aaa.deleteById", category3); //手动提交 session.commit(); //4.关闭会话 session.close(); }
(2)查询操作
(1)无插件辅助的查询
- mapper文件中添加的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="abc">
<!-- 查询所有 -->
<select id="allGoods" resultType="Goods">
select * from mall_goods
</select>
<!-- 以id查询 -->
<!-- 如果参数只有一个并且参数的类型是8种基本数据类型、包装类、String,参数的名字可以任意取 -->
<select id="findById" parameterType="int" resultType="Goods">
select * from mall_goods where id = #{id}
</select>
<!-- 模糊查询不要在SQL语句中拼接,应该在Java代码中先拼接好再传进来 -->
<select id="findByLike" parameterType="String" resultType="Goods">
select * from mall_goods where name like #{name}
</select>
<!-- mybatis不支持多参传递,但是可以用一个对象带多个数据,如map -->
<select id="findByIdAndAuthor" parameterType="Map" resultType="Goods">
select * from mall_goods where id = #{id} and author = #{author}
</select>
<!-- 分页查询 -->
<select id="findByPage" parameterType="map" resultType="Goods">
select * from mall_goods limit #{index},#{size}
</select>
</mapper>
- 测试文件的操作
InputStream inputStream = null;
SqlSession session= null;
try {
//1.加载配置文件
inputStream = Resources.getResourceAsStream("mybatis-config.xml");
//2.创建工厂
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(inputStream);
//3.创建SQLsession 会话
session = factory.openSession();
//(1)查询所有商品
List<Goods> goods =session.selectList("abc.allGoods");
System.out.println(goods.size());
//(2)以id查询商品
List<Goods> goodsById =session.selectList("abc.findById",2);
System.out.println(goodsById.size());
//(3)模糊查询
List<Goods> goodsByLike = session.selectList("abc.findByLike","%IT%");
System.out.println(goodsByLike.size());
//(4)多条件查询 以id和作者名字作为查询条件
Map<String,Object> map = new HashMap<>();
map.put("id",2);
map.put("author","钟华");
goods= session.selectList("abc.findByIdAndAuthor",map);
System.out.println(goods);
//对象带多个数据
Goods pGoods = new Goods().setId(2).setAuthor("钟华");
goods = session.selectList("abc.findByIdAndAuthor2", pGoods);
//System.out.println(goods);
} catch (IOException e) {
e.printStackTrace();
} finally {
//4.释放资源
if(session != null) {
session.close();
}
}
(2) 有插件辅助的查询
- 使用
pagehelper
插件完成分页操作 - 使用
logback
插件打印日志结果
public static final Logger logger = LoggerFactory.getLogger(TestMybatis.class);
public static void main(String[] args) {
try {
//1.加载配置文件
InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");
//2.创建工厂
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(inputStream);
//3.创建SQLsession 会话
SqlSession session = factory.openSession();
//分页查询
Page<Goods>page = PageHelper.startPage(1,30);//参数:页码 参数2:条数
//查询数据
List<Goods> goods = session.selectList("abc.allGoods");
//分页操作
PageInfo<Goods> pageInfo = new PageInfo<>(goods);
//logger.debug(goods.size()+"");
pageInfo.getList(); //获取到查询的数据
pageInfo.getNextPage(); //获取下一页
logger.debug(pageInfo.getPages()+"");
pageInfo.getPrePage(); //获取前一页
logger.debug(pageInfo.getTotal()+"");
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}