MySQL不同版本的注意事项1、驱动类driver-class-nameMySQL 5版本使用jdbc5驱动,驱动类使用:com.mysql.jdbc.DriverMySQL 8版本使用jdbc8驱动,驱动类使用:com.mysql.cj.jdbc.Driver2、连接地址urlMySQL 5版本的url:jdbc:mysql://localhost:3306/ssmMySQL 8版本的url:jdbc:mysql://localhost:3306/ssm?serverTimezone=UTC否则运行测试用例报告如下错误:java.sql.SQLException: The server time zone value 'Öйú±ê׼ʱ¼ä' is unrecognized orrepresents more
- CREATE DATABASE IF NOT EXISTS `ssm`;
-
- USE `ssm`;
-
- CREATE TABLE `t_user`(
- id INT PRIMARY KEY AUTO_INCREMENT,
- username VARCHAR(20),
- password VARCHAR(20),
- age INT,
- gender CHAR,
- email VARCHAR(50)
- );

- /**
- * 和数据库表 t_user 对应的实体类
- */
- public class User {
- private Integer id;
- private String username;
- private String password;
- private Integer age;
- private String gender;
- private String email;
-
- public User() {
- }
-
- public User(Integer id, String username, String password, Integer age, String gender, String email) {
- this.id = id;
- this.username = username;
- this.password = password;
- this.age = age;
- this.gender = gender;
- this.email = email;
- }
-
- public Integer getId() {
- return id;
- }
-
- public void setId(Integer id) {
- this.id = id;
- }
-
- public String getUsername() {
- return username;
- }
-
- public void setUsername(String username) {
- this.username = username;
- }
-
- public String getPassword() {
- return password;
- }
-
- public void setPassword(String password) {
- this.password = password;
- }
-
- public Integer getAge() {
- return age;
- }
-
- public void setAge(Integer age) {
- this.age = age;
- }
-
- public String getGender() {
- return gender;
- }
-
- public void setGender(String gender) {
- this.gender = gender;
- }
-
- public String getEmail() {
- return email;
- }
-
- public void setEmail(String email) {
- this.email = email;
- }
-
- @Override
- public String toString() {
- return "User{" +
- "id=" + id +
- ", username='" + username + '\'' +
- ", password='" + password + '\'' +
- ", age=" + age +
- ", gender='" + gender + '\'' +
- ", email='" + email + '\'' +
- '}';
- }
- }
MyBatis中的mapper接口相当于以前的dao。但是区别在于,mapper仅仅是接口,我们不需要提供实现类。
- package com.chenyixin.ssm.mapper;
-
- public interface UserMapper {
-
- /**
- * 添加用户信息
- * @return 返回影响数据库变化的行数
- */
- int insertUser();
- }
- <dependencies>
-
- <dependency>
- <groupId>org.mybatisgroupId>
- <artifactId>mybatisartifactId>
- <version>3.5.7version>
- dependency>
-
-
- <dependency>
- <groupId>junitgroupId>
- <artifactId>junitartifactId>
- <version>4.12version>
- <scope>testscope>
- dependency>
-
-
- <dependency>
- <groupId>mysqlgroupId>
- <artifactId>mysql-connector-javaartifactId>
- <version>8.0.27version>
- dependency>
- dependencies>
习惯上命名为mybatis-config.xml ,这个文件名仅仅只是建议,并非强制要求。将来整合 Spring 之后,这个配置文件可以省略,所以大家操作时可以直接复制、粘贴。核心配置文件主要用于配置连接数据库的环境以及MyBatis的全局配置信息核心配置文件存放的位置是src/main/ resources 目录下
- 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.cj.jdbc.Driver"/>
- <property name="url" value="jdbc:mysql://localhost:3306/ssm?
- serverTimezone=UTC"/>
- <property name="username" value="root"/>
- <property name="password" value="root"/>
- dataSource>
- environment>
- environments>
-
-
- <mappers>
- <mapper resource="mappers/UserMapper.xml"/>
- mappers>
- configuration>
相关概念:ORM(Object Relationship Mapping)对象关系映射。
- 对象:Java的实体类对象
- 关系:关系型数据库
- 映射:二者之间的对应关系
下表列举的是最简单的单表映射(一个表和一个类):
| Java概念 | 数据库概念 |
|---|---|
| 类 | 表 |
| 属性 | 字段/列 |
| 对象 | 记录/行 |
1、映射文件的命名规则:表所对应的实体类的类名+Mapper.xml例如:表t_user,映射的实体类为User,所对应的映射文件为UserMapper.xml因此 一个映射文件对应一个实体类,对应一张表的操作MyBatis映射文件用于编写SQL,访问以及操作表中的数据MyBatis映射文件存放的位置是src/main/ resources/mappers 目录下![]()
2、 MyBatis中可以面向接口操作数据,要保证两个一致:a>mapper接口的全类名和映射文件的命名空间(namespace)保持一致b>mapper接口中方法的方法名和映射文件中编写SQL的标签的id属性保持一致
- mapper
- PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
- "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
-
- <mapper namespace="com.chenyixin.ssm.mapper.UserMapper">
-
- <insert id="insertUser">
- insert into t_user values (null,'张三','123456',19,'男','123456@qq.com');
- insert>
- mapper>
- public class UserMapperTest {
-
- @Test
- public void insertUser() throws IOException {
- // 读取 MyBatis 的核心配置文件 注:Resources 在 org.apache.ibatis.io 包中
- InputStream in = Resources.getResourceAsStream("mybatis-config.xml");
-
- // 创建 SqlSessionFactoryBuilder 对象
- SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
-
- // 通过核心配置文件多对应的字节输入流创建工厂类 SqlSessionFactory ,生产 SqlSession 对象
- SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(in);
-
- // 创建 SqlSession 对象(手动操作事务),此时通过 SqlSession 对象所操作的 sql 都必须手动提交或回滚(默认回滚)
- SqlSession sqlSession1 = sqlSessionFactory.openSession();
- // 创建 SqlSession 对象(自动操作事务)
- SqlSession sqlSession2 = sqlSessionFactory.openSession(true);
-
- // 通过代理模式创建 UserMapper 接口的代理实现类对象
- UserMapper userMapper1 = sqlSession1.getMapper(UserMapper.class);
- UserMapper userMapper2 = sqlSession2.getMapper(UserMapper.class);
-
- // 调用 UserMapper 接口中的方法,就可以根据 UserMapper 的全类名匹配元素文件,
- // 通过调用的方法名匹配映射文件中是 SQL 标签,并执行标签中的 SQL 语句
- int result1 = userMapper1.insertUser();
- int result2 = userMapper2.insertUser();
- System.out.println("结果:" + result1);
- System.out.println("结果:" + result2);
- // 记得手动提交
- sqlSession1.commit();
-
- // 需要关闭sqlSession
- sqlSession1.close();
- sqlSession2.close();
- }
- }
说明:
- SqlSession:代表Java程序和数据库之间的会话。(HttpSession是Java程序和浏览器之间的会话)
- SqlSessionFactory:是“生产”SqlSession的“工厂”。
- 工厂模式:如果创建某一个对象,使用的过程基本固定,那么我们就可以把创建这个对象的相关代码封装到一个“工厂类”中,以后都使用这个工厂类来“生产”我们需要的对象。
在Mybatis工作过程中,通过打印日志的方式,将要执行的SQL语句打印出来。
-
- <dependency>
- <groupId>log4jgroupId>
- <artifactId>log4jartifactId>
- <version>1.2.17version>
- dependency>

