<dependencies> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.5.9</version> </dependency> <!--数据库--> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.29</version> </dependency> <!--lombok--> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.24</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.13.2</version> <!--测试的范围 只能在test模块使用 单元测试必须要用4以上的版本--> <scope>test</scope> </dependency> <!--加载日志的信息 log4j日志--> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.17</version> </dependency> </dependencies>
<build> <!--配置xml文件能够编译输出到target java和resources文件夹都配置--> <resources> <resource> <directory>src/main/java</directory> <includes> <!--**任意目录及其子目录 **任意文件--> <include>**/**</include> </includes> </resource> <resource> <directory>src/main/resources</directory> <includes> <!--**任意目录及其子目录 **任意文件--> <include>**/**</include> </includes> </resource> </resources> </build>
package entity; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; ;AllArgsConstructor ;NoArgsConstructor ;Data //属性必须是引用数据类型 数据库Null值 动态sql都是判断属性是否为空 public class Emp {private Integer empno; private String ename; private String job; private Integer mgr; private String hiredate; private Double sal; private Double comm; private Integer deptno; }
# key-value 形式的文件 笔者使用的是mysql8 jdbc.driver=com.mysql.cj.jdbc.Driver jdbc.url=jdbc:mysql://127.0.0.1:3306/数据库名称 jdbc.username=账户 jdbc.password=密码
#代表root节点整个工程下所有输出日志的地方配置的输出的级别和输出的位置。 log4j.rootLogger=DEBUG,Console,D #代表配置控制台的类。 log4j.appender.Console=org.apache.log4j.ConsoleAppender log4j.appender.Console.layout=org.apache.log4j.PatternLayout log4j.appender.Console.layout.ConversionPattern=%d [%t] %-5p [%c] - %m%n log4j.logger.org.apache=INFO log4j.logger.java.sql.ResultSet=INFO log4j.logger.java.sql.Connection=DEBUG log4j.logger.java.sql.Statement=DEBUG log4j.logger.java.sql.PreparedStatement=DEBUG ### 输出到日志文件 ### log4j.appender.D = org.apache.log4j.DailyRollingFileAppender log4j.appender.D.File = logs/mybatis.log log4j.appender.D.Append = true log4j.appender.D.Threshold = DEBUG log4j.appender.D.layout = org.apache.log4j.PatternLayout log4j.appender.D.layout.ConversionPattern =%-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n
<?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> <!--引入jdbc配置文件 引入文件后就能调用里面的值了--> <properties resource=;jdbc.properties;></properties> <!--以类名作为别名 都是.的形式 让resultType写的短一些--> <typeAliases> <package name=;entity;/> </typeAliases> <!--环境选择 default是谁 就选谁,只能选择一个--> <environments default=;mysql;> <!--多种环境之一 上面的id要与default里面的值要保持一致--> <environment id=;mysql;> <!--事物管理器 JDBC 使用JDBC管理事务(事物提交是自动的) MANAGED Spring容器去提交--> <transactionManager type=;JDBC;/> <!--dataSource数据源 连接数据库的对象 unPooled是没有连接池的 POOLED是连接池的 pool游泳 JNDi外部容器管理连接--> <dataSource type=;POOLED;> <property name=;driver; value=;${jdbc.driver};/> <property name=;url; value=;${jdbc.url};/> <property name=;username; value=;${jdbc.username};/> <property name=;password; value=;${jdbc.password};/> </dataSource> </environment> </environments> <!--加载mapper文件--> <mappers> <!-- <mapper resource=;mapper/EmpMapper.xml;/>--> <!--扫描mapper接口的 该方式接口必须与mapper.xml文件名完全一致 且同一目录--> <package name=;mapper;/> </mappers> </configuration>
<!--引入jdbc配置文件 引入文件后就能调用里面的值了--> <properties resource=;jdbc.properties;></properties> <!--若有多级目录,resource里面可以写成目录路径/文件名 如temp/jdbc.properties-->
package util; import org.apache.ibatis.io.Resources; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; import java.io.InputStream; public class SqlSessionFactoryUtil {/*加载主配置文件*/ private static String resource = ;mybatis-config.xml;; /*定义在外面*/ private static SqlSessionFactory sf=null; static {/*加载主配置文件 得到SqlSessionFactory对象 * 该对象是一个连接工厂对象 * */ try {InputStream inputStream = Resources.getResourceAsStream(resource); sf = new SqlSessionFactoryBuilder().build(inputStream); } catch (Exception e) {e.printStackTrace(); } } public static SqlSessionFactory sf(){ return sf; } }
<!--加载mapper文件 mappeer是EmpMapper.xml文件的根目录--> <mappers> <package name=;mapper;/> </mappers>
int add(Emp e);
<!--useGeneratedKeys= 注解回填 keyProperty查询到的key放入实体中的哪个属性,把自动增长的那个值回填到传入的实参的属性里面--> <insert id=;add; useGeneratedKeys=;true; keyProperty=;empno;> insert into emp values(null,#{ename},#{job},#{mgr},#{hiredate},#{sal},#{comm},#{deptno}) </insert>
;org.junit.Test public void t3(){//连接工厂 SqlSessionFactory sf = SqlSessionFactoryUtil.sf(); /*打开一个连接对象 默认是自动提交 类似与connection 它的方法很难用不用*/ SqlSession sqlSession = sf.openSession(); //调用mapper中的sql 参数写命名空间.id /*调用自己的mapper 后面写接口.class*/ EmpMapper em = sqlSession.getMapper(EmpMapper.class); Emp emp=new Emp(null,;小王;,;经理;,1234,null,5000D,null,10); /*点击这个后就提交了*/ em.add(emp); System.out.println(;添加后:;;emp); sqlSession.commit(); sqlSession.close(); }
注意:新增时若某一字段设置了自动增长,那么插入的是null值的,得到的结果就算最新的自动增长的那个数字 设置了useGeneratedKeys=;true; keyProperty=;empno;就会自动回填到你填写的参数中 另外你传入的是实参是对象,那么可以通过#{}的方式去获取实参里面的每一个属性值
int delete(int id);
<!--删除方法--> <insert id=;delete;> delete from emp WHERE empno=#{id} </insert>
public void t4(){//连接工厂 SqlSessionFactory sf = SqlSessionFactoryUtil.sf(); /*打开一个连接对象 默认是自动提交 类似与connection 它的方法很难用不用*/ SqlSession sqlSession = sf.openSession(); //调用mapper中的sql 参数写命名空间.id /*调用自己的mapper 后面写接口.class*/ EmpMapper em = sqlSession.getMapper(EmpMapper.class); /*点击这个后就提交了*/ em.delete(8889); sqlSession.commit(); sqlSession.close(); }
sqlSession.commit();这是设置了该事务提交,因为transactionManager type=;JDBC;是默认是手动提交的 不写这句话的话,数据库是不会产生任何变化的
int update(Emp e);
<!--修改方法 实体内里面的属性 丢个对象进去是可以获取对象的值--> <update id=;update;> update emp set ename=#{ename},job=#{job},mgr=#{mgr},hiredate=#{hiredate},sal=#{sal}, comm=#{comm},deptno=#{deptno} where empno=#{empno} </update>
/*这个是修改方法的sql*/ ;org.junit.Test public void t5(){//连接工厂 SqlSessionFactory sf = SqlSessionFactoryUtil.sf(); /*打开一个连接对象 默认是自动提交 类似与connection 它的方法很难用不用*/ SqlSession sqlSession = sf.openSession(); //调用mapper中的sql 参数写命名空间.id /*调用自己的mapper 后面写接口.class*/ EmpMapper em = sqlSession.getMapper(EmpMapper.class); /*点击这个后就提交了*/ Emp emp=new Emp(8890,;张三;,;哈哈哈;,1234,;2019-08-03;,8888d,6666d,20); em.update(emp); sqlSession.commit(); sqlSession.close(); }
若你传入的参数是实体类的对象,对应的xml文件中的update标签中可以通过#{实体类属性名}来获取里面的对应的值 ${实体类属性名}也是可以获取的值,正如之前所提到的,这个因为安全性的问题,使用场景一般是模糊查找
<link href="https://csdnimg.cn/release/blogv2/dist/mdeditor/css/editerView/markdown_views-22a2fefd3b.css" rel="stylesheet"/><link href="https://csdnimg.cn/release/blogv2/dist/mdeditor/css/style-4f8fbf9108.css" rel="stylesheet"/>
应用优化及Mysql中查询缓存优化以及Mysql内存管理及优化