zoukankan      html  css  js  c++  java
  • mybatis-02

    Mybatis第二天

    1、MyBatis框架中的日志记录
    MyBatis框架中,可以通过log4j实现日志输出。
    显示MyBatis访问数据库的过程。如:执行的SQL,迭代的ResultSet等.
    log4j是MyBatis框架必须依赖的插件jar包。
    显示日志信息,必须通过log4j的配置文件:log4j.properties实现配置.
    在资料中有配置文件模板.
    log4j.properties日志配置文件,必须保持在classpath下.src或bin目录中
    或者在mybatis总体配置文件里面开启mybatis日志
    <!-- 开启mybatis的日志记录 -->
    <settings>
      <setting name="logImpl" value="STDOUT_LOGGING"/>
    </settings>

     1 log4j.rootCategory=DEBUG, CONSOLE,LOGFILE
     2 
     3 
     4 log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
     5 log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
     6 log4j.appender.CONSOLE.layout.ConversionPattern=-%p-%d{yyyy/MM/dd HH:mm:ss,SSS}-%l-%L-%m%n
     7 
     8 
     9 log4j.appender.LOGFILE=org.apache.log4j.FileAppender
    10 log4j.appender.LOGFILE.File=D:/axis.log
    11 log4j.appender.LOGFILE.Append=true
    12 log4j.appender.LOGFILE.layout=org.apache.log4j.PatternLayout
    13 log4j.appender.LOGFILE.layout.ConversionPattern=-%p-%d{yyyy/MM/dd HH:mm:ss,SSS}-%l-%L-%m%n
    log4j基本配置

    2、MyBatis框架中的参数
    1:占位符
    1.2 用途:相当于JDBC技术中SQL语法内的的 ?
    1.2 语法:#{变量名}
    1.3 位置:在MyBatis映射文件中定义. 编写在SQL语法中
    1.4 参数传递特征:占位符命名大小写敏感.
    1.5 简单类型:传递简单类型变量: 八种基本类型,对应封装类型,String,忽略占位符的个数和占位符变量的命名,将数据传递给所有的占位符。
    1.6 Map集合对象:根据占位符的命名,作为Map中的Key,查询value. 将对象的数据,赋值给占位符.如果占位符命名在Map中不存在key, 参数数据为null.

    2:拼接符
    拼接符使用方式和占位符完全一致,传递参数的特性有区别。
    拼接符不能传递简单类型变量。可以传递自定义对象或Map集合对象。
    尽量避免使用拼接符,有SQL注入安全隐患。
    2.1 用途:使用特定的语法,为映射文件中的SQL语句,实现动态字符串拼接. 
    2.2 语法:${变量名}
    2.3 位置:在MyBatis映射文件中定义. 编写在SQL语法中
    占位符与拼接符的区别:
    1:#是将传入的值当做字符串的形式,变量替换后,#{} 对应的变量自动加上单引号 
    eg:select id,name,age from student where id =#{id},当前端把id值1,传入到后台的时候,就相当于 select id,name,age from student where id ='1'
    2:$是将传入的数据直接显示生成sql语句,变量替换后,${} 对应的变量不会加上单引号 
    eg:select id,name,age from student where id =${id},当前端把id值1,传入到后台的时候,就相当于 select id,name,age from student where id = 1
    3:1)#{} 能防止sql 注入   
       2)${} 不能防止sql 注入

    4:但是如果使用在order by 中就需要使用 $
    5:在大多数情况下还是经常使用#,但在不同情况下必须使用$
    6:1)#{} 为参数占位符 ?,即sql 预编译   
       2)${} 为字符串替换,即 sql 拼接

    7:1)#{}:动态解析 -> 预编译 -> 执行       
       2)${}:动态解析 -> 编译 -> 执行

    #{} 和 ${} 在使用中的技巧和建议
    (1)不论是单个参数,还是多个参数,一律都建议使用注解@Param("")
    (2)能用 #{} 的地方就用 #{},不用或少用 ${}
    (3)表名作参数时,必须用 ${}。如:select * from ${tableName}
    (4)order by 时,必须用 ${}。如:select * from t_user order by ${columnName}
    3、MyBatis框架中的CUD(增删改)和事物的管理
    MyBatis框架中,默认事务为rollback.(所有对数据库的操作,只有JDBC默认的自动提交)
    在SqlSession对象回收的时候,自动回滚.
    默认事务定义的位置:
    SqlSessionFactory.openSession();调用的时候,设置的默认事务.底层调用的是 openSession(false);
    SqlSessionFactory.openSession(boolean autoCommit);
    含义: 为JDBC中的Connection设定自动提交参数. connection.setAutoCommit (autoCommit);
    Mybatis具体实例增删改查+分页
    pojo层和xml映射配置

     1 package com.boom.pojo;
     2 
     3 import java.io.Serializable;
     4 
     5 /**
     6  * 实体对应的数据库表
     7  * @project_name mybatis-01 
     8  * @class_name User
     9  * @author Dilraba
    10  */
    11 public class User implements Serializable {
    12     
    13     private Integer userid;//用户名ID
    14     private String username;//用户姓名
    15     private Integer userage;//用户年龄
    16     
    17     public Integer getUserid() {
    18         return userid;
    19     }
    20     public void setUserid(Integer userid) {
    21         this.userid = userid;
    22     }
    23     public String getUsername() {
    24         return username;
    25     }
    26     public void setUsername(String username) {
    27         this.username = username;
    28     }
    29     public Integer getUserage() {
    30         return userage;
    31     }
    32     public void setUserage(Integer userage) {
    33         this.userage = userage;
    34     }
    35     public User(Integer userid, String username, Integer userage) {
    36         super();
    37         this.userid = userid;
    38         this.username = username;
    39         this.userage = userage;
    40     }
    41     
    42     public User() {
    43         super();
    44     }
    45     
    46     @Override
    47     public String toString() {
    48         return "User [userid=" + userid + ", username=" + username + ", userage=" + userage + "]";
    49     }
    50     
    51 }
    user.java
     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 <mapper namespace="com.boom.pojo.User">
     6     
     7     <select id="selectById" parameterType="int" resultType="com.boom.pojo.User">
     8         select * from user where userid = #{userid}
     9     </select>
    10     
    11     <!-- mybatis分页 -->
    12     <select id="selsectByAll"  resultType="com.boom.pojo.User">
    13         select * from user
    14     </select>
    15     
    16     <!-- 条件查询(多个参数查询,值绑定方式) -->
    17     <select id="selsectByNameAndAge"  resultType="com.boom.pojo.User">
    18         select * from user where username = #{username} and userage = #{userage}
    19     </select>
    20 
    21     <!-- 条件查询(map方式多个参数查询,将map的key绑定到占位符中) -->
    22     <select id="selsectByNameAndAgeMap" parameterType="map"  resultType="com.boom.pojo.User">
    23         select * from user where username = #{uname} and userage = #{uage}
    24     </select>
    25     
    26     <!-- selectMap 拿结果集的值作为map的key(key必须是结果集中存在的值) -->
    27     <select id="selsectByName" resultType="com.boom.pojo.User">
    28         select * from user
    29     </select>
    30     
    31     <!-- 添加操作 -->
    32     <insert id="insertUser" parameterType="com.boom.pojo.User" >
    33         insert into user(username,userage) values(#{username},#{userage})
    34     </insert>
    35     
    36     <!-- 更新 -->
    37     <update id="updateById">
    38         update user set username = #{username},userage = #{userage} where userid = #{userid}
    39     </update>
    40     
    41     <!-- 删除 -->
    42     <delete id="deleteById">
    43         delete from user where userid = #{userid}
    44     </delete>
    45     
    46 </mapper>
    User.xml

    数据库持久层

     1 package com.boom.dao;
     2 
     3 import java.util.List;
     4 import java.util.Map;
     5 
     6 import com.boom.pojo.User;
     7 
     8 public interface IUserDao {
     9     //根据ID查询单条的数据
    10     User selectById();
    11     
    12     //查询所有的数据分页显示
    13     List<User> selsectByAll();
    14     
    15     //条件查询(多个参数查询,值绑定方式)
    16     List<User> selsectByNameAndAge(User user);
    17     
    18     //条件查询(map方式多个参数查询,将map的key绑定到占位符中)
    19     List<User> selsectByNameAndAgeMap(Map<String, Object> map);
    20     
    21     //selectMap 拿结果集的值作为map的key(key必须是结果集中存在的值)
    22     List<User> selsectByName(String username);
    23     
    24     //添加操作
    25     void insertUser(User user);
    26     
    27     //更新
    28     void updateById(User user);
    29     
    30     //删除
    31     void deleteById(Integer userid);
    32 }
    dao interface
      1 package com.boom.dao.impl;
      2 
      3 import java.util.List;
      4 import java.util.Map;
      5 
      6 import org.apache.ibatis.session.RowBounds;
      7 import org.apache.ibatis.session.SqlSession;
      8 import org.apache.ibatis.session.SqlSessionFactory;
      9 
     10 import com.boom.dao.IUserDao;
     11 import com.boom.pojo.User;
     12 import com.boom.util.MybatisUtil;
     13 
     14 public class UserDaoImpl implements IUserDao {
     15 
     16     /**
     17      * 根据ID查询单条的数据
     18      */
     19     @Override
     20     public User selectById() {
     21         SqlSession session = MybatisUtil.openSession();
     22         return session.selectOne("selectById",4);
     23     }
     24 
     25     /**
     26      * 查询所有的数据分页显示
     27      */
     28     @Override
     29     public List<User> selsectByAll() {
     30         SqlSession session = MybatisUtil.openSession();
     31         //RowBounds(offset, limit)分页从下标0开始
     32         List<User> list = session.selectList("selsectByAll", null, new RowBounds(0,3));
     33         return list;
     34     }
     35 
     36     /**
     37      * 条件查询(多个参数查询,值绑定方式)
     38      */
     39     @Override
     40     public List<User> selsectByNameAndAge(User user) {
     41         SqlSession session = MybatisUtil.openSession();
     42         List<User> selectList = session.selectList("selsectByNameAndAge", user);
     43         return selectList;
     44     }
     45     
     46     /**
     47      * 条件查询(map方式多个参数查询,将map的key绑定到占位符中)
     48      */
     49     @Override
     50     public List<User> selsectByNameAndAgeMap(Map<String, Object> map) {
     51         SqlSession session = MybatisUtil.openSession();
     52         List<User> selectListMap = session.selectList("selsectByNameAndAgeMap", map);
     53         return selectListMap;
     54     }
     55 
     56     
     57     /**
     58      * selectMap 拿结果集的值作为map的key(key必须是结果集中存在的值)
     59      */
     60     @Override
     61     public List<User> selsectByName(String username) {
     62         SqlSession session = MybatisUtil.openSession();
     63         Map<String, Object> selectMap = session.selectMap("selsectByName", "username");
     64         System.out.println(selectMap);
     65         return null;
     66     }
     67 
     68     /**
     69      * 添加操作
     70      */
     71     @Override
     72     public void insertUser(User user) {
     73         SqlSession session = MybatisUtil.openSession();
     74         session.insert("insertUser", user);
     75         //手动提交事务
     76         session.commit();
     77     }
     78 
     79     /**
     80      * 更新
     81      */
     82     @Override
     83     public void updateById(User user) {
     84         SqlSession session = MybatisUtil.openSession();
     85         session.update("updateById", user);
     86         session.commit();
     87     }
     88 
     89     /**
     90      * 删除
     91      */
     92     @Override
     93     public void deleteById(Integer userid) {
     94         SqlSession session = MybatisUtil.openSession();
     95         session.delete("deleteById", userid);
     96         session.commit();
     97     }
     98     
     99     
    100 }
    dao implements

    工具类

     1 package com.boom.util;
     2 
     3 import java.io.InputStream;
     4 
     5 import org.apache.ibatis.io.Resources;
     6 import org.apache.ibatis.session.SqlSession;
     7 import org.apache.ibatis.session.SqlSessionFactory;
     8 import org.apache.ibatis.session.SqlSessionFactoryBuilder;
     9 
    10 public class MybatisUtil {
    11     private static SqlSessionFactory factory = null;
    12     static{
    13         try {
    14             if(factory == null){
    15                 //通过工具类加载配置文件,返回读取配置文件的IO流
    16                 InputStream is = Resources.getResourceAsStream("mybatis-cfg.xml");
    17                 //SqlSessionFactoryBuilder创建SqlSessionFactory对象的构建器
    18                 factory = new SqlSessionFactoryBuilder().build(is);
    19             }
    20         } catch (Exception e) {
    21             e.printStackTrace();
    22         }
    23     }
    24     //获取mybatis上下文对象
    25     public static SqlSessionFactory getSqlSessionFactory(){
    26         return factory;
    27     }
    28     //获取SqlSession
    29     public static SqlSession openSession(){
    30         return factory.openSession();
    31     }
    32 }
    View Code

    测试类

     1 package com.boom.test;
     2 
     3 import java.util.HashMap;
     4 import java.util.List;
     5 import java.util.Map;
     6 
     7 import com.boom.dao.IUserDao;
     8 import com.boom.dao.impl.UserDaoImpl;
     9 import com.boom.pojo.User;
    10 
    11 public class MybatisTest {
    12 
    13     public static void main(String[] args) {
    14         
    15         //根据ID查询单条的数据
    16         IUserDao ud = new UserDaoImpl();
    17         System.out.println(ud.selectById());
    18 
    19         
    20         /*
    21         // 查询所有的数据分页显示
    22         IUserDao ud = new UserDaoImpl();
    23         List<User> userList = ud.selsectByAll();
    24         for (int i = 0; i < userList.size(); i++) {
    25             System.out.println(userList.get(i));
    26         }
    27         */
    28         
    29         /*
    30         //条件查询(多个参数查询)
    31         IUserDao ud = new UserDaoImpl();
    32         //创建User对象
    33         User u = new User();
    34         //将参数绑定通过user对象传递
    35         u.setUsername("张三");
    36         u.setUserage(18);
    37         List<User> userList = ud.selsectByNameAndAge(u);
    38         System.out.println(userList);
    39         */
    40         
    41         /*
    42         //条件查询(map方式多个参数查询,将map的key绑定到占位符中)
    43         IUserDao ud = new UserDaoImpl();
    44         //创建map对象
    45         Map<String , Object> map = new HashMap<>();
    46         map.put("uname", "张三");
    47         map.put("uage", 18);
    48         List<User> userList = ud.selsectByNameAndAgeMap(map);
    49         System.out.println(userList);
    50         */
    51         
    52         /*
    53         //selectMap 拿结果集的值作为map的key(key必须是结果集中存在的值)
    54         IUserDao ud = new UserDaoImpl();
    55         ud.selsectByName(null);
    56         */
    57         
    58         /*
    59         //添加
    60         IUserDao ud = new UserDaoImpl();
    61         //创建User对象
    62         User u = new User();
    63         u.setUsername("新增测试");
    64         u.setUserage(100);
    65         ud.insertUser(u);
    66         */
    67         
    68         /*
    69         //更新
    70         IUserDao ud = new UserDaoImpl();
    71         //创建User对象
    72         User u = new User();
    73         u.setUserid(9);
    74         u.setUsername("更新测试");
    75         u.setUserage(102);
    76         ud.updateById(u);
    77         */
    78         
    79         /*
    80         //删除
    81         IUserDao ud = new UserDaoImpl();
    82         ud.deleteById(5);
    83         */
    84         
    85     }  
    86 
    87 }
    MybatisTest

    总体架构图

  • 相关阅读:
    proxool数据库连接池用法
    SQL Server 用链接server 同步MySQL
    使用DNSCrypt解决Dropbox污染问题
    POJ 1952 BUY LOW, BUY LOWER DP记录数据
    使用doxygen为C/C++程序生成中文文档
    构造器(二)----指定构造器、便利构造器
    Spring Boot 部署与服务配置
    排序算法c语言描述---冒泡排序
    【转】Android Studio系列教程一--下载与安装
    【转】Windows环境下Android Studio v1.0安装教程
  • 原文地址:https://www.cnblogs.com/cao-yin/p/10376706.html
Copyright © 2011-2022 走看看