Mybatis,dao层开发

1.全局配置文件 sqlMapConfig.xml
<configuration>中
    (1)properties    获取属性文件
    (2)settings      开启二级缓存,延时加载
    (3)typeAliases   为类起别名,或者为包中的所有类起别名
    (4)environments   配置环境相关的 数据源、事务管理等
    (5)mappers        配置映射文件
   //类别名    sqlMapConfig.xml
    <properties resource="jdbcConfig.properties"></properties>
    <typeAliases>
      <!--  为单个pojo起别名
         <typeAlias type="com.edu.pojos.User" alias="userInfo"/>
      -->
      <package name="com.edu.pojos"/> <!--为包下所有pojo类起别名,别名默认为pojo类首字母小写  -->
    </typeAliases>
    //映射文件 User.xml 
    <mapper  namespace="tt" >
      <select id="getUserById" parameterType="int" resultType="user">
            select * from user where uid=#{uid}
      </select>
    </mapper>
2.映射文件  User.xml 
   <mapper>中
     (1)cache   缓存
     (2)select,update,insert ,delete元素
     (3)sql片段
3.核心接口和对象
    对象:SqlSessionFactoryBuilder  作用:负责构建SqlSessionFactory对象,采用建造者模式
                    调用build()方法,创建出 SqlSessionFactory对象后,自身失效。          
    接口:SqlSessionFactory   核心 作用:创建SqlSession对象
                    调用 openSession()方法,整个应用有效 (运行代码到关闭服务期间)
          SqlSession 作用:数据库操作 (线程不安全的),所有使用时不要设置成员属性,建议在方法中使用
                         生命周期:一次会话(一次数据库交互)      
                     常用方法 selectOne()  selectList()  selectMap()  
                              insert()  update()  delete()  commit()
                              close() 
    //测试      
         

   public class TestJunit1 {
            private SqlSessionFactory factory;
            @Before
            public void initFactory() throws IOException{
                InputStream in=Resources.getResourceAsStream("sqlMappingConfig.xml");
                factory=new SqlSessionFactoryBuilder().build(in);
            }
            

            @Test
            public void select() {
                SqlSession session=factory.openSession();
                User user=session.selectOne("tt.getUserById", 9);
                System.out.println(user);
            }

        }


4.dao层开发
    (1)传统的方式 
    

   //接口IUserDao
       public interface IUserDao {
             public User getUserById(int id);
             public List<User> getUserByName(String name);
             public List<User> getAllUsers();
             public int addUser(User user);
             public int updateUser(User user);
             public int deleteUserById(int id);
             
        }
     //实现类
     public class UserDaoImpl implements IUserDao{
        private SqlSessionFactory factory;  
        public UserDaoImpl(SqlSessionFactory factory){ //由外部注入
            this.factory=factory; 
        }
        //通过id查询用户
        public User getUserById(int id) {
            SqlSession session=factory.openSession();
            User user=session.selectOne("tt.getUserById",id);
            session.close();
            return user;
        }

        //根据姓名模糊查询用户
        public List<User> getUserByName(String name) {
            SqlSession session=factory.openSession();
            List<User> list=session.selectList("tt.getUserByName",name);
            session.close();
            return list;
        }

         //查询所有用户
        public List<User> getAllUsers() {
            SqlSession session=factory.openSession();
            List<User> list=session.selectList("tt.getUsers");
            session.close();
            return list;
        }

        //添加用户
        public int addUser(User user) {
            SqlSession session=factory.openSession();
            int res=session.insert("tt.addUser",user);
            session.commit();
            session.close();
            return res;
        }
        //修改用户
        public int updateUser(User user) {
            SqlSession session=factory.openSession();
            int res=session.update("tt.udateUser",user);
            session.commit();
            session.close();
            return res;
        }
       //删除用户
        public int deleteUserById(int id) {
            SqlSession session=factory.openSession();
            int res=session.delete("tt.delUser",id);
            session.commit();
            session.close();
            return res;
        }

    }


    //测试
  

  public class Test {
          public static void main(String[] args) throws IOException {
        
        InputStream in=Resources.getResourceAsStream("sqlMappingConfig.xml");
        SqlSessionFactory fac=new SqlSessionFactoryBuilder().build(in);
        IUserDao dao=new UserDaoImpl(fac);
        User user=dao.getUserById(9);
        System.out.println(user);
     }
    }


附:log4j:log for java,用于 日志信息输出,记录
(1)导包
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-log4j12</artifactId>
        <version>1.7.2</version>
    </dependency> 
