练竹园何平安

Javaweb学习笔记(二)

Toretto·2023-08-24 02:01·20 次阅读

Javaweb学习笔记(二)

—Mybatis—

一款持久层框架,简化JDBC。

认识使用Mybatis查询mysql数据库中的表的信息

创建MyBatis工程:IDEA创建sping工程,在SQL中选择Mybatis Framwork和Mysql Driver。连接数据库,再在main软件包下新建一个类,我的类名叫User,里面编写查询的表的所有数据的变量名,例如我要查询hh数据库中的student表,内容有:

我就需要定义如下的代码:

private String name;
private Integer schoolid;
private String password;
private Integer score;
private String sex;
private Integer id;

当然还要创建getter,setter,toString和构造函数。然后在Mybatis自动创建的main下的resoures下的application.properties里编写下面的代码:

spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/hh#这里记得换自己的数据库名
spring.datasource.username=root
spring.datasource.password=1234#这里也要换

这样就不用写JDBC里面那一大堆连接代码了。然后再在main里面创建一个接口:mapper.UserMapper(会自动创建一个包名),这就相当于三层类里面的Dao类,当做一个容器代理实现类对象,里面编写:

@Mapper//运行时自动生成该接口的实现类对象(代理对象)。并且将该对象交给IOC容器管理
public interface UserMapper {
@Select("select *from student")
public List<User> list();
}

这里有个技巧可以选中mysql语句右键显示上下文再选择添加/编辑注入语言,然后选择Mysql,就可以提示编写MySQL的语法了。里面然后打开test包里自动创建的那个类,里面编写

@SpringBootTest//springboot整合单元测试的注解
class MybatisStudyApplicationTests {

    @Autowired
    private UserMapper userMapper;
    @Test
    public void testListUser() {
        List<User> userList=userMapper.list();
        userList.stream().forEach(user ->{
            System.out.println(user);
        });
    }

}

运行此类就可以看到student表的数据以集合形式展示啦~

数据库连接池

跟线程池差不多的东西,因为有很多用户访问数据库,所以就直接创建一个池来提高性能,而且还可以让长时间不访问数据库的用户的连接断开,腾出空间来。

spring默认的数据库连接池:hikari

或者切换阿里巴巴的Druid数据库连接池:先下载jar然后添加到项目中Maven Repository: com.alibaba » druid » 1.2.8 (mvnrepository.com),然后在pom.xml中添加下面的代码:

<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.2.8</version>
</dependency>

lombok工具包:不用写什么setter,getter,toString,equle,hashCode啥的,直接一个@Data注解搞定,另外无参有参分别为:@NoArgsConstructor,@AllArgsConstructor

下载jar:Maven Repository: org.projectlombok » lombok » 1.18.24 (mvnrepository.com),然后导入项目并在pom.xml输入(不用写 version,springboot 会自动管理)

<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>

—Mybatis基础操作—

使用Mybatis对数据库进行增删改操作:eg:在main下自动生成的包下创建Mapper.EmpMapper(这只是我的名字)的接口类,此接口添加@Mapper注解,创建一个方法用作于增/删/改,并且添加上注解,增删改的注解分别为@Insert,@Delect,@Update,在注解旁边的括号输入要运行的Mysql语句,建议使用预编译SQL,需要把参数的值改为#{XXX}(另一种时${xxx},这种就是直接拼接在MySQL语句上了,而非前面的#是引入参数)的样子,相当于以前写JDBC的”?”,然后再在方法里定义对应类型的参数。再在test测试类里面定义一个私有的EmpMapper引用数据类型的变量,并添加上@Autowired的注解,然后创建一个方法再调用EmpMapper里面的增删改方法:empmapper.delect(之前定义的参数)。

如果预编译里面的参数过多,比如增加,可以创建一个Emp(也是我自己取的)类用于定义里面的变量,然后再在增加方法的参数直接创建这个类的变量。注意创建的变量名要和#{XXX}里的一样。查询的话就直接搞个集合来输出吧,因为有可能有多个结果。

Emp类:

@Data
@AllArgsConstructor
@NoArgsConstructor
public class Emp {
private String name;
private Short gender;
private LocalDate enterday;
private String image;
private LocalDateTime createTime;
private LocalDateTime updateTime;
}

Mapper接口类里:

@Insert("INSERT INTO mybatis.emp(name, gender, enterday, image, create_time, update_time) " +
"VALUES (#{name},#{gender},#{enterday},#{image},#{createTime},#{updateTime})")
public void insert(Emp emp);

test类:

@Test
public void testInsert(){
Emp emp=new Emp();
emp.setName("hepingan");
emp.setGender((short) 1);
emp.setEnterday(LocalDate.of(2023,8,2));
emp.setImage("1.jpg");
emp.setUpdateTime(LocalDateTime.now());
emp.setCreateTime(LocalDateTime.now());

empmapper.insert(emp);
}

XML映射文件

XML映射文件名称要与Mapper接口名一样,并且将XML文件和Mapper接口放置在相同包下(同包同名),在resources下创建三个文件夹就行了,创建目录直接输入com/example/mapper就行了。新建的XML文件输入:(可以在mybatis中文网查看:入门_MyBatis中文网

<?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></mapper>

namespace与Mapper接口全限定名(文件路径)一致,我的是top.hepingan.mapper.EmpMapper;

例如我要执行select查询语句我就需要在<mapper>里编写:(科普下MySQL的语法:条件like concat(‘%’,’xxx’,’%’)就是指和xxx长得像的东西,比如我查询条件为’何’,那么结果就可以显出’何平安’)

<select id="list" resultMap="com.example.pojo.Emp">
select *from hh.emp where emp.work like concat('%',#{work},'%')
</select>

id与Mapper接口中的方法名一致,并保持返回类型一致,resultMap就是单条记录锁封装的类型,比如我Empmapper里面有个方法为public List<Emp> list(String work);那么resultMap就是Emp。

动态SQL

如果搜索时只输入了一个条件,但是SQL语句本身有多个查询条件,其他的查询条件就会为空,就会出错,这时就要用到if标签。

结构:<if test=”name !=null”>name like concat(‘%’,’#{name},’%’) </if>,意思就是如果name输入的参数值为空就没有标签里面的语句。

eg:用name,gender,enterday三个参数查询emp中的数据。这里的where也要用标签是为了防止三条数据都为null或第一条数据为null导致where,and多余。而where标签就可以自动除掉该隐患。

<select id="select">
select * from emp
<where>
<if test="name !=null">
name like concat('%',#{name},'%')
</if>
<if test="gender !=null">
and gender =#{gender}
</if>
<if test="begin !=null and end !=null">
and enterday between #{begin} and #{end}
</if>
</where>
order by update_time
</select>

<foreach>标签:有点像遍历,比如批量删除操作。各个参数:

collection:遍历的集合或数组
item:遍历出来的每个元素(名字随便)
separator:分隔符
open:起始符
close:结束符

posted @   何平安  阅读(20)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
浏览器标题切换end
点击右上角即可分享
微信分享提示