Mybatis初步实现增删改查

1.单张表的增删改查

首先介绍idea中的一个功能,叫做单元测试

我们使用@Test来作为一个类中的一个方法的上标志,需要引入import org.junit.Test;

此时,这个方法就可以单独执行,我们就不需要每次都在main方法进行方法定义来测试方法中的代码,直接就可运行方法中的代码,还可进行debug运行。

1.查

(1)单个参数直接传递即可

注:只有基本类型可以直接传入,引用类型必须要使用下面两种方式(八个基本类型对应的引用类型因为可以自动转型,所以也可以单个参数直接传递)。

(2)多个参数进行查询时我们需要改变Dao中的抽象方法中的参数形式,例如:

Admin findAdmin(@Param("account") String account,@Param("password") String password);

此时mappers中的映射文件中的sql中就不需要写parameterType这一属性

(3)当我们有更多参数需要传入时,可以将数据封装进对象中,将对象作为参数传入,sql语句中使用参数对象中的哪个值,就从这个对象中取即可,不用对这个对象中所有属性都赋值,用什么赋什么即可。

此时的映射文件中对应sql 中parameterType=这个对象的类型。

2.增

注:当我们使用的sql语句对数据库中数据进行了改动时,我们就需要在sqlsession调用的最后,即

sqlSession.close之前,进行sqlsession.commit() ,即提交数据库事务,告诉数据库所有的逻辑执行完了,你可以将所有的sql执行 。查询操作不改变数据,所以不需要 这个操作。

当我们进行增加操作时,一般都是将对象当做参数传入,这个对象其中的属性值我们要提前设置好,但此时的这个对象并没有主键id,因为它在数据库是自增的,要想让其id号映射进刚才传入的对象也很简单,我们不需要再进行一个查询操作,只需要在刚才的<update>标签中加入三个属性即可,如下所示:

通过设置以后,这个对象中的id号就会映射进来。

3.删

删除操作使用<delete>标签,我们一般通过id号进行删除,其余与别的操作基本类似,例如:

4.改

改操作使用<update>标签,我们一般使用对象作为参数传入,要记住对要改的属性以及条件属性赋值,其余基本一致,例如:

 

注:在mappers sql映射文件中,resultType是返回值的类型定义,我们自定义的类的全类名已经定义了别名,那么java API中常见的类的全类名其实也已经在Mybatis jar包中进行了别名的定义,我们直接使用即可

2.#{}和${}的区别

#{} 占位符,是经过预编译的,编译好 SQL 语句再取值,#方式能够防止 sql 注入

#{}:select * from t_user where uid=#{uid}

${} 拼接符,会传入参数字符串,取值以后再去编译 SQL 语句,$方式无法防止 Sql

注入 ${}

${}:select * from t_user where uid= '1'

注意:MyBatis 排序时使用 order by 动态参数时需要注意,用$而不是#

总之可以理解为两个都能拿到值,但是#{}拿到的值会相当于经过预编译,带来一个‘ ’,而${}就相当于将拿来的值直接传入,适合在order by 的场景使用。

3.数据库与java的对象映射

sql语句的查询结果是一条记录,可以实现将数据记录的数据自动封装到对象中去,这个过程也称为数据库与java的对象映射。

在这个过程中,数据库的sql语言其实并未改变,Mybatis框架主要进行的作用就是将sql语句查询出来的数据封装在对应的对象中,就不用想我们以前那样很麻烦的进行封装,使用Mybatis框架进行更加方便的封装。

能够进行自动封装的三种情况

1、表中的列名与java中类的属性完全一致

2、可以出现不一致,但是数据库中属性要是经典数据命名即admin_phone,

此时java的属性为adminPhone驼峰,两个相互对应即可。

需要在全局配置文件中<settings>目录下进行一个配置:

3、当数据库中列名和java中属性名不一致时,我们可以在sql语句中给查询出的数据设置别名,让其与java中属性名一致。

4、当数据库中列名和java中属性名不一致时,也可单独进行处理(多表关联时经常使用,单张表几乎用不到,我们先以单表举例);

我们自定义resultMap,其中column指的是数据库中的列名,property指的是java中的属性名,实际意义可以理解为将从数据库中查出的列名为gender的数据映射到java中为xb的属性中;

<resultMap id="adminMap" type="admin">

<result column="gender" property="xb"></result>

</resultMap>

     select * from admin where id=#{id} 

最终使用resultMap即可解决。

4.多表关联的查询:

首先,我们还是需要知道的是,Mybatis框架对jdbc进行了轻量级封装,它可以实现java与数据库的映射,在我们的sql语句只涉及单张表时,如上面所示解决。而当我们使用到多张表时,这里的映射就不像单张表那么简单。

这里以学生表和年级表为例,学生表中的列应该有年级id来存储学生的年级,这里对应的java中的学生类中的属性也应该要存储年级,在这里为了防止冗余,学生类的属性中用来存放年级信息的就是年级类,不应该放年级名,这样会导致数据冗余。

在这里我们要重点使用学习的是<resultMap>标签,这个标签主要的作用就是将数据库的各个列名与java中属性名相互对应,这样在进行映射时就可直接进行映射。

下面是举例:通过id查询学生表的信息,并且将查询信息封装在student对象中

 

如上图所示,<resultMap>中的id指的是它的名字,下面的sql可以通过名字来调用这个<resultMap>,

在其下使用这三种标签:

(1)<id>标签指的是主属性,即映射主键

(2)<result >标签映射普通的属性

(3)<association>标签映射关联属性,即一个类,property指的是java中这个类的引用,javaType指的是这个类,在这个标签下我们使用<result>设置我们对应的映射。

上面的SQL语句我们使用了<sql>标签进行封装,在底下通过id号并使用<include>进行调用。

在这里我们会发现一个问题,那个关联的属性需要我们自定义也就罢了,其他普通属性凭什么还要再次定义啊,在这里,如果我们不想对普通属性再次定义映射,那我们就需要对全局配置文件中<settings>进行设置,如下:

<setting name="autoMappingBehavior" value="FULL"/>

设置是否自动映射,指的是多表关联时,除了特殊属性(指属性类,用到association标签)外的其他普通属性,进行自动映射。 使用时需要注意,它会将你为查询的特殊属性(属性是类)中的其余属性进行自动映射,但往往不是我们想要的,所以我们注释掉

FULL:一直开启自动映射

NONE:不自动映射

PARIAL(默认):单张表自动映射,有嵌套关联关闭自动映射

总结:完成以上配置后,创建test进行student的id查询,我们即可完成一个简单的多表关联查询。

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MyBatis 是一个开源的持久化框架,可以帮助我们简化数据库操作的编写。下面是一个使用 MyBatis 实现增删改查系统的示例: 1. 配置 MyBatis 首先需要在项目中引入 MyBatis 的依赖,然后在项目中配置 MyBatis 的配置文件,例如: ``` <?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> <environments default="development"> <environment id="development"> <transactionManager type="JDBC"/> <dataSource type="POOLED"> <property name="driver" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/mybatis"/> <property name="username" value="root"/> <property name="password" value="123456"/> </dataSource> </environment> </environments> <mappers> <mapper resource="com/example/mapper/UserMapper.xml"/> </mappers> </configuration> ``` 其中,配置文件中需要配置数据库的连接信息和映射文件的位置。 2. 创建数据表 在数据库中创建一个用户表,例如: ``` CREATE TABLE `user` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(20) DEFAULT NULL, `age` int(11) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; ``` 3. 创建实体类 创建一个 User 实体类,例如: ``` public class User { private Integer id; private String name; private Integer age; // getter and setter } ``` 4. 创建映射文件 在项目中创建一个 UserMapper.xml 映射文件,例如: ``` <?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="com.example.mapper.UserMapper"> <!-- 查询全部用户 --> <select id="findAll" resultType="User"> SELECT * FROM user </select> <!-- 根据 id 查询用户 --> <select id="findById" parameterType="int" resultType="User"> SELECT * FROM user WHERE id = #{id} </select> <!-- 新增用户 --> <insert id="insert" parameterType="User"> INSERT INTO user (name, age) VALUES (#{name}, #{age}) </insert> <!-- 修改用户 --> <update id="update" parameterType="User"> UPDATE user SET name = #{name}, age = #{age} WHERE id = #{id} </update> <!-- 删除用户 --> <delete id="delete" parameterType="int"> DELETE FROM user WHERE id = #{id} </delete> </mapper> ``` 其中,映射文件中定义了对应的 SQL 语句和参数类型。 5. 创建 DAO 层 创建一个 UserDAO 接口和实现类,例如: ``` public interface UserDAO { List<User> findAll(); User findById(Integer id); void insert(User user); void update(User user); void delete(Integer id); } public class UserDAOImpl implements UserDAO { private SqlSessionFactory sessionFactory; public UserDAOImpl(SqlSessionFactory sessionFactory) { this.sessionFactory = sessionFactory; } public List<User> findAll() { try (SqlSession session = sessionFactory.openSession()) { UserMapper mapper = session.getMapper(UserMapper.class); return mapper.findAll(); } } public User findById(Integer id) { try (SqlSession session = sessionFactory.openSession()) { UserMapper mapper = session.getMapper(UserMapper.class); return mapper.findById(id); } } public void insert(User user) { try (SqlSession session = sessionFactory.openSession()) { UserMapper mapper = session.getMapper(UserMapper.class); mapper.insert(user); session.commit(); } } public void update(User user) { try (SqlSession session = sessionFactory.openSession()) { UserMapper mapper = session.getMapper(UserMapper.class); mapper.update(user); session.commit(); } } public void delete(Integer id) { try (SqlSession session = sessionFactory.openSession()) { UserMapper mapper = session.getMapper(UserMapper.class); mapper.delete(id); session.commit(); } } } ``` 其中,UserDAO 接口中定义了增删改查的方法,UserDAOImpl 实现了 UserDAO 接口,并且调用了对应的映射文件中的 SQL 语句。 6. 使用 DAO 层 在项目中使用 UserDAO 接口和实现类来进行数据库的操作,例如: ``` SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream("mybatis-config.xml")); UserDAO userDAO = new UserDAOImpl(sessionFactory); // 查询全部用户 List<User> userList = userDAO.findAll(); // 根据 id 查询用户 User user = userDAO.findById(1); // 新增用户 User newUser = new User(); newUser.setName("Tom"); newUser.setAge(20); userDAO.insert(newUser); // 修改用户 user.setName("Jerry"); user.setAge(30); userDAO.update(user); // 删除用户 userDAO.delete(1); ``` 这样就可以使用 MyBatis 框架来实现增删改查系统了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值