(2)配置log4j属性文件  log4j.properties
        # Global logging configuration
        #\u5728\u5f00\u53d1\u73af\u5883\u4e0b\u65e5\u5fd7\u7ea7\u522b\u8981\u8bbe\u7f6e\u6210DEBUG\uff0c\u751f\u4ea7\u73af\u5883\u8bbe\u7f6e\u6210info\u6216error
        log4j.rootLogger=DEBUG, stdout
        # Console output...
        log4j.appender.stdout=org.apache.log4j.ConsoleAppender
        log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
        log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n
   
   (2)dao层mapper代理方式
        只需要接口,映射文件
        务必遵守以下规则
        (1)映射文件命名空间namespace值和接口的包名相同
        (2)接口中方法名和映射文件中sql的id名相同
        (2)接口中方法的参数类型要和sql中的parameterType相同
                       返回值类型和sql中的resultType相同
    //接口                   
    public interface IUserMapper {
        public User getUserById(int id);
        public int deleteUserById(int id);
    }
    //映射文件UserMapper.xml
    <mapper  namespace="com.edu.mapper.IUserMapper" >
          <select id="getUserById" parameterType="int" resultType="user">
                select * from user where uid=#{uid}
          </select>
          
         <delete id="deleteUserById" parameterType="int" >
              delete from user where uid=#{uid}
         </delete>  
    </mapper>    
    //全局配置文件 
    <mappers>
        <mapper resource="sqlmapper/UserMapper.xml"/>
    </mappers>    
    //测试类
        public static void main(String[] args) throws IOException {
        InputStream in=Resources.getResourceAsStream("sqlMappingConfig.xml");
        SqlSessionFactory fac=new SqlSessionFactoryBuilder().build(in);
        SqlSession session=fac.openSession();
        //创建mapper对象
        IUserMapper dao=session.getMapper(IUserMapper.class);
        User user=dao.getUserById(3);
        System.out.println(user);
    }