支持 XML 和 properties 属性文件两种形式。无论使用哪种形式,文件名是固定的:
- log4j:configuration SYSTEM "log4j.dtd">
-
- <log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
-
- <appender name="STDOUT" class="org.apache.log4j.ConsoleAppender">
- <param name="Encoding" value="UTF-8" />
- <layout class="org.apache.log4j.PatternLayout">
- <param name="ConversionPattern" value="%-5p %d{MM-dd HH:mm:ss,SSS} %m (%F:%L) \n" />
- layout>
- appender>
- <logger name="java.sql">
- <level value="debug" />
- logger>
- <logger name="org.apache.ibatis">
- <level value="info" />
- logger>
- <root>
- <level value="debug" />
- <appender-ref ref="STDOUT" />
- root>
- log4j:configuration>
FATAL(致命)>ERROR(错误)>WARN(警告)>INFO(信息)>DEBUG(调试)
从左到右打印的内容越来越详细
是standard output的缩写,意思是标准输出。对于Java程序来说,打印到标准输出就是打印到控制台。

编写工具类,直接获取获取 SqlSession 对象
- public class SqlSessionUtil {
-
- public static SqlSession getSqlSession() {
- try {
- // 获取核心的配置文件
- InputStream in = Resources.getResourceAsStream("mybatis-config.xml");
- // 创建 SqlSessionFactoryBuilder 对象
- SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
-
- // 通过核心配置文件多对应的字节输入流创建工厂类 SqlSessionFactory ,生产 SqlSession 对象
- SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(in);
-
- // 创建 SqlSession 对象(自动操作事务)
- return sqlSessionFactory.openSession(true);
- } catch (Exception e) {
- throw new RuntimeException(e);
- }
-
- }
- }
- public interface UserMapper {
-
- /**
- * 添加用户信息
- * @return 返回影响数据库变化的行数
- */
- int insertUser();
-
- /**
- * 修改用户信息
- * @return 返回影响数据库变化的行数
- */
- int updateUser();
-
- /**
- * 根据 id 删除用户信息
- * @return 返回影响数据库变化的行数
- */
- int deleteUserById();
-
- /**
- * 根据 id 查询用户信息
- * @return 返回查询到的用户信息
- */
- User selectUserById();
-
- /**
- * 查询所有用户信息
- * @return 返回查询到的用户信息
- */
- List
selectAllUser(); - }
- mapper
- PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
- "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
-
- <mapper namespace="com.chenyixin.ssm.mapper.UserMapper">
-
-
- <insert id="insertUser">
- insert into t_user
- values (null, '张三', '123456', 19, '男', '123456@qq.com')
- insert>
-
- <update id="updateUser">
- update t_user
- set username = '李四',
- password = '123'
- where id = 3
- update>
-
- <delete id="deleteUserById">
- delete
- from t_user
- where id = 2;
- delete>
-
-
- <select id="selectUserById" resultType="com.chenyixin.ssm.pojo.User">
- select *
- from t_user
- where id = 3;
- select>
-
-
- <select id="selectAllUser" resultType="com.chenyixin.ssm.pojo.User">
- select *
- from t_user;
- select>
- mapper>
注意:1、查询的标签select必须设置属性resultType或resultMap,用于设置实体类和数据库表的映射关系2、resultType:自动映射,用于属性名和表中字段名一致的情况3、resultMap:自定义映射,用于一对多或多对一或字段名和属性名不一致的情况
- public class UserMapperTest2 {
- SqlSession sqlSession = SqlSessionUtil.getSqlSession();
- UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
-
- @Test
- public void insertUser() {
- userMapper.insertUser();
- }
-
- @Test
- public void updateUser() {
- userMapper.updateUser();
- }
-
- @Test
- public void deleteUserById() {
- userMapper.deleteUserById();
- }
-
- @Test
- public void selectUserById() {
- User user = userMapper.selectUserById();
- System.out.println(user);
- }
- // User{id=3, username='李四', password='123', age=19, gender='男', email='123456@qq.com'}
-
- @Test
- public void selectAllUser() {
- List
users = userMapper.selectAllUser(); - for (User user : users) {
- System.out.println(user);
- }
- //User{id=1, username='张三', password='123456', age=19, gender='男', email='123456@qq.com'}
- // User{id=3, username='李四', password='123', age=19, gender='男', email='123456@qq.com'}
- // User{id=4, username='张三', password='123456', age=19, gender='男', email='123456@qq.com'}
- }
- }