有勇气的牛排博客

javaWeb MyBatis(二)入门程序

有勇气的牛排 986 Java 2021-10-22 00:45:00

1 基本概念

1.1 { }和${ }

{ }表示一个占位符号,通过#{}可以实现preparedStatement向占位符中设置值,自动进行java类型和jdbc类型转换,#{}可以有效防止sql注入。 #{}可以接收简单类型值或pojo属性值。 如果parameterType传输单个简单类型值,#{}括号中可以是value或其它名称。

${ }:表示拼接sql串,通过${}可以将parameterType 传入的内容拼接在sql中且不进行jdbc类型转换, ${}可以接收简单类型值或pojo属性值,如果parameterType传输单个简单类型值,

${ }:括号中只能是value。

1.2 parameterType和resultType

parameterType:指定输入参数类型,mybatis通过ognl从输入对象中获取参数值拼接在sql中。

resultType:指定输出结果类型,mybatis将sql查询结果的一行记录数据映射为resultType指定类型的对象。

1.3 selectOne和selectList

selectOne查询一条记录,如果使用selectOne查询多条记录则抛出异常:

Expected one result (or null) to be returned by selectOne(), but found: 3 at org.apache.ibatis.session.defaults.DefaultSqlSession.selectOne(DefaultSqlSession.java:70)

selectList可以查询一条或多条记录。

2 需求

实现以下功能:

  • 根据用户id查询一个用户信息

  • 根据用户名称模糊查询用户信息列表

  • 添加用户

  • 更新用户

  • 删除用户

3 数据库

mysql> select * from user; +----+----------+------------+------+----------+ | id | username | birthday | sex | address | +----+----------+------------+------+----------+ | 1 | 王五 | NULL | 2 | NULL | | 10 | Charles | 2021-10-21 | 1 | 中国 | | 16 | 张小明 | NULL | 1 | 河南郑州 | | 22 | 陈小明 | NULL | 1 | 河南郑州 | | 24 | 张三丰 | NULL | 1 | 河南郑州 | | 25 | 陈小明 | NULL | 1 | 河南郑州 | | 26 | 王五 | NULL | NULL | NULL | +----+----------+------------+------+----------+

4 项目结构

MyBatis项目结构

5 导入架构

导入架构

maven

<dependencies> <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.8</version> </dependency> <!-- https://mvnrepository.com/artifact/org.mybatis/mybatis --> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.2.7</version> </dependency> <!-- https://mvnrepository.com/artifact/org.apache.logging.log4j/log4j-core --> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-core</artifactId> <version>2.0</version> </dependency> </dependencies>

6 新建 log4j.properties

idea:resource目录下

eclipse:新建config目录下

log4j.properties

# Global logging configuration log4j.rootLogger=DEBUG, stdout # Console output... log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.layout=org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n

mybatis默认使用log4j作为输出日志信息

5 新建SqlMapConfig.xml

idea:resource目录下

eclipse:新建config目录下

<?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> <!-- 和spring整合后 environments配置将废除--> <environments default="development"> <environment id="development"> <!-- 使用jdbc事务管理--> <transactionManager type="JDBC" /> <!-- 数据库连接池--> <dataSource type="POOLED"> <property name="driver" value="com.mysql.jdbc.Driver" /> <property name="url" value="jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf-8" /> <property name="username" value="root" /> <property name="password" value="root" /> </dataSource> </environment> </environments> <mappers> <mapper resource="sqlmap/Users.xml"/> </mappers> </configuration>

7 po类

Po类作为mybatis进行sql映射使用,po类通常与数据库表对应,UserBean.java如下:

package net920vip.bean; import java.util.Date; public class UserBean { private int id; private String username; // 用户姓名 private String sex; // 性别 private Date birthday; // 生日 private String address; // 地址 public UserBean() { } public UserBean(int id, String username, String sex, Date birthday, String address) { this.id = id; this.username = username; this.sex = sex; this.birthday = birthday; this.address = address; } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } public Date getBirthday() { return birthday; } public void setBirthday(Date birthday) { this.birthday = birthday; } public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } @Override public String toString() { return "UserBean{" + "id=" + id + ", username='" + username + '\'' + ", sex='" + sex + '\'' + ", birthday=" + birthday + ", address='" + address + '\'' + '}'; } }

8 查询

8.1 映射文件

idea:在resource目录下

eclipse:在classpath下的sqlmap目录下创建sql映射文件Users.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="test"> <!-- 根据id查询user --> <select id="findUserById" parameterType="int" resultType="net920vip.bean.UserBean"> select * from user where id = #{id} </select> <!-- 根据用户名模糊查询 --> <select id="findUserByUsername" parameterType="java.lang.String" resultType="net920vip.bean.UserBean"> select * from user where username like '%${value}%' </select> <!-- 新增用户 --> <insert id="insertUser" parameterType="net920vip.bean.UserBean"> insert into user(username,sex,birthday,address) values(#{username},#{sex},#{birthday},#{address}) </insert> <!-- 删除用户 --> <delete id="deleteUserById" parameterType="int"> delete from user where id = #{id} </delete> <!-- 修改用户 --> <update id="updateUserById" parameterType="net920vip.bean.UserBean"> update user set username=#{username}, sex=#{sex}, birthday=#{birthday}, address=#{address} where id = #{id} </update> </mapper>

namespace:命名空间,用于隔离sql语句,后面讲另一层非常重要的作用

8.2 加载映射文件

mybatis框架需要加载映射文件,将Users.xml添加在SqlMapConfig.xml,如下:(可见前面第5条)

<mappers> <mapper resource="sqlmap/Users.xml"/> </mappers>

8.3 测试

package test; import net920vip.bean.UserBean; import org.apache.ibatis.io.Resources; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; import java.io.IOException; import java.io.InputStream; import java.util.Date; import java.util.List; public class Test { public static void main(String[] args) throws IOException { // 配置文件 System.out.println("打印日志"); String resource = "SqlMapConfig.xml"; InputStream inputStream = Resources.getResourceAsStream(resource); System.out.println("打印日志 结束"); // 使用SqlSessionFactoryBuilder从xml配置文件中创建SqlSessionFactory SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); // 创建数据库会话实例sqlSession SqlSession sqlSession = sqlSessionFactory.openSession(); // 查询单个记录,根据用户id查询用户信息 UserBean user = sqlSession.selectOne("test.findUserById", 10); System.out.println(user.getUsername()); // 根据用户名模糊查询 List<UserBean> list = sqlSession.selectList("test.findUserByUsername", "张"); System.out.println(list); // 新增user // UserBean user1 = new UserBean(); // user1.setUsername("66"); //// user1.setBirthday(""); // user1.setSex("1"); // user1.setAddress("中国"); // sqlSession.insert("test.insertUser",user1); // 删除 // sqlSession.delete("test.deleteUserById",27); //// 提交事务 // sqlSession.commit(); // 修改 UserBean user2 = new UserBean(10, "Charles", "1", new Date(), "中国"); sqlSession.update("test.updateUserById",user2); // 提交事务 sqlSession.commit(); } }

留言

专栏
文章
加入群聊