5。自增主键
    (1)主键是int 自动增长
         insert into user(username,password,age) values('qqq','123',17);
         select LAST_INSERT_ID()
         
         
      <insert id="addUser" parameterType="user">
         <selectKey order="AFTER" keyColumn="uid" keyProperty="uid" resultType="int">
              select LAST_INSERT_ID()
         </selectKey>
          insert into user(username,password,age) values(#{username},#{password},#{age});
     </insert>
     
     //此处order值只能是AFTER ,因为插入后,才能得到自增长值
     
     //测试类
      

   User u=new User();
        u.setUsername("利奇马");
        u.setPassword("1234");
        u.setAge(18);
        
        IUserMapper dao=session.getMapper(IUserMapper.class);
        int i=dao.addUser(u);
        session.commit();
        System.out.println("受影响行数"+i);
        System.out.println("自增长主键值"+u.getUid());
         session.close();


     
     (2)主键是varchar   36位uuid   (32数字加字母 4位-)
          select uuid()
      
       <insert id="addUser2" parameterType="user2">
         <selectKey order="BEFORE" keyColumn="uid" keyProperty="uid" resultType="string">
              select uuid()
         </selectKey>
          insert into user_copy(uid,username,password,age) values(#{uid},#{username},#{password},#{age});
     </insert>
     
     //此处 order="BEFORE" 在插入之前先生成uuid  ,  resultType="string" 
     // 主键列 必须insert
     
6.逆向工程
      根据数据库中的表,反向生成java中的pojo类,映射文件,映射接口
    (1)java工程,导包
        mybatis-generator-core-1.3.2.jar
        mysql-connector-java-5.1.28-bin.jar
    (2)逆向配置文件
       <?xml version="1.0" encoding="UTF-8"?>
        <!DOCTYPE generatorConfiguration
          PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
          "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">

        <generatorConfiguration>
            <context id="testTables" targetRuntime="MyBatis3">
                <commentGenerator>
                    <!-- 是否去除自动生成的注释 true:是 : false:否 -->
                    <property name="suppressAllComments" value="true" />
                </commentGenerator>
                <!--数据库连接的信息:驱动类、连接地址、用户名、密码 -->
                 <jdbcConnection driverClass="com.mysql.jdbc.Driver"
                    connectionURL="jdbc:mysql://localhost:3306/mybatis" userId="root"
                    password="root">
                </jdbcConnection> 
        <!--          <jdbcConnection driverClass="oracle.jdbc.OracleDriver"
                    connectionURL="jdbc:oracle:thin:@10.10.21.3:1521:orcl" 
                    userId="scott"
                    password="tiger">
                </jdbcConnection>  -->

                <!-- 默认false,把JDBC DECIMAL 和 NUMERIC 类型解析为 Integer,为 true时把JDBC DECIMAL 和 
                    NUMERIC 类型解析为java.math.BigDecimal -->
                <javaTypeResolver>
                    <property name="forceBigDecimals" value="false" />
                </javaTypeResolver>

                <!-- targetProject:生成PO类的位置 -->
                <javaModelGenerator targetPackage="com.neuedu.pojo"
                    targetProject=".\src">
                    <!-- enableSubPackages:是否让schema作为包的后缀 -->
                    <property name="enableSubPackages" value="false" />
                    <!-- 从数据库返回的值被清理前后的空格 -->
                    <property name="trimStrings" value="true" />
                </javaModelGenerator>
                <!-- targetProject:mapper映射文件生成的位置 -->
                <sqlMapGenerator targetPackage="com.neuedu.mapper" 
                    targetProject=".\src">
                    <!-- enableSubPackages:是否让schema作为包的后缀 -->
                    <property name="enableSubPackages" value="false" />
                </sqlMapGenerator>
                <!-- targetPackage:mapper接口生成的位置 -->
                <javaClientGenerator type="XMLMAPPER"
                    targetPackage="com.neuedu.mapper" 
                    targetProject=".\src">
                    <!-- enableSubPackages:是否让schema作为包的后缀 -->
                    <property name="enableSubPackages" value="false" />
                </javaClientGenerator>
                <!-- 指定数据库表 -->
                
                <table tableName="T_USER" domainObjectName="User"
                 enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false"    
                       enableSelectByExample="false" selectByExampleQueryId="false" >
                       <columnOverride column="id" javaType="Integer" />
                 </table>
                
            </context>
        </generatorConfiguration>
     
     (3)生成类
        

   public class GeneratorSqlmap {

            public void generator() throws Exception{
                List<String> warnings = new ArrayList<String>();
                boolean overwrite = true;
                //指定 逆向工程配置文件
                File configFile = new File("generatorConfig.xml"); 
                ConfigurationParser cp = new ConfigurationParser(warnings);
                Configuration config = cp.parseConfiguration(configFile);
                DefaultShellCallback callback = new DefaultShellCallback(overwrite);
                MyBatisGenerator myBatisGenerator = new MyBatisGenerator(config,
                        callback, warnings);
                myBatisGenerator.generate(null);

            } 
            public static void main(String[] args) throws Exception {
                try {
                    GeneratorSqlmap generatorSqlmap = new GeneratorSqlmap();
                    generatorSqlmap.generator();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }     


7.输入输出类型
          解决列名和属性名不一致问题(当数据库表中的列名 和实体类的属性对应关系,)
          (1)resultMap
          <resultMap id="BaseResultMap" type="com.neuedu.pojo.User" >
            <id column="id" property="id" jdbcType="INTEGER" />
            <result column="username" property="username" jdbcType="VARCHAR" />
            <result column="birthday" property="birthday" jdbcType="DATE" />
            <result column="address" property="address" jdbcType="VARCHAR" />
          </resultMap>
          
          <select id="selectByPrimaryKey" resultMap="BaseResultMap" parameterType="Integer" >
            select  id, username, birthday, address from t_user  where id = #{id,jdbcType=INTEGER}
          </select>
          
         (2)查询语句中起列别名
           <select id="selectByPrimaryKey" resultMap="BaseResultMap" parameterType="Integer" >
            select  id as uid, username as uname, birthday, address from t_user where id = #{uid,jdbcType=INTEGER}
          </select>
          
    (1)输入parameterType:    简单类型 ,pojo ,包装pojo ,hashmap
      <select id="getUserById_map" parameterType="java.util.HashMap" resultType="user">
            select * from user where uid=#{id}
      </select>
      
        HashMap map=new HashMap();
        map.put("id", 41);
        User user=dao.getUserById_map(map);
        System.out.println(user);
        
    (2) 输出类型 resultType:简单类型 ,pojo ,包装pojo 
                 resultMap: map
                 
      <select id="user_login" parameterType="user" resultMap="aa">
           select * from user where username=#{username}  and password=#{password}
      </select>
      
      <resultMap type="user" id="aa">
            <id column="uid" property="uid"/>
            <result column="username" property="username"/>
             <result column="password" property="password"/>
      </resultMap>
               
    //接口中方法
       public User user_login(User user);         
    //测试    
    
        User user=new User();
        user.setUsername("中国人");
        user.setPassword("qaz");
        
        User res=dao.user_login(user);
        System.out.println(res);
        
        
        
     <select id="user_login2" parameterType="user" resultMap="bb">
           select * from user where username=#{username}  and password=#{password}
      </select>
      <resultMap type="UserResultMapPojo" id="bb">
            <id column="uid" property="map.value.uid"/>
            <result column="username" property="map.value.username"/>
             <result column="password" property="map.value.password"/>
      </resultMap>
        // 此处的map是包装pojo类的成员可以自定义 ,value取map集合的值固定的
      //包装pojo
    

  public class UserResultMapPojo {
        private Map<String,User> map;

        public Map<String, User> getMap() {
            return map;
        }
        public void setMap(Map<String, User> map) {
            this.map = map;
        }
    }


    
    //接口中方法
  

    public UserResultMapPojo user_login2(User user);
      
     //测试
        User user=new User();
        user.setUsername("中国人");
        user.setPassword("qaz");
        
        UserResultMapPojo res=dao.user_login2(user);
        System.out.println(res.getMap());


    
                 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值