继续学习java后端开发,了解了spring的开发框架后,就需要学习java另外一个重量型的数据库框架。
mybatis-logo

一、添加依赖

<dependency>
<groupId>commons-dbcp</groupId>
<artifactId>commons-dbcp</artifactId>
<version>1.4</version>
</dependency>

<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.15</version>
</dependency>

<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${spring.version}</version>
</dependency>

<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.2.2</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.2.8</version>
</dependency>

二、创建对象

UserTo.java

public class UserTo {
private String name;
private int age;
private boolean sex;
....
}

三、创建对象控制接口

注意:mybatis要求必须是interface才能映射
编写增删改查等等操作的调用方法
接口不用自己实现,编译的时候mybatis会自动帮你实现,到时候使用的时候,可以使用@Autowired来自动加载

public interface UserMapper {

UserTo getUser(@Param("name") String name);

void insertUser(@Param("name") String name, @Param("age") int age, @Param("sex") boolean sex);

void update(@Param("name") String name, @Param("age") int age, @Param("sex") boolean sex, @Param("whereName") String whereName);

void delete(@Param("name") String whereName);
}

关于@Param
@Param("name") 表示,myBatis的xml或注解可以使用的参数
如:
xml中的
xml中的
注解中的
注解中的

四、编写xml或注解来描述对应方法sql

resources下创建一个名叫sqlmaps的文件夹(名字随意),用来专门存放mybatis的映射
UserToMap.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.lao.dao.UserMapper">


<!--用来描述如何从数据库结果集中来加载对象。-->
<resultMap id="userTo" type="com.lao.dao.UserTo">
<!--column: 表中的字段名。 property:column对应UserTo的属性字段名称-->
<id column="USER_NAME" property="name"/>
<id column="AGE" property="age"/>
<id column="SEX" property="sex"/>
</resultMap>

<!--
id: com.lao.dao.UserMapper类中对应的方法
resultType:如果是简单的对象,并且对象中的所有字段名称和表的列名一致,则可以直接使用该对象,如:com.lao.dao.UserTo
resultMap: 复杂的关联对象可以使用resultMap来映射,或者表中列的字段和对象的属性不同名(或者可以使用sql 中的as)
否则需要使用resultMap映射,使用的是上面创建的resultMap的东西
-->
<select id="getUser" resultMap="userTo">
SELECT * FROM USER_TO WHERE USER_NAME = #{name}
</select>

<insert id="insertUser">
INSERT INTO USER_TO(USER_NAME, age, sex) VALUES (#{name}, #{age}, #{sex})
</insert>

<update id="update">
UPDATE USER_TO SET USER_NAME=#{name}, age=#{age}, sex=#{sex} WHERE USER_NAME=#{whereName}
</update>

</mapper>

五、配置mybatis

resources下创建一个名为spring-datasourcespring的配置文件(名字随意)
spring-datasource.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd">

<!--配置数据库连接参数-->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="${test.driver}" />
<property name="url" value="${test.url}" />
<property name="username" value="${test.username}" />
<property name="password" value="${test.password}" />
<property name="initialSize" value="${test.initConnections}" />
<property name="maxActive" value="${test.poolSize}" />
<property name="maxIdle" value="${test.maxIdle}" />
<property name="minIdle" value="${test.minIdle}" />
</bean>

<!--配置事务管理-->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
<tx:annotation-driven transaction-manager="transactionManager" />

<!--配置MyBatis的SqlSessionFactory -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<!--配置连接参数-->
<property name="dataSource" ref="dataSource" />
<!--自动扫描mybatis的mapping.xml文件-->
<property name="mapperLocations" value="classpath:sqlmaps/**.xml"/>
</bean>

<!-- DAO接口和对象所在包名,Spring会自动查找其下的类 -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.lao.dao" />
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
</bean>

</beans>

然后在web.xml添加这个配置

目录结构:

六、使用

一切就绪后,就可以在controller中使用了
DbTestController.java

@Controller
@RequestMapping("/test")
public class DbTestController {

/**
* 使用@Autowired注解,自动加载UserMapper的实现类
*/
@Autowired
private UserMapper userMapper;

@RequestMapping("/get")
public ModelAndView getUser(){
UserTo u = userMapper.getUser("lao"); //直接调用接口的方法就可以了
System.out.println(u.getName());
return new ModelAndView("modules/test/user.jsp", "user", u);
}

@RequestMapping("/insert")
public ModelAndView insert(){
userMapper.insertUser("dcn", 30, false);
return new ModelAndView("modules/test/user.jsp", "user", "success");
}

@RequestMapping("/update")
public ModelAndView update() {
userMapper.update("laoass", 100, false, "lao");
return new ModelAndView("modules/test/user.jsp", "user", "update success");
}

@RequestMapping("/delete")
public ModelAndView delete() {
userMapper.delete("laossss");
return new ModelAndView("modules/test/user.jsp", "user", "delete success");
}
}

注意事项:
如果对UserMapper写了个实现类来更新sql,那么在编译的时候会出错因为@Autowired默认是根据类型加载(calss),
如果你希望使用这个实现类来更新sql,那么@Qualifier("UserMapperImp")通过实现类的名称来指定具体的实现类,如:

/**
* 使用@Autowired注解,自动加载UserMapper的实现类
*/
@Autowired
@Qualifier("UserMapperImp")
private UserMapper userMapper;

七、常见错误

1、Cannot load JDBC driver class 'com.mysql.jdbc.Driver'
原因:缺少依赖包
解决:pom.xml中添加下面依赖

<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.15</version>
</dependency>

2、 Cause: org.springframework.jdbc.CannotGetJdbcConnectionException: Could not get JDBC Connection; nested exception is org.apache.commons.dbcp.SQLNestedException: Cannot create PoolableConnectionFactory (The server time zone value '?????????±?????????±???¤' is unrecognized or represents more than one time zone. You must configure either the server or JDBC driver (via the serverTimezone configuration property) to use a more specifc time zone value if you want to utilize time zone support.)
原因:貌似是新版本的驱动出现的问题
解决:jdbcurl添加serverTimezone=UTC

参考地址

mybatis 官方中文教程
mybatis-spring 官方中文教程