ByBatis

MyBatis是Apache的一个开源项目iBatis,iBatis3.x 正式更名为MyBatis ,代码于2013年11月迁移到Github。它是一个基于Java的持久层框架(连数据库用的)。 iBatis提供的持久层框架包括SQL Maps和Data Access Objects(DAO)

https://github.com/mybatis/mybatis-3/

MyBatis简介(半自动化)

1) MyBatis 是支持定制化 SQL、存储过程以及高级映射的优秀的持久层框架

2) MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集

3) MyBatis可以使用简单的XML或注解用于配置和原始映射,将接口和Java的POJO(Plain Old Java Objects,普通的Java对象)映射成数据库中的记录

4) 半自动ORM(Object Relation Mapping`)框架

SSH(全自动的,连接数据库黑箱操作,sql语句都不用写) 、SSM

1、开发环境的准备

1) 创建Maven版的Java工程

2) 加入MyBatis框架的jar包、Mysql驱动包、log4j(可以看到发送的sql语句)的jar包的依赖

pom.xml

  1. <!-- MyBatis -->
  2. <dependency>
  3. <groupId>org.mybatis</groupId>
  4. <artifactId>mybatis</artifactId>
  5. <version>3.4.2</version>
  6. </dependency>
  7.  
  8. <!-- MySql -->
  9. <dependency>
  10. <groupId>mysql</groupId>
  11. <artifactId>mysql-connector-java</artifactId>
  12. <version>5.1.37</version>
  13. </dependency>
  14.  
  15. <!-- log4j -->
  16. <dependency>
  17. <groupId>log4j</groupId>
  18. <artifactId>log4j</artifactId>
  19. <version>1.2.17</version>
  20. </dependency>

3) 导入log4j 的配置文件(可以看到传的参数,查询的结果)

  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
  3.  
  4. <log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
  5.  
  6. <appender name="STDOUT" class="org.apache.log4j.ConsoleAppender">
  7. <param name="Encoding" value="UTF-8" />
  8. <layout class="org.apache.log4j.PatternLayout">
  9. <param name="ConversionPattern" value="%-5p %d{MM-dd HH:mm:ss,SSS} %m (%F:%L) \n" />
  10. </layout>
  11. </appender>
  12. <logger name="java.sql">
  13. <level value="debug" />
  14. </logger>
  15. <logger name="org.apache.ibatis">
  16. <level value="info" />
  17. </logger>
  18. <root>
  19. <level value="debug" />
  20. <appender-ref ref="STDOUT" />
  21. </root>
  22. </log4j:configuration>

2、创建测试表; 在MySQL中创建数据库和数据表

3、创建javaBean

4、创建MyBatis的全局配置文件( 参考MyBatis的官网手册)

  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE configuration
  3. PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
  4. "http://mybatis.org/dtd/mybatis-3-config.dtd">
  5. <configuration>
  6. <!-- 数据库连接环境的配置 -->
  7. <environments default="development">
  8. <environment id="development">
  9. <transactionManager type="JDBC" />
  10.  
  11. <dataSource type="POOLED">
  12. <property name="driver" value="com.mysql.jdbc.Driver" />
  13. <property name="url" value="jdbc:mysql://localhost:3306/mybatis" />
  14. <property name="username" value="root" />
  15. <property name="password" value="root" />
  16. </dataSource>
  17. </environment>
  18. </environments>
  19. <!-- 引入SQL映射文件,Mapper映射文件 -->
  20. <mappers>
  21. <mapper resource="com/atguigu/mybatis/mapper/EmployeeMapper.xml" />
  22. </mappers>
  23. </configuration>

5、创建Mapper接口(增删改查等方法,就是之前写的UserDAO接口)

之前是要写一个接口的实现类,现在不需要,MyBatis自动创建代理实现类,不用写实现类了,只需写sql语句,写到一个xml的映射文件(它来生成代理实现类)里边。

6、创建Mybatis的sql映射文件(参考官网)

  1. <?xml version="1.0" encoding="UTF-" ?>
  2. <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis--mapper.dtd">
  3. <!-- namespace属性:指定Mapper接口的全类名-->
  4. <mapper namespace="com.atguigu.mybatis.mapper.EmployeeMapper">
  5. <!--
  6. id属性:指定Mapper接口中方法的方法名
  7. resultType属性:指定方法返回值类型的全类名,方法的返回值返回的Employee对象
  8. -->
  9. <select id="getEmployeeById" resultType="com.atguigu.mybatis.entities.Employee">
  10. select id,last_name lastName,email,salary,dept_id deptId -->>查询的时候起别名是为了能够找到它们的get/set方法,造好对象要调get/set方法,如果类里边没有就赋不上值。
  11. from employees where id = #{ id } 取填充占位符,根据传入的参数取占位符的值
      </select> 添加、插入的时候不起别名。
  12. </mapper>

这个映射文件需要在MyBatis全局配置文件里边注册,即引入sql映射文件--Mapper映射文件

  1. <!-- 引入SQL映射文件,Mapper映射文件 -->
  2. <mappers>
  3. <mapper resource="com/atguigu/mybatis/mapper/EmployeeMapper.xml" />
  4. </mappers>

7、测试

注意导入的包不要导错了

  1. import java.io.IOException;
  2. import java.io.InputStream;
  3. import org.apache.ibatis.io.Resources;
  4. import org.apache.ibatis.session.SqlSession;
  5. import org.apache.ibatis.session.SqlSessionFactory;
  6. import org.apache.ibatis.session.SqlSessionFactoryBuilder;
  7. import org.junit.jupiter.api.Test;
  1.   @Test
  2. void testGetEmployeeById() throws IOException {
  3. // 1.创建SqlSessionFactory对象
  4. String resource = "mybatis-config.xml";
  5. InputStream inputStream = Resources.getResourceAsStream(resource); //读成一个流
  6. SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); //把流传进去;
  7. //2.获取SqlSession对象,相当于JDBC中的Connection
  8. SqlSession session = sqlSessionFactory.openSession(); //得到连接
  9. try {
  10. //3.获取Mapper接口的代理实现类 ;虽然是接口类型,但MyBatis创建了一个实现类(代理实现类) proxy.$Proxy8
            EmployeeMapper employeeMapper = session.getMapper(EmployeeMapper.class);
  11. //4.调用EmployeeMapper中获取Employee的方法 ;调接口里边的方法。
  12. Employee employee = employeeMapper.getEmployeeById(1);
  13. System.out.println(employee);
  14. } finally {
  15. //5.关闭SqlSession,关闭下这个连接
  16. session.close();
  17. }
  18. }

两个绑定

1) Mapper接口与Mapper映射文件的绑定

在Mppper映射文件中的<mapper>标签中的namespace中必须指定Mapper接口

的全类名

2)  Mapper映射文件中的增删改查标签的id必须指定成Mapper接口中的方法名.

用接口的好处:赋实现类的时候不同的实现类都可以赋值给这个类型,为了解耦,以后只在一个类里边写一个接口类型,不同的实现类都可以赋值给它。

导入提示:能写哪些xml都在这个文件里边 http://mybatis.org/dtd/mybatis-3-config.dtd,把它导入进来。

MyBatis 高级映射

接口

  1. package com.atguigu.mybatis.mapper;
  2. import java.util.List;
  3. import java.util.Map;
  4. import org.apache.ibatis.annotations.Param;
  5. import com.atguigu.mybatis.entitis.Employee;
  6. public interface EmployeeMapper {
  7. // select获取一个员工的方法
  8. Employee getEmployeeById(Integer id);
  9. // select多行数据返回对象的集合
  10. List<Employee> getAllEmployees();
  11. // insert,添加员工;可以写void没有返回值的
  12. public Integer insertEmployee(Employee employee);
  13. // update,修改;可以写void
  14. public Boolean updateEmployee(Employee employee);
  15. // delete,删除
  16. public void deleteEmployeeById(Integer id);
  17. Employee getEmployeeByLastNameAndEmail(@Param("lastName") String lastName, @Param("email") String email);
  18. Employee getEmployeeByMap(Map<String, Object> map);
  19. }

xml

  1. <?xml version="1.0" encoding="UTF-" ?>
  2. <!DOCTYPE mapper
  3. PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  4. "http://mybatis.org/dtd/mybatis--mapper.dtd">
  5. <!--
  6. namespace属性:指定Mapper接口的全类名
  7. -->
  8. <mapper namespace="com.atguigu.mybatis.mapper.EmployeeMapper">
  9. <!--
  10. .根据id查找一个员工;id属性:指定Mapper接口中方法的方法名;resultType属性:指定方法返回值类型的全类名
  11. -->
  12. <select id="getEmployeeById" resultType="com.atguigu.mybatis.entitis.Employee">
  13. select id,last_name lastName,email,salary,dept_id deptId
  14. from employees where id = #{id} 这个参数id可以随便写。
  15. </select>
  16. <!--2.查找出所有的员工信息,如果返回值是List, 这里resultType不是List类型,是List里边泛型的类型,它查询出来是放到List里边的封装成Employee对象 -->
  17. <select id="getAllEmployees" resultType="com.atguigu.mybatis.entitis.Employee">
  18. select id, last_name lastName, email, salary, dept_id deptId from
  19. employees
  20. </select>
  21. <!-- 3.添加员工,传入的参数是Employee类型,paramterType可写可不写
           parameterType属性:设置Mapper接口中的方法的入参的类型,该属性可以省略不写 -->
  22. <insert id="insertEmployee" parameterType="com.atguigu.mybatis.entitis.Employee">
  23. insert into employees(last_name, email, salary, dept_id)
  24. values</insert>
  25. <!-- 4.更新修改员工信息 -->
  26. <update id="updateEmployee" >
  27. update employees set last_name = #{lastName}, email = #{email},
  28. salary = #{salary}, dept_id = #{deptId} where id = #{id}
  29. </update>
  30. <!-- 5.删除员工 -->
  31. <delete id="deleteEmployeeById">
  32. delete from employees where id = #{id}
  33. </delete>
  34. <!-- 根据用户名和邮箱查询查询一个用户 -->
  35. <select id="getEmployeeByLastNameAndEmail" resultType="com.atguigu.mybatis.entitis.Employee">
  36. select id, last_name lastName, email, salary, dept_id deptId
  37. from employees where last_name = </select> 要在接口的方法形参里边加上注解在这里就可以使用lastName和email了,也可以使用param1和param2,但不能用arg0/arg1。
  38. <!-- 根据传入的Map查询一个用户 -->
  39. <select id="getEmployeeByMap" resultType="com.atguigu.mybatis.entitis.Employee">
  40. select id, last_name lastName, email, salary, dept_id deptId
  41. from employees where last_name = #{ln} and email = #{el}
  42. </select>
  43. </mapper>
  1. package com.atguigu.mybatis.test;
  2. import java.io.IOException;
  3. import java.io.InputStream;
  4. import java.util.HashMap;
  5. import java.util.List;
  6. import org.apache.ibatis.io.Resources;
  7. import org.apache.ibatis.session.SqlSession;
  8. import org.apache.ibatis.session.SqlSessionFactory;
  9. import org.apache.ibatis.session.SqlSessionFactoryBuilder;
  10. import org.junit.Test;
  11. import com.atguigu.mybatis.entitis.Employee;
  12. import com.atguigu.mybatis.mapper.EmployeeMapper;
  13. public class MyBatisTest {
  14. //获取SqlSessionFactory的方法
  15. // 创建SqlSessionFactory对象
  16. public SqlSessionFactory getSessionFactory() throws IOException {
  17. String resource = "mybatis-config.xml";
  18. InputStream inputStream = Resources.getResourceAsStream(resource);
  19. SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
  20. return sqlSessionFactory;
  21. }
  22. //1.获取一个员工
  23. @Test
  24. public void testGetEmployeeById() throws IOException {
  25. String resource = "mybatis-config.xml";
  26. InputStream inputStream = Resources.getResourceAsStream(resource);
  27. SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
  28. //2.获取SqlSession对象,相当于JDBC中的Connection
  29. SqlSession session = sqlSessionFactory.openSession();
  30. try {
  31. //3.获取Mapper接口的代理实现类
  32. EmployeeMapper employeeMapper = session.getMapper(EmployeeMapper.class);
  33. //4.调用EmployeeMapper中获取Employee的方法
  34. Employee employee = employeeMapper.getEmployeeById(1);
  35. System.out.println(employee);
  36. } finally {
  37. //5.关闭SqlSession
  38. session.close();
  39. }
  40. }
  41. //2.获取所有的员工信息;
  42. @Test
  43. public void testGetAllEmployees() throws IOException {
  44. //①获取SqlSessionFactory对象
  45. SqlSessionFactory sessionFactory = getSessionFactory();
  46. //②获取SqlSession对象
  47. SqlSession sqlSession = sessionFactory.openSession();
  48. //③获取Mapper接口对象
  49. EmployeeMapper employeeMapper = sqlSession.getMapper(EmployeeMapper.class);
  50. //调用EmployeeMapper中获取所有员工的方法;
  51. List<Employee> allEmployees = employeeMapper.getAllEmployees();
  52. for (Employee employee : allEmployees) {
  53. System.out.println(employee);
  54. }
  55. //关闭
  56. sqlSession.close();
  57. }
  58. //3.测试添加员工
  59. @Test
  60. public void testInsertEmployee() throws IOException {
  61. //①获取SqlSessionFactory对象
  62. SqlSessionFactory sessionFactory = getSessionFactory();
  63. //②获取SqlSession
  64. SqlSession sqlSession = sessionFactory.openSession();
  65. //③获取Mapper接口对象
  66. EmployeeMapper employeeMapper = sqlSession.getMapper(EmployeeMapper.class);
  67. //创建Employee对象;
  68. Employee employee = new Employee(null, "kris12", "kris@qq.com", 20000.0, 2);
  69. //④调用EmployeeMapper中添加员工的方法
  70. //employeeMapper.insertEmployee(employee);
  71. //4.更新修改员工
  72. //employeeMapper.updateEmployee(new Employee(7, "smile", "smile@123.com", 10000, 3));
  73. //5.删除员工信息
  74. employeeMapper.deleteEmployeeById(7);
  75. sqlSession.commit(); //要记得提交事务;
  76. sqlSession.close();
  77. }
  78. //根据用户名和邮箱获取一个员工
  79. @Test
  80. public void testGetEmployeeByLastNameAndEmail() throws IOException {
  81. SqlSessionFactory sqlSessionFactory = getSessionFactory();
  82. SqlSession sqlSession = sqlSessionFactory.openSession();
  83. //获得Mapper对象
  84. EmployeeMapper employeeMapper = sqlSession.getMapper(EmployeeMapper.class);
  85. Employee employee = employeeMapper.getEmployeeByLastNameAndEmail("kris", "kris@qq.com");
  86. System.out.println(employee);
  87. sqlSession.close();
  88. }
  89. //根据传入的Map查询一个用户
  90. @Test
  91. public void testGetEmployeeByMap() throws IOException {
  92. SqlSessionFactory sessionFactory = getSessionFactory();
  93. SqlSession sqlSession = sessionFactory.openSession();
  94. EmployeeMapper employeeMapper = sqlSession.getMapper(EmployeeMapper.class);
  95. //调用EmployeeMapper中根据Map获取用户的方法
  96. HashMap<String, Object> hashMap = new HashMap<>();
  97. hashMap.put("ln", "kris");
  98. hashMap.put("el", "kris@qq.com");
  99. Employee employee = employeeMapper.getEmployeeByMap(hashMap);
  100. System.out.println(employee);
  101. sqlSession.close();
  102. }
  103. }
  1. MyBatisMapper接口中方法的入参的处理:
  2. 1.单个参数
  3. MyBatis不做任何处理,此时填充占位符时取值的key可以任意指定
  4. 例如:#{任意指定}
  5. 2.多个参数
  6. MyBatis会将多个参数封装到一个Map中,向Map中放值时的keyarg0arg1...或者param1param2...
  7. 此时填充占位符时取值的key就是arg0arg1...或者param1param2...
  8. 例如:last_name = #{arg0}/#{param1} and email = #{arg1}/#{param2}
  9. 我们也可以通过在Mapper接口的方法入参的前面添加@Param注解的方式来指定改key,此时填充占位符时取值的key
  10. 就是@Param注解中指定的值
  11. 3.POJO
  12. 如果传入的多个参数可以封装成POJO对象,那么可以直接传入POJO对象,此时填充占位符时取值的key
  13. 就是POJO的属性名
  14. 例如:last_name = #{POJO的属性名}
  15. 4.Map
  16. 如果传入的多个参数不可以封装成POJO对象,可以将多个参数放到Map中,然后传入一个Map
  17. 此时填充占位符时取值的key就是向Map中放值时指定的key

源码见下:

  1. public Object getNamedParams(Object[] args) {
  2. final int paramCount = names.size();
  3. if (args == null || paramCount == 0) {
  4. return null;
  5. } else if (!hasParamAnnotation && paramCount == 1) {
  6. return args[names.firstKey()];
  7. } else {
  8. final Map<String, Object> param = new ParamMap<Object>();
  9. int i = 0;
  10. for (Map.Entry<Integer, String> entry : names.entrySet()) {
  11. param.put(entry.getValue(), args[entry.getKey()]);
  12. // add generic param names (param1, param2, ...)
  13. final String genericParamName = GENERIC_NAME_PREFIX + String.valueOf(i + 1);
  14. // ensure not to overwrite parameter named with @Param
  15. if (!names.containsValue(genericParamName)) {
  16. param.put(genericParamName, args[entry.getKey()]);
  17. }
  18. i++;
  19. }
  20. return param;
  21. }
  22. }

resultMap自定义映射

1)  自定义resultMap,实现高级结果集映射

2) id :用于完成主键值的映射

3) result :用于完成普通列的映射

4) association :一个复杂的类型关联;许多结果将包成这种类型

   POJO中的属性可能会是一个对象,我们可以使用联合查询,并以级联属性的方式封装对象.使用association标签定义对象的封装规则

5)  collection : 复杂类型的集

  POJO中的属性可能会是一个集合对象,我们可以使用联合查询,并以级联属性的方式封装对象.使用collection标签定义对象的封装规则

接口

  1.   Employee getEmployeeByMap(Map<String, Object> map);
  2.  
  3. Employee2 getEmployeeByIdContainsDept(Integer id);
  1. <!-- 8在查询员工的同时把员工的部门信息也查询出来;u=自定义高级映射,resultMap属性:指定高级结果集的id属性值 -->
  2. <select id="getEmployeeByIdContainsDept" resultMap="myMap">
  3.  
  4. SELECT employees.*, d.id AS d_id, d.name AS d_name
  5. FROM employees LEFT
  6. JOIN departments AS d
  7. ON employees.dept_id = d.id
  8. WHERE employees.eid = #{id};
  9. </select>
  10. <!-- type属性:设置要映射的POJO的全类名; id属性:设置一个唯一的标示以便被引用 -->
  11. <resultMap type="com.atguigu.mybatis.entitis.Employee2" id="myMap">
  12. <!-- 先映射主键;column属性:指定数据库中的列名,property属性:指定POJO的属性名 -->
  13. <id column="eid" property="id" />
  14. <!-- 再映射其他列 -->
  15. <result column="last_name" property="lastName" />
  16. <result column="email" property="email" />
  17. <result column="salary" property="salary" />
  18.  
  19. <!-- 方式一: 通过给级联属性赋值映射部门信息;没有关联之前dept=null -->
  20. <!-- <result column="d_id" property="dept.id" />
  21. <result column="d_name" property="dept.name" /> -->
  22.  
  23. <!-- 方式二:通过association标签实现联合查询
  24. property属性:指定要映射的属性的属性名
  25. javaType属性:指定要映射的属性的类型
  26. -->
  27. <association property="dept" javaType="com.atguigu.mybatis.entitis.Department">
  28. <id column="d_id" property="id"/> <!-- 映射id -->
  29. <result column="d_name" property="name"/> <!-- 映射其他列 -->
  30. </association>
  31. </resultMap>
  1. public interface DepartmentMapper {
  2. Department getDepartmentByIdContainsEmps(Integer id);
  3. }
  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE mapper
  3. PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  4. "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  5. <!-- namespace属性:指定Mapper接口的全类名 -->
  6. <mapper namespace="com.atguigu.mybatis.mapper.DepartmentMapper">
  7. <select id="getDepartmentByIdContainsEmps" resultMap="myMap">
  8. SELECT d.id , d.name ,e.*
  9. FROM departments d
  10. LEFT JOIN employees e
  11. ON d.id = e.dept_id
  12. WHERE d.id = #{id}
  13. </select>
  14. <resultMap type="com.atguigu.mybatis.entitis.Department" id="myMap">
  15. <!-- 先映射主键;column属性:指定数据库中的列名,property属性:指定POJO的属性名 -->
  16. <id column="id" property="id" />
  17. <result column="name" property="name"/>
  18. <collection property="emps" ofType="com.atguigu.mybatis.entitis.Employee2">
  19. <id column="eid" property="id"/>
  20. <result column="last_name" property="lastName"/>
  21. <result column="email" property="email"/>
  22. <result column="salary" property="salary"/>
  23. </collection>
  24. </resultMap>
  25. </mapper>

mybatic-config.xml

  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE configuration
  3. PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
  4. "http://mybatis.org/dtd/mybatis-3-config.dtd">
  5. <configuration>
  6.  
  7. <settings>
  8. <setting name="mapUnderscoreToCamelCase" value="true"/>
  9. </settings>
  10.  
  11. <!-- 数据库连接环境的配置 -->
  12. <environments default="development">
  13. <environment id="development">
  14. <transactionManager type="JDBC" />
  15.  
  16. <dataSource type="POOLED">
  17. <property name="driver" value="com.mysql.jdbc.Driver" />
  18. <property name="url" value="jdbc:mysql://localhost:3306/mybatis" />
  19. <property name="username" value="root" />
  20. <property name="password" value="123456" />
  21. </dataSource>
  22.  
  23. </environment>
  24. </environments>
  25. <!-- 引入SQL映射文件,Mapper映射文件 -->
  26. <mappers>
  27. <mapper resource="com/atguigu/mybatis/mapper/EmployeeMapper.xml" />
  28. <mapper resource="com/atguigu/mybatis/mapper/DepartmentMapper.xml"/>
  29. </mappers>
  30. </configuration>

注:

MyBatis配置文件自动提示的配置:

MyBatis的全局配置文件和Mapper映射文件的xml文件的标签写的时候有提示;注意它两个文件的对应;

http://mybatis.org/dtd/mybatis-3-mapper.dtd

http://mybatis.org/dtd/mybatis-3-config.dtd

框架MyBatis的更多相关文章

  1. 从零搭建springboot服务02-内嵌持久层框架Mybatis

    愿历尽千帆,归来仍是少年 内嵌持久层框架Mybatis 1.所需依赖 <!-- Mysql驱动包 --> <dependency> <groupId>mysql&l ...

  2. 一篇文章带你掌握主流数据库框架——MyBatis

    一篇文章带你掌握主流数据库框架--MyBatis MyBatis 是一款优秀的持久层框架,它支持自定义 SQL.存储过程以及高级映射. 在之前的文章中我们学习了MYSQL和JDBC,但是这些东西远远不 ...

  3. java 持久框架mybatis的初步学习

    什么是 MyBatis? MyBatis 是支持普通 SQL 查询,存储过程和高级映射的优秀持久层框架.MyBatis 消除 了几乎所有的 JDBC 代码和参数的手工设置以及结果集的检索.MyBati ...

  4. java持久层框架mybatis如何防止sql注入

    看到一篇很好的文章:http://www.jfox.info/ava-persistence-framework-mybatis-how-to-prevent-sql-injection sql注入大 ...

  5. Java数据持久层框架 MyBatis之API学习八(Java API详解)

    对于MyBatis的学习而言,最好去MyBatis的官方文档:http://www.mybatis.org/mybatis-3/zh/index.html 对于语言的学习而言,马上上手去编程,多多练习 ...

  6. Java数据持久层框架 MyBatis之背景知识三

    摘录自:http://www.cnblogs.com/lcngu/p/5437281.html 对于MyBatis的学习而言,最好去MyBatis的官方文档:http://www.mybatis.or ...

  7. Java数据持久层框架 MyBatis之API学习十(Logging详解)

    对于MyBatis的学习而言,最好去MyBatis的官方文档:http://www.mybatis.org/mybatis-3/zh/index.html 对于语言的学习而言,马上上手去编程,多多练习 ...

  8. Java数据持久层框架 MyBatis之API学习九(SQL语句构建器详解)

    对于MyBatis的学习而言,最好去MyBatis的官方文档:http://www.mybatis.org/mybatis-3/zh/index.html 对于语言的学习而言,马上上手去编程,多多练习 ...

  9. Java数据持久层框架 MyBatis之API学习七(动态 SQL详解)

    对于MyBatis的学习而言,最好去MyBatis的官方文档:http://www.mybatis.org/mybatis-3/zh/index.html 对于语言的学习而言,马上上手去编程,多多练习 ...

  10. Java数据持久层框架 MyBatis之API学习六(Mapper XML 文件详解)

    对于MyBatis的学习而言,最好去MyBatis的官方文档:http://www.mybatis.org/mybatis-3/zh/index.html 对于语言的学习而言,马上上手去编程,多多练习 ...

随机推荐

  1. Go 常见严格格式汇总(struct,func...)不定期更新!

    1 引言 Golang对格式有着较为严格的规定,例如方法大括号一定要放在方法名后,否则编译不过:变量(常量除外)未使用,也编译不过等等 2 例子 2.1 struct type person stru ...

  2. Jenkins二 安装gitlab及其使用

    git --version 如果没有安装git直接源码安装即可,如果安装了先删除原来的git. yum -y remove git先安装编译git需要的包. yum install zlib-deve ...

  3. 神经网络之 Batch Normalization

    知乎 csdn Batch Normalization 学习笔记 原文地址:http://blog.csdn.net/hjimce/article/details/50866313 作者:hjimce ...

  4. 探索一个NSObject对象占用多少内存?

    1 下面写代码测试探索NSObject的本质 Objective-C代码,底层实现其实都是C\C++代码 #import <Foundation/Foundation.h> int mai ...

  5. npm安装依赖包 --save-dev 和 --save; package.json的devDependencies和dependencies 的区别!

    以前一直在纠结一个npm安装的包依赖管理的问题.是这样的: 我们在使用npm install 安装模块或插件的时候,有两种命令把他们写入到 package.json 文件里面去,他们是:--save- ...

  6. Java编程的分期步骤(一)

    日期:2018.8.12 星期一 博客期:005 不知不觉来到第五期了,先简单说一下Java环境!(虽然Java都自学完了才说....)首先,就是在网站上下载一个java包,之后把它下载到全英文的一个 ...

  7. mysql解决外网不能连接

    mysql解决外网不能连接 Author:SimpleWu 或许有些时候会遇到通过ip地址访问项目的数据库,可是访问失败了. 现在给大家一种解决方案: #进入mysql数据库 USE mysql; # ...

  8. 【python】json中字典key不可为数值型

    遇到了一个很诡异的错误.写一个字典,存入json文件.之后读出判断是否存在key.结果惊奇的发现,同一个key居然存在两次. 原因:json会将数值key转换为unicode 结论:使用json时字典 ...

  9. php可变数量的参数

    PHP 在用户自定义函数中支持可变数量的参数列表.在 PHP 5.6 及以上的版本中,由 ... 语法实现:在 PHP 5.5 及更早版本中,使用函数 func_num_args(),func_get ...

  10. 解决npm install过程中报错:unable to verify the first certificate

    今天使用npm安装开发包时遇到“unable to verify the first certificate”(无法验证第一证书)这个问题 原因:2014年2月27日,npm不再支持自签名证书.因为n ...