一、使用xml配置方式(不常用)
1、引用
<dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.5.13</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.30</version> </dependency>
2、示例
SqlMapConfig.xml配置文件
<?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="mysql"> <!--配置mysql的环境--> <environment id="mysql"> <!--配置事务的类型--> <transactionManager type="JDBC"></transactionManager> <!--配置数据源(连接池)--> <dataSource type="POOLED"> <!--配置连接数据库的4个基本信息 --> <property name="driver" value="com.mysql.cj.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3307/数据库"/> <property name="username" value="账号"/> <property name="password" value="密码"/> </dataSource> </environment> </environments> <!--指定映射配置文件的位置,映射配置文件指的是每个dao独立的配置文件--> <mappers> <mapper resource="dao/UserDao.xml"/> </mappers> </configuration>
dao/UserDao.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.namejr.MybitsDemo.dao.IUserDao"> <select id="findAll" resultType="com.namejr.MybitsDemo.bean.UserInfosModel"> select user_id as id,user_name as name,user_phone as phone,user_type as uType,user_open_status as openStatus from fms_user_infos; </select> </mapper>
UserInfosModel.java文件
public class UserInfosModel implements Serializable{ private String id; private String name; private String phone; private Integer uType; private Integer openStatus; public String getId() { return id; } public void setId(String id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPhone() { return phone; } public void setPhone(String phone) { this.phone = phone; } public Integer getuType() { return uType; } public void setuType(Integer uType) { this.uType = uType; } public Integer getOpenStatus() { return openStatus; } public void setOpenStatus(Integer openStatus) { this.openStatus = openStatus; } }
IUserDao.java文件
public interface IUserDao{ List<UserInfosModel> findAll(); }
使用
try { //1.读取配置文件 InputStream in=Resources.getResourceAsStream("SqlMapConfig.xml"); //2.创建SqlSessionFactory工厂 SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder(); SqlSessionFactory factory = builder.build(in); //3.使用工厂生产SqlSession对象 SqlSession session = factory.openSession(); //4.使用SqlSession创建Dao接口的代理对象 IUserDao userDao = session.getMapper(IUserDao.class); //5.使用代理对象执行方法 List<UserInfosModel> tempUserInfos = userDao.findAll(); for(UserInfosModel tempUserInfo:tempUserInfos) { System.out.println(JSON.toJSONString(tempUserInfo)); } //6.释放资源 session.close(); in.close(); } catch(Exception err) { System.out.println(err); }
二、使用注解
pom.xml
<dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.30</version> </dependency> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>2.2.2</version> </dependency>
application.properties
# 数据库配置 spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver #spring.datasource.url=jdbc:mysql://127.0.0.1:3306/testDB?characterEncoding=UTF-8&allowMultiQueries=true&&useAffectedRows=true&allowPublicKeyRetrieval=true #spring.datasource.username=root #spring.datasource.password=12345
mybatis.type-aliases-package=*.bean
mybatis.mapper-locations=classpath:/dao/*.xml
dao/Dao.java
package *.dao;
import java.util.List;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Isolation;
import org.springframework.transaction.annotation.Transactional;
/*
* Dao
* */
@Repository
public interface DecryptTrainDao {
@Transactional(isolation = Isolation.READ_COMMITTED)
void insertInfos(InfosModel model);
}
启动类一定要用@MapperScans进行扫描,具体看:博客后台 - 博客园 (cnblogs.com)的如果集成mybit后,没报错也也无法正常运行或者需要进行扫描关于mybit包dao包,请使用@MapperScans
resources/dao/Dao.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="*.dao.DecryptTrainDao"> <!-- 通用查询resultMap --> <resultMap id="publicHashMapf" type="java.util.HashMap"></resultMap> <!-- 插入训练包信息 --> <insert id="insertInfos" parameterType="*.InfosModel"> insert into db1(id,uid) value(#{id}, #{uid}); insert into db2(id,sid) value(#{id}, #{sid}); </insert> </mapper>
注:数据库默认的隔离级别是REPEATABLE_READ,最好修改为READ_COMMITTED。
具体可查看(本文仅作笔记摘抄):MySQL常见面试题总结 | Java学习&面试指南-程序员大彬 (topjavaer.cn)
生产环境大多使用RC。为什么不是RR呢?
可重复读(Repeatable Read),简称为RR 读已提交(Read Commited),简称为RC
缘由一:在RR隔离级别下,存在间隙锁,导致出现死锁的几率比RC大的多! 缘由二:在RR隔离级别下,条件列未命中索引会锁表!而在RC隔离级别下,只锁行!
也就是说,RC的并发性高于RR。
并且大部分场景下,不可重复读问题是可以接受的。毕竟数据都已经提交了,读出来本身就没有太大问题!
常见的隔离级别:
READ_UNCOMMITTED:最低的隔离级别,允许读取尚未提交的数据变更。可能会导致脏读、不可重复读和幻读。
READ_COMMITTED:允许读取已经提交的数据。可以避免脏读,但是不可重复读和幻读仍然可能发生。
REPEATABLE_READ:事务保证可以多次从同一个字段中读取相同的数据,在事务处理过程中,会锁定读取到的所有数据,直到事务结束。可以避免脏读和不可重复读,但幻读仍有可能。
SERIALIZABLE:最高的隔离级别,所有的事务都是按序逐个执行。可以避免所有可能的数据并发问题,但性能通常较差。
在实际应用中,根据具体业务需求选择合适的隔离级别。通常,默认的数据库隔离级别(如MySQL的REPEATABLE_READ)就可以满足大多数需求。只有在确定需要更高或更低隔离级别时,才需要手动设置。
问题处理:
如果出现unregister mbean error javax.management.InstanceNotFoundException: com.alibaba.druid:type=DruidStatService
原因:在一台服务器上启动了两个tomcat,两个tomcat都是用druid。 解决方案: 修改Tomcat 下的 catalina.sh: 增加此句代码:JAVA_OPTS=”-Ddruid.registerToSysProperty=true”